Posts
post_created
Sent when a post is created on one of the boards of the team.
Only posts from SMS, email and public post social feeds send this event.
relationships.object.data identifies the post, and included contains the post.
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 post_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 post this event is about. |
data.relationships.object.data | object | |
data.relationships.object.data.type | string | One of post. |
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 post.
post
A post, as returned to authenticated requests.
| Field | Type | Description |
|---|---|---|
id | string | The ID of the post. |
type | string | The resource type. Always post. One of post. |
attributes | object | The attributes of a post. Attributes marked as only returned to authenticated requests are omitted from public responses. |
attributes.type (optional) | string | The source (network or channel) of the post. |
attributes.external_id (optional) | string | The ID of the post at the source. Generated for custom and public posts. |
attributes.url (optional) | string or null (uri) | The URL of the post at the source, or null if there isn't one. |
attributes.title (optional) | string or null | The title of the post, or null if it doesn't have one. |
attributes.text (optional) | string or null | The text of the post, or null if it's empty. |
attributes.alternative_text (optional) | string or null | The alternative text describing the post's media, for accessibility. |
attributes.published_at (optional) | string or null (date-time) | When the post was published at the source. |
attributes.highlighted (optional) | boolean or null | Whether the post is highlighted. |
attributes.pinned (optional) | boolean or null | Whether the post is pinned to the top of the board. |
attributes.tags (optional) | array or null | The tags assigned to the post. |
attributes.carousel (optional) | boolean | Whether the post is one of several media items published together. |
attributes.media_type (optional) | string | The type of media attached to the post: carousel when it's one of several media items published together, video or image for a single attachment, and text_only when it has no media. One of text_only, image, video, carousel. |
attributes.image_url (optional) | string or null (uri) | The URL of the post's image, or null if it has none. |
attributes.video_url (optional) | string or null (uri) | The URL of the post's video, or null if it has none. |
attributes.attachment_id (optional) | string or null | An opaque identifier of the post's media attachment. |
attributes.author (optional) | object | The author of the post. The same author is also available through the author relationship. email, phone and remote_ip are only returned to authenticated requests. |
attributes.author.name (optional) | string or null | The author's display name. |
attributes.author.username (optional) | string or null | The author's username at the source. |
attributes.author.url (optional) | string or null (uri) | The URL of the author's profile. |
attributes.author.image_url (optional) | string or null (uri) | The URL of the author's avatar. |
attributes.author.external_id (optional) | string or null | The author's ID at the source. |
attributes.author.email (optional) | string or null (email) | The author's email address. |
attributes.author.phone (optional) | string or null | The author's phone number. |
attributes.author.remote_ip (optional) | string or null | The author's anonymized IP address, for posts submitted through a public post form. |
attributes.metadata (optional) | object | Machine learning metadata about the post (also available through the dedicated attributes). Keys without a value are omitted. |
attributes.metadata.language (optional) | string | The dominant language of the text. |
attributes.metadata.sentiment (optional) | string | The sentiment of the text. |
attributes.metadata.image_nsfw (optional) | number | The NSFW score of the image. |
attributes.metadata.image_phash (optional) | string | The perceptual hash of the image. |
attributes.metadata.image_sentiments (optional) | array of string | The emotions detected in the image. |
attributes.metadata.image_objects (optional) | array of string | The objects detected in the image. |
attributes.metadata.image_objects_rekognition (optional) | array of string | Deprecated. Same as image_objects. |
attributes.language (optional) | string or null | The dominant language of the text (ISO 639-1 code). null when not detected. |
attributes.rating (optional) | integer or null | The review rating from 0 to 100. |
attributes.verified (optional) | boolean or null | Whether the review is from a verified buyer. Only set on reviews; null for other posts. |
attributes.incentivized (optional) | boolean or null | Whether the reviewer received an incentive. Only set on reviews; null for other posts. |
attributes.status (optional) | string | The moderation status of the post. Only returned to authenticated requests. One of public, private, deleted, author_deleted, privacy_deleted, moderation_deleted, image_moderation_pending, image_moderation_deleted, image_moderation_failed, custom_post. |
attributes.status_reasons (optional) | array or null | The reasons for the post's moderation status. Only returned to authenticated requests. |
attributes.last_moderated_at (optional) | string or null (date-time) | When the post was last moderated. Only returned to authenticated requests. |
attributes.custom_field (optional) | string or null | The value of the custom field of a public post form, or null. Only returned to authenticated requests. |
attributes.sentiment (optional) | string or null | The sentiment of the text. Only returned to authenticated requests. One of positive, negative, neutral, null. |
attributes.image_nsfw (optional) | number or null | The NSFW score of the image, from 0 to 1. null when not analyzed. Only returned to authenticated requests. |
attributes.image_phash (optional) | string or null | The perceptual hash of the image, used to find duplicates. null when not computed. Only returned to authenticated requests. |
attributes.image_sentiments (optional) | array or null | The emotions detected in the image. null when not analyzed. Only returned to authenticated requests. |
attributes.image_objects (optional) | array or null | The objects detected in the image. null when not analyzed. Only returned to authenticated requests. |
attributes.hue_probability (optional) | null | Deprecated. Always null. Only returned to authenticated requests. |
relationships (optional) | object | The post's relationships. Unless a relationship is requested with the include query parameter, only meta.included: false is returned (social_feed and tint always return data). |
relationships.social_feed (optional) | object | The social feed the post was ingested from. Returned to unauthenticated requests or when the access token has the social_feeds:read scope. |
relationships.social_feed.data (optional) | object | |
relationships.tint (optional) | object | The board the post belongs to. Only returned when the access token has the tints:read scope. |
relationships.tint.data (optional) | object | A resource identifier for a board. |
relationships.tint.links (optional) | object | |
relationships.author (optional) | object | The author of the post. The author's ID is the post's ID. |
relationships.author.data (optional) | object | Only returned when included. |
relationships.author.meta (optional) | object | |
relationships.replies (optional) | object | The replies to the post. Inactive replies are only included when the access token has the replies:read scope. |
relationships.replies.data (optional) | array of object | Only returned when included. |
relationships.replies.meta (optional) | object | |
relationships.products (optional) | object | The product tags of the post (resource type product_tag). Returned to unauthenticated requests or when the access token has the products:read scope. |
relationships.products.data (optional) | array of object | Only returned when included. |
relationships.products.meta (optional) | object | |
relationships.product_tags (optional) | object | The product tags on the post (see also products). Only returned to unauthenticated requests or when the access token has the products:read scope. |
relationships.product_tags.data (optional) | array of object | Only returned when included. |
relationships.product_tags.meta (optional) | object | |
relationships.cta_associations (optional) | object | The calls to action associated with the post, directly or through a saved filter. Returned to unauthenticated requests or when the access token has the ctas:read scope. |
relationships.cta_associations.data (optional) | array of object | Only returned when included. |
relationships.cta_associations.meta (optional) | object | |
relationships.asset (optional) | object | The asset created from the post. Only returned when the access token has the assets:read scope. |
relationships.asset.data (optional) | object or null | Only returned when included. null if no asset was created from the post. |
relationships.asset.meta (optional) | object | |
relationships.right_requests (optional) | object | The right requests sent for the post. Only returned when the access token has the right_requests:read scope. |
relationships.right_requests.data (optional) | array of object | Only returned when included. |
relationships.right_requests.meta (optional) | object | |
relationships.siblings (optional) | object | The other posts with the same source and external ID in other boards. Only returned when the collapse query parameter is source,external_id. |
relationships.siblings.data (optional) | array of object |
Example
{
"data": {
"id": "1377458",
"type": "event",
"attributes": {
"created_at": "2025-03-14T16:42:07.000Z",
"name": "post_created"
},
"relationships": {
"object": {
"data": {
"type": "post",
"id": "987654321"
}
},
"team": {
"data": {
"type": "team",
"id": "1"
}
}
}
},
"included": [
{
"id": "987654321",
"type": "post",
"attributes": {
"highlighted": false,
"pinned": false,
"tags": [
"contest"
],
"alternative_text": null,
"title": null,
"carousel": false,
"attachment_id": null,
"external_id": "SM5f1c2e9a7b",
"verified": false,
"incentivized": false,
"text": "Loving my new Acme hiking boots! #AcmeOutdoors",
"url": null,
"last_moderated_at": null,
"status": "public",
"status_reasons": [],
"hue_probability": null,
"custom_field": null,
"sentiment": "positive",
"image_nsfw": null,
"image_phash": null,
"image_sentiments": null,
"image_objects": null,
"type": "sms",
"published_at": "2025-03-14T16:42:07.000Z",
"rating": null,
"media_type": "image",
"author": {
"name": "Jane Doe",
"username": null,
"url": null,
"image_url": null,
"email": null,
"phone": "+15555550123",
"remote_ip": null,
"external_id": null
},
"metadata": {
"language": "en",
"sentiment": "positive"
},
"image_url": "https://cdn.example.com/posts/987654321/image.jpg",
"video_url": null,
"language": null
},
"relationships": {
"social_feed": {
"data": {
"type": "social_feed",
"id": "31337"
}
},
"tint": {
"data": {
"type": "tint",
"id": "4242"
},
"links": {
"self": "https://api.tintup.com/v2/teams/1/tints/4242"
}
},
"author": {
"meta": {
"included": false
}
},
"product_tags": {
"meta": {
"included": false
}
},
"replies": {
"meta": {
"included": false
}
},
"products": {
"meta": {
"included": false
}
},
"cta_associations": {
"meta": {
"included": false
}
},
"asset": {
"meta": {
"included": false
}
},
"right_requests": {
"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. |