asset_created
relationships.object.data identifies the asset, and included contains the asset, its variants and its collections (each collection with only its name).
The payload below is the default JSON:API document. The webhook's payload_include, payload_fields and payload_transformation_template change it, and its filter decides whether the event is sent at all.
Request
We send the event to your webhook's url with POST (or the webhook's http_method) and a JSON:API document as the body (Content-Type: application/vnd.api+json). See Receiving Webhooks for retries and Webhook Event Signatures to verify the request.
Headers
| Header | Description |
|---|---|
X-TINT-Signature | timestamp,signature, where timestamp is the Unix time (in seconds) at which the delivery was signed and signature is the Base64-encoded HMAC-SHA256 of timestamp.body, keyed with the webhook's signing secret. Only sent when the webhook has a signing secret. Every attempt is signed again, so retries carry a new timestamp. See Webhook Event Signatures. |
API-Version | The API version the payload was serialized with, unless the webhook overrides this header. |
User-Agent | Always TINT Webhook/2.0, unless the webhook overrides this header. |
Payload
| Field | Type | Description |
|---|---|---|
data | object | |
data.id | string | The event ID. It stays the same on every retry of this event, so use it to detect duplicate deliveries. It is also the ID to use with Retrieve a webhook event. |
data.type | string | Always event. One of event. |
data.attributes | object | |
data.attributes.name | string | The event name. One of asset_created. |
data.attributes.created_at | string (date-time) | When the event happened (the event was recorded), not when this delivery was sent. Retries keep the original value. |
data.relationships | object | |
data.relationships.object | object | The asset this event is about. |
data.relationships.object.data | object | |
data.relationships.object.data.type | string | One of asset. |
data.relationships.object.data.id | string | |
data.relationships.team | object | The team the webhook belongs to. |
data.relationships.team.data | object | |
data.relationships.team.data.type | string | One of team. |
data.relationships.team.data.id | string |
Included resources
The sideloaded resources: the asset, its variants and its collections (each collection with only its name).
asset
| Field | Type | Description |
|---|---|---|
id | string | The ID of the asset. |
type | string | The resource type. One of asset. |
attributes | object | |
attributes.created_at (optional) | string (date-time) | When the asset was created. |
attributes.updated_at (optional) | string (date-time) | When the asset was last updated. |
attributes.status | string | active assets are visible in the asset manager; archived assets are hidden from it by default. One of active, archived. |
attributes.source | string | Where the asset comes from. Assets created through the API are branded; assets imported from right requests or form submissions keep the source of the original content. |
attributes.name (optional) | string or null | The asset's name. |
attributes.description (optional) | string or null | A longer description of the asset. |
attributes.alternative_text (optional) | string or null | Text describing the image for screen readers. When not set by a user, it may contain an automatically generated description. |
attributes.caption (optional) | string or null | Deprecated. Same value as alternative_text. |
attributes.tags (optional) | array of string | Tags of the asset, without case-insensitive duplicates. |
attributes.objects (optional) | array or null | Objects detected in the image or video (lowercase). null until the asset has been analyzed. |
attributes.emotions (optional) | array or null | Emotions detected on faces in the image. null when not analyzed or for videos. |
attributes.infections (optional) | array or null | Malware detected in the file, if any. |
attributes.licenses (optional) | boolean or null | Whether license information (such as copyright metadata) was found in the file. null when not checked. |
attributes.sfw (optional) | boolean or null | Whether the file is safe for work. null when not checked. |
attributes.insights (optional) | object or null | Attention insights for images, with metrics (scores keyed by metric name) and heatmap (the attention heat map). null when not analyzed. |
attributes.imported_from_data (optional) | object or null | Details about the content the asset was imported from (such as the author and the original post for right requests, or the submitter for form submissions). Empty or null for uploaded assets. |
attributes.source_url (optional) | string or null (uri) | The URL the asset was imported from. null for direct uploads. |
attributes.expanded_url (optional) | string or null (uri) | Same value as source_url. |
attributes.download_url (optional) | string or null (uri) | Same value as source_url. |
attributes.url | string or null (uri) | The URL of the stored file. |
attributes.thumbnail_url (optional) | string or null (uri) | The URL of a thumbnail of the image or video. null when no thumbnail is available. |
attributes.mime_type | string | The file's media type. |
attributes.size | integer | The file size in bytes. |
attributes.dimensions | array of integer or null | The width and height of the image or video, in pixels. |
attributes.duration (optional) | number or null | The video duration in seconds. null for images. |
attributes.author (optional) | null | Deprecated. Always null; see imported_from_data. |
attributes.text (optional) | null | Deprecated. Always null; see imported_from_data. |
attributes.post_title (optional) | null | Deprecated. Always null; see imported_from_data. |
attributes.post_text (optional) | null | Deprecated. Always null; see imported_from_data. |
relationships (optional) | object | |
relationships.media (optional) | object | The file uploaded directly for this asset. Always returned; data is null for imported assets. |
relationships.media.data (optional) | object or null | |
relationships.person (optional) | object | The loyalty member who created the content, when known. Always returned. |
relationships.person.data (optional) | object | |
relationships.team (optional) | object | The team that owns the asset. Only returned when the token has the teams:read scope. data is only returned when team is included. |
relationships.team.data (optional) | object | |
relationships.team.links (optional) | object | |
relationships.collections (optional) | object | The collections the asset belongs to. data is only returned when collections is included; otherwise meta.included is false. |
relationships.collections.data (optional) | array of object | |
relationships.collections.meta (optional) | object | |
relationships.imported_from (optional) | object | The right request or form submission the asset was imported from. Only returned for assets imported from a right request when the token has the right_requests:read scope, or from a form submission when it has the form_submissions:read scope. data is only returned when imported_from is included. |
relationships.imported_from.data (optional) | object or null | |
relationships.imported_from.meta (optional) | object | |
relationships.variants (optional) | object | Deprecated. Each asset has a single variant, the asset itself (see Variant). data is present when variants is included, and always in webhook payloads. |
relationships.variants.data (optional) | array of object | |
relationships.variants.meta (optional) | object | |
links (optional) | object | |
links.self (optional) | string (uri) | The URL of the asset. |
collection
A collection of assets.
| Field | Type | Description |
|---|---|---|
id | string | The ID of the collection. |
type | string | The resource type. Always collection. One of collection. |
attributes | object | |
attributes.name (optional) | string | The name of the collection. |
attributes.status (optional) | string | Whether the collection is active or archived. One of active, archived. |
attributes.public (optional) | boolean | Whether the collection can be viewed publicly using its slug. Making a collection public generates a new slug; making it private removes the slug. |
attributes.slug (optional) | string or null | The public identifier of the collection. null unless the collection is public. |
attributes.assets_count (optional) | integer | Deprecated. The number of assets in the collection; use meta.total of the assets relationship instead. |
attributes.created_at (optional) | string (date-time) | When the collection was created. |
attributes.updated_at (optional) | string (date-time) | When the collection was last updated. |
relationships (optional) | object | |
relationships.assets (optional) | object | The assets in the collection. |
relationships.assets.data (optional) | array of object | The first 25 assets of the collection. Only returned when included. |
relationships.assets.links (optional) | object | Links to the collection's assets, only returned when included and the collection has assets. |
relationships.assets.meta (optional) | object |
variant
Deprecated. A variant of an asset. Each asset has a single variant, the asset itself, with the same id; it's sideloaded when variants is included (always in webhook payloads).
| Field | Type | Description |
|---|---|---|
id | string | The ID of the variant, the same as the asset's ID. |
type | string | One of variant. |
attributes | object | |
attributes.url (optional) | string or null (uri) | The URL of the stored file. |
attributes.expanded_url (optional) | string or null (uri) | Same value as source_url. |
attributes.mime_type (optional) | string | The file's media type. |
attributes.size (optional) | integer | The file size in bytes. |
attributes.dimensions (optional) | array of integer or null | The width and height of the image or video, in pixels. |
attributes.duration (optional) | number or null | The video duration in seconds. null for images. |
attributes.thumbnail_url (optional) | string or null (uri) | The URL of a thumbnail of the image or video. null when no thumbnail is available. |
attributes.source_url (optional) | string or null (uri) | The URL the asset was imported from. null for direct uploads. Only returned to authenticated requests and in webhook payloads. |
attributes.title (optional) | string or null | The asset's title. Only returned to authenticated requests and in webhook payloads. |
attributes.description (optional) | string or null | A longer description of the asset. Only returned to authenticated requests and in webhook payloads. |
attributes.transformations (optional) | null | Always null. Only returned to authenticated requests and in webhook payloads. |
attributes.enhance (optional) | null | Always null. Only returned to authenticated requests and in webhook payloads. |
attributes.insights (optional) | object or null | Attention insights for images, with metrics (scores keyed by metric name) and heatmap (the attention heat map). null when not analyzed. Only returned to authenticated requests and in webhook payloads. |
Example
{
"data": {
"id": "1377454",
"type": "event",
"attributes": {
"created_at": "2025-03-14T16:42:07.000Z",
"name": "asset_created"
},
"relationships": {
"object": {
"data": {
"type": "asset",
"id": "5501"
}
},
"team": {
"data": {
"type": "team",
"id": "1"
}
}
}
},
"included": [
{
"id": "5501",
"type": "asset",
"attributes": {
"created_at": "2025-03-14T16:42:07.000Z",
"updated_at": "2025-03-14T16:42:07.000Z",
"status": "active",
"source": "branded",
"objects": [
"shoe"
],
"source_url": null,
"name": "Trail boots hero shot",
"description": null,
"insights": {},
"alternative_text": "A hiker lacing up brown leather boots.",
"tags": [
"summer"
],
"emotions": [],
"infections": [],
"licenses": null,
"sfw": true,
"imported_from_data": null,
"caption": null,
"author": null,
"post_text": null,
"post_title": null,
"text": null,
"url": "https://cdn.example.com/assets/5501/original.jpg",
"thumbnail_url": "https://cdn.example.com/assets/5501/thumbnail.jpg",
"expanded_url": "https://cdn.example.com/assets/5501/original.jpg",
"duration": null,
"dimensions": [
1920,
1080
],
"mime_type": "image/jpeg",
"size": 482113,
"download_url": "https://cdn.example.com/assets/5501/original.jpg"
},
"relationships": {
"person": {
"data": {
"type": "person",
"id": "120045"
}
},
"media": {
"data": null
},
"variants": {
"data": [
{
"type": "variant",
"id": "5501"
}
],
"meta": {
"total": 1
}
},
"collections": {
"data": [
{
"type": "collection",
"id": "77"
}
]
},
"imported_from": {
"meta": {
"included": false
}
}
},
"links": {
"self": "https://api.tintup.com/v2/teams/1/assets/5501"
}
},
{
"id": "5501",
"type": "variant",
"attributes": {
"url": "https://cdn.example.com/assets/5501/original.jpg",
"expanded_url": "https://cdn.example.com/assets/5501/original.jpg",
"mime_type": "image/jpeg",
"size": 482113,
"dimensions": [
1920,
1080
],
"duration": null,
"thumbnail_url": "https://cdn.example.com/assets/5501/thumbnail.jpg",
"source_url": null,
"title": "Trail boots hero shot",
"description": null,
"transformations": null,
"enhance": null,
"insights": {}
}
},
{
"id": "77",
"type": "collection",
"attributes": {
"name": "Summer campaign"
},
"relationships": {
"assets": {
"meta": {
"total": 12,
"included": false
}
}
}
}
]
}Responses
| Status | Description |
|---|---|
404 | 404 Not Found or 410 Gone stops delivery of this event immediately: it is marked failure and not retried. The attempt still counts toward the webhook's failure limit. |
410 | 404 Not Found or 410 Gone stops delivery of this event immediately: it is marked failure and not retried. The attempt still counts toward the webhook's failure limit. |
2XX | Any status below 400 (typically 2XX) acknowledges the event: we mark it success and don't send it again. The response body is ignored (we store it with the attempt, for your reference). Redirects are not followed, and a 3XX response also counts as acknowledged, so point the webhook at the final URL. |
| Other | Any other 4XX or 5XX status, a timeout or a connection error fails the attempt, and we retry up to 7 more times with an increasing delay (roughly 1 minute, 1 minute, 2 minutes, 13 minutes, 1 hour, 4 hours, then 13 hours later), after which the event is marked failure. More than 50 failed attempts for the same webhook within a week, without a successful delivery in between, set the webhook to inactive. |