AI Disclosure Object
Declares whether a campaign item's media is AI-generated or AI-modified. The ai_disclosure object is an optional field on a campaign item and, where applicable, on individual carousel cards. Taboola uses its value to render the required user-facing AI-content label on downstream surfaces where AI-content disclosure laws apply (for example, the EU AI Act, effective 2 August 2026, and comparable jurisdictions as they come online).
Taboola preserves and transmits the disclosure signal to downstream partners (API publishers, publishers, and RTB integrations), so the label is rendered consistently with the advertiser's declaration.
Object structure
| Name | Modifier & Defaults | Type | Description |
|---|---|---|---|
status | Required when ai_disclosure is present | String (enum) Possible values:
| The AI-content verdict for the item's media. See Status values. |
To retrieve the current list of allowed values at runtime, call the Dictionary endpoint
GET /backstage/api/1.0/resourcesand read theai_disclosure_statusresource. This is recommended for integrations that render these values in a UI.
Status values
| Value | Meaning |
|---|---|
AI_GENERATED | One or more assets in the item were created or substantially modified by generative AI. This is the only value that persists a disclosure, and it drives the AI label. |
NOT_AI_GENERATED | No assets in the item are AI-generated or AI-modified. Sending this value records no disclosure, and clears any existing one, so there is nothing to label. |
Behavior
Create
- If
ai_disclosureis omitted, the item is created with no disclosure. AI_GENERATEDrecords the disclosure. The item reads back withai_disclosure.statusset toAI_GENERATED.NOT_AI_GENERATEDstores no disclosure, because there is nothing to label. The item is created with noai_disclosureand reads backnull. SendNOT_AI_GENERATEDto affirm "no AI content"; it does not persist a stored value.
Update
- Omitting the
ai_disclosurefield is a no-op. It does not clear an existing disclosure. AI_GENERATEDsets or replaces the disclosure.NOT_AI_GENERATEDclears any existing disclosure; the item reads backnullafterward. This is how a disclosure made through the API is un-set.- Re-sending the item's current value is a no-op.
Creative Library ads
A campaign item created from a Creative Library creative (a copy of a library creative) does not own its ai_disclosure; the linked creative does. Changing ai_disclosure directly on such an ad, by single or bulk update, is rejected with HTTP 400:
This ad is part of a creative, please edit the creative to update
ai_disclosure
Update ai_disclosure on the creative instead; the change propagates to every ad linked to it. Standalone ads (not created from a library creative) set and change their own ai_disclosure normally. Re-sending the ad's current value, or omitting the field, is not rejected.
Read (GET)
- The
ai_disclosureobject is returned only when a disclosure has been recorded (that is,AI_GENERATED). - When nothing has been disclosed, including items sent as
NOT_AI_GENERATED, the field is returned asnull(or omitted).
Carousel items
For carousel campaign items, set ai_disclosure on each hierarchy_children[] card individually, not on the parent item. Each card's declaration is independent and drives labeling for that card.
Examples
Declaring AI-generated content on create
{
"url": "https://advertiser.example.com/landing",
"title": "Watch all your favorite channels in one place",
"ai_disclosure": {
"status": "AI_GENERATED"
}
}Declaring not-AI-generated (records no disclosure)
{
"url": "https://advertiser.example.com/landing",
"title": "Watch all your favorite channels in one place",
"ai_disclosure": {
"status": "NOT_AI_GENERATED"
}
}The item is stored with no disclosure and reads back with ai_disclosure: null. On update, the same request clears an existing AI_GENERATED disclosure.
Reading an item with no disclosure
{
"id": "1234567891",
"url": "https://advertiser.example.com/landing",
"ai_disclosure": null
}Creative Library ad: disclosure edit is rejected
Updating ai_disclosure on an ad created from a library creative is rejected:
POST /backstage/api/1.0/{account_id}/campaigns/{campaign_id}/items/{item_id}{
"ai_disclosure": {
"status": "AI_GENERATED"
}
}{
"http_status": 400,
"message": "This ad is part of a creative, please edit the creative to update ai_disclosure",
"offending_field": "ai_disclosure"
}Carousel: per-card declaration
{
"url": "https://advertiser.example.com/landing",
"hierarchy_children": [
{
"title": "Card 1 - human-shot photo",
"ai_disclosure": {
"status": "NOT_AI_GENERATED"
}
},
{
"title": "Card 2 - AI-generated illustration",
"ai_disclosure": {
"status": "AI_GENERATED"
}
}
]
}Errors
Validation rejections return HTTP 400.
| Condition | Error message |
|---|---|
ai_disclosure is present but status is missing or null (offending_field: ai_disclosure.status) | Missing required field |
Unknown value supplied for status | Enum validation error |
ai_disclosure changed on a Creative Library-linked ad, by single or bulk update (offending_field: ai_disclosure) | This ad is part of a creative, please edit the creative to update ai_disclosure |
Endpoints supporting ai_disclosure
ai_disclosureThe ai_disclosure object is accepted on requests to, and returned on responses from, the campaign item endpoints:
POST /backstage/api/1.0/{account_id}/campaigns/{campaign_id}/items # Create a campaign item
POST /backstage/api/1.0/{account_id}/campaigns/{campaign_id}/items/{item_id} # Update a campaign item
POST /backstage/api/1.0/{account_id}/items/bulk # Bulk update campaign items
GET /backstage/api/1.0/{account_id}/campaigns/{campaign_id}/items/{item_id} # Get a campaign item
GET /backstage/api/1.0/{account_id}/campaigns/{campaign_id}/items # List campaign itemsFor bulk update, send ai_disclosure on baseline_item; it applies to every id in items_to_update, and the Creative Library ownership rule above is enforced per item.
Reference pages: Create a campaign item, Update a campaign item, Bulk update items, Get a campaign item, List campaign items.
The object is also accepted on the equivalent Creative Library endpoints, and on any endpoint that accepts or returns a campaign item payload.
Backwards compatibility
- The
ai_disclosurefield is optional. Existing integrations that do not send it continue to function unchanged. - Items created before this feature are returned with
ai_disclosure: nullon read (no disclosure recorded). - Existing integrations that do not read the field are unaffected.
- Updating
ai_disclosureon a Creative Library-linked ad now returns HTTP 400 (edit the creative instead; see Creative Library ads). Integrations that edit disclosure on the campaign-items surface for library-linked ads should move that edit to the creative.
Any integration that creates or updates campaign items in markets subject to AI-content disclosure laws should populate
ai_disclosurewith an explicit status.
When advertisers must declare
The obligation to accurately declare AI-generated content sits with the advertiser as the Deployer under applicable transparency regulations (for example, EU AI Act Article 50(4)). Taboola's role is to preserve and propagate the declared signal.
Content that must be declared as AI_GENERATED includes, but is not limited to, any image, video, audio, or text in the item that was:
- Created from scratch by a generative AI tool (for example, Midjourney, DALL·E, Stable Diffusion, Adobe Firefly, OpenAI Sora, Runway, Veo, or ElevenLabs).
- Substantially edited or transformed by AI (for example, face-swap, voice clone, Generative Fill that alters key visual elements, or AI translation and dubbing).
- Generated text on matters of public interest (health, elections, news).
Minor enhancements such as automatic upscaling, denoising, sharpening, or color correction are not in scope, and should be declared as NOT_AI_GENERATED (or left undisclosed).
For advertiser-facing guidance, see the Help Center article Declare AI-generated content in your ads.
Related references
Updated 16 days ago
