Home
Assets

asset_created

Sent when an asset is added to the team, whether uploaded, imported or created in bulk.

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

HeaderDescription
X-TINT-Signaturetimestamp,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-VersionThe API version the payload was serialized with, unless the webhook overrides this header.
User-AgentAlways TINT Webhook/2.0, unless the webhook overrides this header.

Payload

FieldTypeDescription
dataobject
data.idstringThe 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.typestringAlways event. One of event.
data.attributesobject
data.attributes.namestringThe event name. One of asset_created.
data.attributes.created_atstring (date-time)When the event happened (the event was recorded), not when this delivery was sent. Retries keep the original value.
data.relationshipsobject
data.relationships.objectobjectThe asset this event is about.
data.relationships.object.dataobject
data.relationships.object.data.typestringOne of asset.
data.relationships.object.data.idstring
data.relationships.teamobjectThe team the webhook belongs to.
data.relationships.team.dataobject
data.relationships.team.data.typestringOne of team.
data.relationships.team.data.idstring

Included resources

The sideloaded resources: the asset, its variants and its collections (each collection with only its name).

asset

FieldTypeDescription
idstringThe ID of the asset.
typestringThe resource type. One of asset.
attributesobject
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.statusstringactive assets are visible in the asset manager; archived assets are hidden from it by default. One of active, archived.
attributes.sourcestringWhere 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 nullThe asset's name.
attributes.description (optional)string or nullA longer description of the asset.
attributes.alternative_text (optional)string or nullText describing the image for screen readers. When not set by a user, it may contain an automatically generated description.
attributes.caption (optional)string or nullDeprecated. Same value as alternative_text.
attributes.tags (optional)array of stringTags of the asset, without case-insensitive duplicates.
attributes.objects (optional)array or nullObjects detected in the image or video (lowercase). null until the asset has been analyzed.
attributes.emotions (optional)array or nullEmotions detected on faces in the image. null when not analyzed or for videos.
attributes.infections (optional)array or nullMalware detected in the file, if any.
attributes.licenses (optional)boolean or nullWhether license information (such as copyright metadata) was found in the file. null when not checked.
attributes.sfw (optional)boolean or nullWhether the file is safe for work. null when not checked.
attributes.insights (optional)object or nullAttention 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 nullDetails 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.urlstring 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_typestringThe file's media type.
attributes.sizeintegerThe file size in bytes.
attributes.dimensionsarray of integer or nullThe width and height of the image or video, in pixels.
attributes.duration (optional)number or nullThe video duration in seconds. null for images.
attributes.author (optional)nullDeprecated. Always null; see imported_from_data.
attributes.text (optional)nullDeprecated. Always null; see imported_from_data.
attributes.post_title (optional)nullDeprecated. Always null; see imported_from_data.
attributes.post_text (optional)nullDeprecated. Always null; see imported_from_data.
relationships (optional)object
relationships.media (optional)objectThe file uploaded directly for this asset. Always returned; data is null for imported assets.
relationships.media.data (optional)object or null
relationships.person (optional)objectThe loyalty member who created the content, when known. Always returned.
relationships.person.data (optional)object
relationships.team (optional)objectThe 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)objectThe 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)objectThe 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)objectDeprecated. 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.

FieldTypeDescription
idstringThe ID of the collection.
typestringThe resource type. Always collection. One of collection.
attributesobject
attributes.name (optional)stringThe name of the collection.
attributes.status (optional)stringWhether the collection is active or archived. One of active, archived.
attributes.public (optional)booleanWhether 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 nullThe public identifier of the collection. null unless the collection is public.
attributes.assets_count (optional)integerDeprecated. 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)objectThe assets in the collection.
relationships.assets.data (optional)array of objectThe first 25 assets of the collection. Only returned when included.
relationships.assets.links (optional)objectLinks 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).

FieldTypeDescription
idstringThe ID of the variant, the same as the asset's ID.
typestringOne of variant.
attributesobject
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)stringThe file's media type.
attributes.size (optional)integerThe file size in bytes.
attributes.dimensions (optional)array of integer or nullThe width and height of the image or video, in pixels.
attributes.duration (optional)number or nullThe 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 nullThe asset's title. Only returned to authenticated requests and in webhook payloads.
attributes.description (optional)string or nullA longer description of the asset. Only returned to authenticated requests and in webhook payloads.
attributes.transformations (optional)nullAlways null. Only returned to authenticated requests and in webhook payloads.
attributes.enhance (optional)nullAlways null. Only returned to authenticated requests and in webhook payloads.
attributes.insights (optional)object or nullAttention 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

StatusDescription
404404 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.
410404 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.
2XXAny 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.
OtherAny 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.