Delivery

What arrives at your endpoint, and what to answer. Every push shares one envelope; only data changes.

The envelope

Every delivery arrives in this shape, whichever subscription sent it. Read type to tell them apart and data for the payload; the sections below document what data holds for each one. delivery_mode says whether the rows travel in the body (inline) or behind a signed link (manifest).

Delivery

idType: string

Unique id of this delivery attempt, stable across retries of the same push.

typeType: string

Event type. <resource>.snapshot for scheduled snapshots (content.snapshot, creator.snapshot), or the event name for event pushes (creator_vetting.completed).

subscription_idType: string

Id of the subscription that produced this push.

delivered_atType: integer

Unix epoch seconds at which Zelf sent this push.

livemodeType: boolean

true for production data; false for test deliveries.

resourceType: stringor null

Resource the push covers (content or creator) for snapshots; null for event pushes.

resource_filtersType: any

The subscription's stored filters that scoped this snapshot, using the same query params as the matching list operation (content.list or creators.list). Empty for event pushes.

delivery_modeType: enum

manifest: data.files holds downloadable snapshot files. inline: data.items holds the rows directly.

Show values
manifestinline
dataType: WebhookData

The push payload. See delivery_mode for which key inside is populated.

Show child attributes
data.item_countType: integerminimum 0

Total number of rows in this delivery, summed across files or equal to the length of items.

minimum
0
data.statisticsType: any

Aggregate totals over the snapshot, including post count, views, engagement, earned media value, and unique creators. Present only on content.snapshot; absent for creator and event pushes.

data.filesType: WebhookFile[]

Manifest mode only. The downloadable snapshot files; retrieve each download_url and stream the NDJSON rows. Absent in inline mode.

Show child attributes
data.files[].formatType: string

File encoding. Always ndjson (newline-delimited JSON, with one row per line).

data.files[].expires_atType: integer

Unix epoch seconds after which download_url stops working. Fetch the file before this time.

data.files[].sha256Type: string

Hex SHA-256 of the file body. Use it to verify the download.

data.files[].size_bytesType: integerminimum 0

Size of the file in bytes.

minimum
0
data.files[].item_countType: integerminimum 0

Number of rows in this file.

minimum
0
data.files[].download_urlType: string(uri)

Signed, time-limited URL from which to retrieve the file. Expires at expires_at.

data.itemsType: any[]

Inline mode only. The delivered rows themselves, in the same shape returned by the matching REST endpoint. Absent in manifest mode.

One file, in manifest mode

formatType: string

File encoding. Always ndjson (newline-delimited JSON, with one row per line).

expires_atType: integer

Unix epoch seconds after which download_url stops working. Fetch the file before this time.

sha256Type: string

Hex SHA-256 of the file body. Use it to verify the download.

size_bytesType: integerminimum 0

Size of the file in bytes.

minimum
0
item_countType: integerminimum 0

Number of rows in this file.

minimum
0
download_urlType: string(uri)

Signed, time-limited URL from which to retrieve the file. Expires at expires_at.

Snapshots

content.snapshot

POSTyour endpointSnapshot

Scheduled snapshot of the content set that a subscription matches.

The subscription's resource_filters use the same query params as content.list, including ordering: rows are ordered by posted_at descending by default (override with an order_by in resource_filters). The snapshot is capped at the subscription's max_items (or the maximum when it is unset or 0); a test dispatch always sends a small 10-row sample regardless of max_items.

Delivered in manifest mode: data.files holds one signed, time-limited NDJSON download, and data.statistics carries the aggregate totals over the snapshot. resource is content.

Payload Zelf POSTs to the registered endpoint:

Payload

idType: string

Unique id of this delivery attempt, stable across retries of the same push.

typeType: string

Event type. <resource>.snapshot for scheduled snapshots (content.snapshot, creator.snapshot), or the event name for event pushes (creator_vetting.completed).

subscription_idType: string

Id of the subscription that produced this push.

delivered_atType: integer

Unix epoch seconds at which Zelf sent this push.

livemodeType: boolean

true for production data; false for test deliveries.

resourceType: stringor null

Resource the push covers (content or creator) for snapshots; null for event pushes.

resource_filtersType: any

The subscription's stored filters that scoped this snapshot, using the same query params as the matching list operation (content.list or creators.list). Empty for event pushes.

delivery_modeType: enum

manifest: data.files holds downloadable snapshot files. inline: data.items holds the rows directly.

Show values
manifestinline
dataType: WebhookData

The push payload. See delivery_mode for which key inside is populated.

Show child attributes
data.item_countType: integerminimum 0

Total number of rows in this delivery, summed across files or equal to the length of items.

minimum
0
data.statisticsType: any

Aggregate totals over the snapshot, including post count, views, engagement, earned media value, and unique creators. Present only on content.snapshot; absent for creator and event pushes.

data.filesType: WebhookFile[]

Manifest mode only. The downloadable snapshot files; retrieve each download_url and stream the NDJSON rows. Absent in inline mode.

Show child attributes
data.files[].formatType: string

File encoding. Always ndjson (newline-delimited JSON, with one row per line).

data.files[].expires_atType: integer

Unix epoch seconds after which download_url stops working. Fetch the file before this time.

data.files[].sha256Type: string

Hex SHA-256 of the file body. Use it to verify the download.

data.files[].size_bytesType: integerminimum 0

Size of the file in bytes.

minimum
0
data.files[].item_countType: integerminimum 0

Number of rows in this file.

minimum
0
data.files[].download_urlType: string(uri)

Signed, time-limited URL from which to retrieve the file. Expires at expires_at.

data.itemsType: any[]

Inline mode only. The delivered rows themselves, in the same shape returned by the matching REST endpoint. Absent in manifest mode.

File content schema

Each files[] entry is NDJSON: one Content per line, no commas, no wrapping array. Verify the published sha256 over the body before you read it.

NDJSON
{"id":"con_DZaWwnKo5HThZ9bu","platform_post_id":"7376543210987654321","platform":"instagram","content_form":"VIDEO","thumbnail_url":"https://cdn.hellozelf.com/thumbnails/zelfai-launch.png","posted_at":"2026-05-12T16:00:00Z","view_count":184230,"like_count":12840,"comment_count":932,"share_count":415,"total_engagement":14187,"language":"en","media_duration":42,"engagement_rate":0.077,"earned_media_value_cents":248000,"creator":{"id":"cr_pfqPv0FLsBRimHfi","username":"zelfai","name":"Zelf","platform":"instagram","platform_handle":"zelfai","platform_url":"https://www.instagram.com/zelfai","profile_picture_url":"https://cdn.hellozelf.com/avatars/zelfai.png","profile_bio":"Creator and content intelligence for modern brands.","follower_count":53120,"active_content_count":217},"brand_id":"brd_Lw6ZZmNYhW0P9k0x","net_promoter_score":1,"is_owned":true,"is_tagged":true,"is_influencer":true,"mention_type":"content","caption":"Behind the scenes at Zelf.","description":"How Zelf turns social signals into creator insights.","transcript":"We walk through how Zelf ranks creators by brand fit.","platform_url":"https://www.instagram.com/zelfai","last_keyword":"zelf creators","ai_summary":"A product walkthrough of Zelf creator analytics.","hashtags":["zelfai","creatoreconomy"]}
{"id":"con_DZaWwnKo5HThZ9bu","platform_post_id":"7376543210987654321","platform":"instagram","content_form":"VIDEO","thumbnail_url":"https://cdn.hellozelf.com/thumbnails/zelfai-launch.png","posted_at":"2026-05-12T16:00:00Z","view_count":184230,"like_count":12840,"comment_count":932,"share_count":415,"total_engagement":14187,"language":"en","media_duration":42,"engagement_rate":0.077,"earned_media_value_cents":248000,"creator":{"id":"cr_pfqPv0FLsBRimHfi","username":"zelfai","name":"Zelf","platform":"instagram","platform_handle":"zelfai","platform_url":"https://www.instagram.com/zelfai","profile_picture_url":"https://cdn.hellozelf.com/avatars/zelfai.png","profile_bio":"Creator and content intelligence for modern brands.","follower_count":53120,"active_content_count":217},"brand_id":"brd_Lw6ZZmNYhW0P9k0x","net_promoter_score":1,"is_owned":true,"is_tagged":true,"is_influencer":true,"mention_type":"content","caption":"Behind the scenes at Zelf.","description":"How Zelf turns social signals into creator insights.","transcript":"We walk through how Zelf ranks creators by brand fit.","platform_url":"https://www.instagram.com/zelfai","last_keyword":"zelf creators","ai_summary":"A product walkthrough of Zelf creator analytics.","hashtags":["zelfai","creatoreconomy"]}

One row: Content

idType: stringread-only

Unique identifier for this piece of content. Use it to retrieve the content anywhere a content id is accepted.

platform_post_idType: string

The post's identifier on its platform. This is the value at the end of the post's URL.

Examples:

  • Instagram: https://instagram.com/reel/abcd -> abcd
  • TikTok: https://www.tiktok.com/@username/video/12345678 -> 12345678
platformType: string

The platform the content was published on: instagram, tiktok or youtube.

content_formType: stringor null

Whether the content is a video or an image.

thumbnail_urlType: stringor null

URL of the content's thumbnail image.

posted_atType: string(date-time)or null

Time the content was originally published on its platform (UTC).

view_countType: integeror null

Total number of times the content has been viewed.

like_countType: integeror null

Total number of likes the content has received.

comment_countType: integeror null

Total number of comments on the content.

share_countType: integeror null

Total number of times the content has been shared.

total_engagementType: integeror null

Sum of the likes, comments, and shares the content has received.

languageType: stringor null

ISO 639 code of the content's primary language.

media_durationType: number(double)or null

Length of the media in seconds. Null when not known.

engagement_rateType: number(double)or nullread-only

Engagement per view (likes plus comments plus shares, divided by views). Null when the content has no recorded views.

earned_media_value_centsType: integeror nullread-only

Estimated marketing value of the content, in US cents.

creatorType: ContentCreatorread-only

The creator who published the content.

Show child attributes
creator.idType: stringread-only

Unique identifier for the creator.

creator.usernameType: stringor null

The creator's username or handle on the platform (without an @).

creator.nameType: stringor null

The creator's display name on the platform.

creator.platformType: stringor null

The platform the creator publishes on. One of instagram, tiktok, youtube.

creator.platform_handleType: stringor null

The platform-side identifier of the creator's account.

creator.platform_urlType: stringor null

Direct URL to the creator's profile on the platform.

creator.profile_picture_urlType: stringor null

URL of the creator's profile picture.

creator.profile_bioType: stringor null

The creator's profile bio as it appears on the platform.

creator.follower_countType: integeror null

The creator's follower count as of the most recent observation.

creator.active_content_countType: integeror null

Number of active content items attributed to the creator.

brand_idType: stringor nullread-only

Identifier of the brand that the brand-specific signals on this row (is_owned, is_tagged, is_influencer, mention_type, net_promoter_score) are scoped to. Returned as null when the request omits brand_id.

net_promoter_scoreType: integeror nullread-only

Net promoter score for the content from the perspective of the scoped brand. Returned as null when the request omits brand_id.

is_ownedType: booleanor nullread-only

Whether the scoped brand owns the content; that is, whether it was published by an account the brand controls. Returned as null when the request omits brand_id.

is_taggedType: booleanor nullread-only

Whether the post tags the scoped brand on the platform. Returned as null when the request omits brand_id.

is_influencerType: booleanor nullread-only

Whether the scoped brand counts the content as influencer content: it matches the brand's influencer terms, comes from an account on its influencer list, was reported as branded content by the platform, or was marked by hand. Content the brand owns is never influencer content. Returned as null when the request omits brand_id.

mention_typeType: stringor nullread-only

How the scoped brand is mentioned in the content. One of content or comment, or null when the brand is not mentioned. Returned as null when the request omits brand_id.

captionType: string

Short caption or title of the post (the primary user-visible text).

descriptionType: string

Long-form description of the post.

transcriptType: stringor null

Transcribed speech from the content's audio, when available.

platform_urlType: string

Direct URL to the post on its platform.

Examples:

  • https://instagram.com/reel/abcd
  • https://www.tiktok.com/@username/video/12345678
last_keywordType: stringor null

What the content was most recently collected under: a hashtag, a creator handle, a search term, or a brand identifier. Null when the content did not arrive through a collection task.

ai_summaryType: stringor null

Short AI-generated summary of the content.

hashtagsType: string[]

Hashtags used in the post, normalized to lowercase and without the leading #.

Acknowledgement

Return a 2xx status within the endpoint's timeout to acknowledge receipt. Any non-2xx status, or a timeout, is treated as a failed delivery and retried with backoff.

Delivery
{
  "id": "whd_8f2c1d4e9a",
  "type": "content.snapshot",
  "subscription_id": "whs_5Kq9Wd2pBxLm",
  "delivered_at": 1718000000,
  "livemode": true,
  "resource": "content",
  "resource_filters": {},
  "delivery_mode": "manifest",
  "data": {
    "item_count": 1,
    "statistics": {
      "post_count": 1280,
      "total_views": 4500000,
      "total_likes": 320000,
      "total_comments": 18000,
      "total_shares": 9500,
      "total_engagement": 14187,
      "total_earned_media_value_cents": 12500000,
      "total_media_duration": 53400,
      "engagement_rate": 0.077,
      "unique_creator_count": 412
    },
    "files": [
      {
        "format": "ndjson",
        "expires_at": 1718000000,
        "sha256": "9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08",
        "size_bytes": 184320,
        "item_count": 1280,
        "download_url": "https://storage.googleapis.com/zelf-webhook-snapshots/webhooks/whd_8f2c1d4e.ndjson?X-Goog-Signature=..."
      }
    ]
  }
}

creator.snapshot

POSTyour endpointSnapshot

Scheduled snapshot of the creator set that a subscription matches.

Delivered in manifest mode: data.files holds one signed, time-limited NDJSON download. Unlike content.snapshot, no data.statistics block is included. resource is creator.

Payload Zelf POSTs to the registered endpoint:

Payload

idType: string

Unique id of this delivery attempt, stable across retries of the same push.

typeType: string

Event type. <resource>.snapshot for scheduled snapshots (content.snapshot, creator.snapshot), or the event name for event pushes (creator_vetting.completed).

subscription_idType: string

Id of the subscription that produced this push.

delivered_atType: integer

Unix epoch seconds at which Zelf sent this push.

livemodeType: boolean

true for production data; false for test deliveries.

resourceType: stringor null

Resource the push covers (content or creator) for snapshots; null for event pushes.

resource_filtersType: any

The subscription's stored filters that scoped this snapshot, using the same query params as the matching list operation (content.list or creators.list). Empty for event pushes.

delivery_modeType: enum

manifest: data.files holds downloadable snapshot files. inline: data.items holds the rows directly.

Show values
manifestinline
dataType: WebhookData

The push payload. See delivery_mode for which key inside is populated.

Show child attributes
data.item_countType: integerminimum 0

Total number of rows in this delivery, summed across files or equal to the length of items.

minimum
0
data.statisticsType: any

Aggregate totals over the snapshot, including post count, views, engagement, earned media value, and unique creators. Present only on content.snapshot; absent for creator and event pushes.

data.filesType: WebhookFile[]

Manifest mode only. The downloadable snapshot files; retrieve each download_url and stream the NDJSON rows. Absent in inline mode.

Show child attributes
data.files[].formatType: string

File encoding. Always ndjson (newline-delimited JSON, with one row per line).

data.files[].expires_atType: integer

Unix epoch seconds after which download_url stops working. Fetch the file before this time.

data.files[].sha256Type: string

Hex SHA-256 of the file body. Use it to verify the download.

data.files[].size_bytesType: integerminimum 0

Size of the file in bytes.

minimum
0
data.files[].item_countType: integerminimum 0

Number of rows in this file.

minimum
0
data.files[].download_urlType: string(uri)

Signed, time-limited URL from which to retrieve the file. Expires at expires_at.

data.itemsType: any[]

Inline mode only. The delivered rows themselves, in the same shape returned by the matching REST endpoint. Absent in manifest mode.

File content schema

Each files[] entry is NDJSON: one Creator per line, no commas, no wrapping array. Verify the published sha256 over the body before you read it.

NDJSON
{"id":"cr_pfqPv0FLsBRimHfi","username":"zelfai","name":"Zelf","email":"example@zelflive.com","platform":"instagram","platform_handle":"zelfai","follower_count":53120,"active_content_count":217,"profile_bio":"Creator and content intelligence for modern brands.","platform_url":"https://www.instagram.com/zelfai","profile_picture_url":"https://cdn.hellozelf.com/avatars/zelfai.png"}
{"id":"cr_pfqPv0FLsBRimHfi","username":"zelfai","name":"Zelf","email":"example@zelflive.com","platform":"instagram","platform_handle":"zelfai","follower_count":53120,"active_content_count":217,"profile_bio":"Creator and content intelligence for modern brands.","platform_url":"https://www.instagram.com/zelfai","profile_picture_url":"https://cdn.hellozelf.com/avatars/zelfai.png"}

One row: Creator

idType: stringread-only

Unique identifier of the creator.

usernameType: stringor null

The creator's username or handle on the platform, without the @.

nameType: stringor null

The creator's display name on the platform.

emailType: stringor null

The creator's email address when known by the platform; empty otherwise.

platformType: string

The platform the creator is on. One of instagram, tiktok, youtube.

platform_handleType: string

The platform-side identifier of the account.

follower_countType: integer

The creator's follower count as of the most recent observation.

active_content_countType: integeror null

Number of active content items attributed to the creator.

profile_bioType: stringor null

The creator's profile bio as it appears on the platform.

platform_urlType: stringread-only

Direct URL to the creator's profile on the platform.

profile_picture_urlType: stringread-only

URL of the creator's profile picture.

Acknowledgement

Return a 2xx status within the endpoint's timeout to acknowledge receipt. Any non-2xx status, or a timeout, is treated as a failed delivery and retried with backoff.

Delivery
{
  "id": "whd_8f2c1d4e9a",
  "type": "creator.snapshot",
  "subscription_id": "whs_5Kq9Wd2pBxLm",
  "delivered_at": 1718000000,
  "livemode": true,
  "resource": "creator",
  "resource_filters": {},
  "delivery_mode": "manifest",
  "data": {
    "item_count": 1,
    "files": [
      {
        "format": "ndjson",
        "expires_at": 1718000000,
        "sha256": "9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08",
        "size_bytes": 184320,
        "item_count": 1280,
        "download_url": "https://storage.googleapis.com/zelf-webhook-snapshots/webhooks/whd_8f2c1d4e.ndjson?X-Goog-Signature=..."
      }
    ]
  }
}

Events

creator_vetting.completed

POSTyour endpointEvent

Fires when a creator vetting analysis run reaches a terminal state (COMPLETED or FAILED).

Delivered in inline mode as a lightweight notification: data.items[0] carries the vetting id, its analysis_type, modified_at, and each run's id and status, rather than the full payload. Retrieve the result from creator_vetting.results (pass vetting_id=<id>). resource is null.

Payload Zelf POSTs to the registered endpoint:

Payload

idType: string

Unique id of this delivery attempt, stable across retries of the same push.

typeType: string

Event type. <resource>.snapshot for scheduled snapshots (content.snapshot, creator.snapshot), or the event name for event pushes (creator_vetting.completed).

subscription_idType: string

Id of the subscription that produced this push.

delivered_atType: integer

Unix epoch seconds at which Zelf sent this push.

livemodeType: boolean

true for production data; false for test deliveries.

resourceType: stringor null

Resource the push covers (content or creator) for snapshots; null for event pushes.

resource_filtersType: any

The subscription's stored filters that scoped this snapshot, using the same query params as the matching list operation (content.list or creators.list). Empty for event pushes.

delivery_modeType: enum

manifest: data.files holds downloadable snapshot files. inline: data.items holds the rows directly.

Show values
manifestinline
dataType: WebhookData

The push payload. See delivery_mode for which key inside is populated.

Show child attributes
data.item_countType: integerminimum 0

Total number of rows in this delivery, summed across files or equal to the length of items.

minimum
0
data.statisticsType: any

Aggregate totals over the snapshot, including post count, views, engagement, earned media value, and unique creators. Present only on content.snapshot; absent for creator and event pushes.

data.filesType: WebhookFile[]

Manifest mode only. The downloadable snapshot files; retrieve each download_url and stream the NDJSON rows. Absent in inline mode.

Show child attributes
data.files[].formatType: string

File encoding. Always ndjson (newline-delimited JSON, with one row per line).

data.files[].expires_atType: integer

Unix epoch seconds after which download_url stops working. Fetch the file before this time.

data.files[].sha256Type: string

Hex SHA-256 of the file body. Use it to verify the download.

data.files[].size_bytesType: integerminimum 0

Size of the file in bytes.

minimum
0
data.files[].item_countType: integerminimum 0

Number of rows in this file.

minimum
0
data.files[].download_urlType: string(uri)

Signed, time-limited URL from which to retrieve the file. Expires at expires_at.

data.itemsType: any[]

Inline mode only. The delivered rows themselves, in the same shape returned by the matching REST endpoint. Absent in manifest mode.

Acknowledgement

Return a 2xx status within the endpoint's timeout to acknowledge receipt. Any non-2xx status, or a timeout, is treated as a failed delivery and retried with backoff.

Delivery
{
  "id": "whd_8f2c1d4e9a",
  "type": "creator_vetting.completed",
  "subscription_id": "whs_5Kq9Wd2pBxLm",
  "delivered_at": 1718000000,
  "livemode": true,
  "resource": null,
  "resource_filters": {},
  "delivery_mode": "inline",
  "data": {
    "item_count": 1,
    "items": [
      {
        "id": "bod_huNssMQX4FTvALEY",
        "analysis_type": "CREATOR_ANALYSIS",
        "modified_at": "2026-06-21T12:00:00Z",
        "analyses": [
          {
            "id": "ban_xJZFbcWNkF9M3brf",
            "status": "COMPLETED"
          },
          {
            "id": "ban_Nc7m1Pe6Qd4Kf0Az",
            "status": "IN_PROGRESS"
          }
        ]
      }
    ]
  }
}

ai_analysis.completed

POSTyour endpointEvent

Fires when an AI analysis run reaches a terminal state (COMPLETED or FAILED).

Delivered in inline mode as a lightweight notification: data.items[0] carries the analysis id, its analysis_type, modified_at, and each run's id and status, rather than the full payload. Retrieve the result from ai_analysis.results (pass analysis_id=<id>). resource is null. An analysis with multiple scopes fires once per run, as each reaches a terminal state.

Payload Zelf POSTs to the registered endpoint:

Payload

idType: string

Unique id of this delivery attempt, stable across retries of the same push.

typeType: string

Event type. <resource>.snapshot for scheduled snapshots (content.snapshot, creator.snapshot), or the event name for event pushes (creator_vetting.completed).

subscription_idType: string

Id of the subscription that produced this push.

delivered_atType: integer

Unix epoch seconds at which Zelf sent this push.

livemodeType: boolean

true for production data; false for test deliveries.

resourceType: stringor null

Resource the push covers (content or creator) for snapshots; null for event pushes.

resource_filtersType: any

The subscription's stored filters that scoped this snapshot, using the same query params as the matching list operation (content.list or creators.list). Empty for event pushes.

delivery_modeType: enum

manifest: data.files holds downloadable snapshot files. inline: data.items holds the rows directly.

Show values
manifestinline
dataType: WebhookData

The push payload. See delivery_mode for which key inside is populated.

Show child attributes
data.item_countType: integerminimum 0

Total number of rows in this delivery, summed across files or equal to the length of items.

minimum
0
data.statisticsType: any

Aggregate totals over the snapshot, including post count, views, engagement, earned media value, and unique creators. Present only on content.snapshot; absent for creator and event pushes.

data.filesType: WebhookFile[]

Manifest mode only. The downloadable snapshot files; retrieve each download_url and stream the NDJSON rows. Absent in inline mode.

Show child attributes
data.files[].formatType: string

File encoding. Always ndjson (newline-delimited JSON, with one row per line).

data.files[].expires_atType: integer

Unix epoch seconds after which download_url stops working. Fetch the file before this time.

data.files[].sha256Type: string

Hex SHA-256 of the file body. Use it to verify the download.

data.files[].size_bytesType: integerminimum 0

Size of the file in bytes.

minimum
0
data.files[].item_countType: integerminimum 0

Number of rows in this file.

minimum
0
data.files[].download_urlType: string(uri)

Signed, time-limited URL from which to retrieve the file. Expires at expires_at.

data.itemsType: any[]

Inline mode only. The delivered rows themselves, in the same shape returned by the matching REST endpoint. Absent in manifest mode.

Acknowledgement

Return a 2xx status within the endpoint's timeout to acknowledge receipt. Any non-2xx status, or a timeout, is treated as a failed delivery and retried with backoff.

Delivery
{
  "id": "whd_8f2c1d4e9a",
  "type": "ai_analysis.completed",
  "subscription_id": "whs_5Kq9Wd2pBxLm",
  "delivered_at": 1718000000,
  "livemode": true,
  "resource": null,
  "resource_filters": {},
  "delivery_mode": "inline",
  "data": {
    "item_count": 1,
    "items": [
      {
        "id": "bod_huNssMQX4FTvALEY",
        "analysis_type": "AI_ANALYSIS",
        "modified_at": "2026-06-21T12:00:00Z",
        "analyses": [
          {
            "id": "ban_xJZFbcWNkF9M3brf",
            "status": "COMPLETED"
          },
          {
            "id": "ban_Nc7m1Pe6Qd4Kf0Az",
            "status": "IN_PROGRESS"
          }
        ]
      }
    ]
  }
}