asset_exported
Exports are generated asynchronously, so subscribe to this event instead of polling the export request.
relationships.object.data identifies the export request, and included contains it. Check its status: success means url links to the file, failure means the export failed and url is null.
The url is a signed link that expires 15 minutes after the event was created, and a retried delivery carries the same link. If it has expired, retrieve the export request from the API to get a fresh one.
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_exported. |
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 export request this event is about. |
data.relationships.object.data | object | |
data.relationships.object.data.type | string | One of asset_export_request. |
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 export request.
asset_export_request
An export of assets, generated asynchronously as a ZIP file.
| Field | Type | Description |
|---|---|---|
id | string | The ID of the export request. |
type | string | One of asset_export_request. |
attributes | object | |
attributes.status | string | pending while the export is being generated, then success or failure. One of pending, success, failure. |
attributes.url | string or null (uri) | The URL of the CSV export. Once the status attribute is success, every request returns a new signed URL, valid for 15 minutes, for up to 30 days. null until then. |
relationships | object | |
relationships.user | object | The user who requested the export. The linkage is only returned when the user is included. |
relationships.user.data (optional) | object | |
relationships.user.meta (optional) | object |
Example
{
"data": {
"id": "1377464",
"type": "event",
"attributes": {
"created_at": "2025-03-14T16:42:07.000Z",
"name": "asset_exported"
},
"relationships": {
"object": {
"data": {
"type": "asset_export_request",
"id": "Q2kHzGx9aBcD1g"
}
},
"team": {
"data": {
"type": "team",
"id": "1"
}
}
}
},
"included": [
{
"id": "Q2kHzGx9aBcD1g",
"type": "asset_export_request",
"attributes": {
"status": "success",
"url": "https://exports.example.com/Q2kHzGx9aBcD1g.zip?X-Amz-Expires=900&X-Amz-Signature=5d41402abc4b2a76"
},
"relationships": {
"user": {
"meta": {
"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. |