Skip to content

AI content

Every file that reaches Fangate is classified: is it AI-generated, and if so, whom does it depict? The answer is given once per file by whoever uploads it, it decides how the file is moderated, whether consent is needed, where the product is sold and what buyers are told. This page explains the four values, how integrations send them, and what follows from each.

Applies to the Media Library, Upload Sessions and Products endpoints.


The four values

Field: ai_origin. Exactly one value per file.

ValueMeaningExample
noneNot AI. A photo or video of real people, made with a camera.A selfie, a studio shoot.
syntheticFully AI-generated. No real person is depicted or used as a base.A character created from a text prompt.
real_person_selfAI-generated or AI-modified from the uploader's own likeness.The creator's own face on a generated body, an AI edit of the creator's photo.
real_person_otherAI-generated or AI-modified from another real person's likeness.A collaborator's face used as a base, an AI edit of somebody else's photo.

Not sure between real_person_self and real_person_other? Ask whose face, body or voice the AI started from. If it is anyone but the account owner, it is real_person_other.

The attestation

Every AI value (synthetic, real_person_self, real_person_other) must be sent together with "ai_attested": true - on the upload session or on the create call; a session that carries it covers the call, even when the call repeats ai_origin. It is the uploader's statement that they hold the rights to the material and, for a derivative of another person, that person's consent. Without it the file is refused (422, code ai_attestation_required). none needs no attestation.

The attestation is stored on the file together with the version of the wording that was confirmed, so a later change of the wording never applies backwards to older uploads.


When the value is required

The value is required at the moment a new file is created:

  • POST /api/media (a library upload), and
  • POST /api/products with upload_session_id or with a direct media file.

It can be sent either when the upload session is created (POST /api/upload-sessions, or defaults.ai_origin on POST /api/media/bulk) or on the call above. A value on the call wins over the value on the session. If neither carries it, the call is refused with 422 and code ai_origin_required.

Not required:

  • POST /api/products with media_ids - those library files carry their value already. Two kinds of file have none yet: cloud imports whose review dialog in the app was not answered, and files from before the AI feature. Such a file reports ai_classified: false (with ai_origin: none) in GET /api/media, counts as non-AI while it is unclassified, and the product flag follows automatically once it is classified (in the app or via PATCH /api/media/{media}/ai-origin);
  • every read, edit, price, link, folder or consent call - nothing new is created there.

Which callers are asked

CallerRequired?
Generated API key with Manage content created since this release (upload_ai_content: true on creation)Yes, on every new file.
Generated API key with Manage content created before this releaseNot yet. Files uploaded without the value count as none. Such keys are switched over at a date that will be announced in the changelog (not scheduled yet); after that they are treated like new keys.
Read-only or analytics keysNever - they cannot upload.
The Fangate dashboardAlways asks before every upload (the answer travels with the session).

Recommendation for every integration, old key or new: always send ai_origin, also none. It costs nothing and removes the cut-over from your calendar.


What follows from the value

Moderation. none files run through the standard moderation, which rejects AI imagery. AI files run through the AI ruleset. A file declared none that is in fact AI-generated ends up rejected; declare it correctly instead. synthetic files skip the people check (there is nobody to count).

Consent. Only real_person_other starts the consent workflow: the file is marked is_should_consent and stays unsellable until the depicted person has been tagged and has accepted (see Consent & Adult Content and the vault guide). synthetic depicts nobody, real_person_self is covered by the uploader's own attestation.

The product. A product with at least one AI file is an AI product (is_ai_content: true on the product resource), however many none files sit next to it. AI products are sold on Fangate's AI domain: the sales link points there, the checkout offers the payment providers of that domain, and telegram_link opens the checkout in a second Mini App of the same bot that serves all products, running on the AI domain (null when no bot is configured). While Fangate's platform-wide AI switch is off, AI products report is_accessible: false with purchase_block_code: ai_rail_unavailable.

Buyers see a disclosure on AI products: AI generated for synthetic, AI modified for the two real-person values (ai_label on the media and product resources).


Correcting a value

PATCH /api/media/{media}/ai-origin

json
{ "ai_origin": "synthetic", "ai_attested": true, "reason": "was uploaded as not AI by mistake" }

The change is versioned and audited, the file goes back through moderation under the matching ruleset, and the product flag follows. One exception: a file uploaded before the AI feature that was never classified and is now set to none is only stamped, not moderated again - it was judged under the standard ruleset already. Correcting to an AI value needs ai_attested: true (422, code ai_attestation_required, message Confirm the AI content declaration before changing the origin.); correcting back to none does not. Fangate admins can correct a value as well.

Rate limit: 60 requests per minute per account.


For CRM and tool vendors: how to collect the answer

How your product obtains the value is your design decision - ask per file, ask per batch, or let the creator set a default in your settings ("everything I upload is fully synthetic"). Two things are not yours to decide:

  1. The attestation is the creator's statement, not your program's. It has to be shown to and confirmed by the creator - once, as a setting they accept, is fine. Never set ai_attested: true without the creator having agreed to the declaration.
  2. The values have consequences. synthetic means "no real person": it switches off the people check and never asks for consent. A default of "everything is synthetic" on files that depict real people is a false declaration - it hides exactly the cases the consent workflow exists for. If in doubt, ask per file, or default to real_person_self / real_person_other where a person is involved.

Misdeclared files can be corrected (see above), by the creator or by Fangate.


Errors

HTTPerrors_codeerrors_messageWhen
422ai_origin_requiredai_origin is required for this API key: send none, synthetic, real_person_self or real_person_other (plus ai_attested: true for the AI values), either when creating the upload session or on this call.A key that must classify sent no value, and the session has none.
422ai_attestation_requiredConfirm the AI content declaration before uploading.An AI value without ai_attested: true.
422-The selected ai origin is invalid.A value outside the four.

errors_code is an additive field on the standard envelope (see Error Handling).


Fangate backend developer documentation