TrueLoyal Advocacy API
v2https://api.tintup.comThe reference for every endpoint of the TrueLoyal Advocacy API. Start with the guides for authentication, pagination, versioning and the JSON:API conventions the API follows.
Authentication
access_tokenoauth2OAuth 2.0 authorization code flow.
- Authorization URL
https://id.tintup.com/oauth/authorize- Token URL
https://id.tintup.com/oauth/token
accounts:read- Read access to accountsaccounts:write- Write access to accountsactivities:read- Read access to activitiesassets:read- Read access to assetsassets:write- Write access to assetsauthentication_factors:read- Read access to authentication factorsauthentication_factors:write- Write access to authentication factorscampaigns:read- Read access to campaignscampaigns:write- Write access to campaignscollections:read- Read access to collectionscollections:write- Write access to collectionsctas:read- Read access to CTAsctas:write- Write access to CTAsdomains:read- Read access to domainsdomains:write- Write access to domainsecommerce:read- Read access to e-commerce engagement metricsexperiences:read- Read access to experiencesexperiences:write- Write access to experiencesfonts:read- Read access to fontsfonts:write- Write access to fontsform_submissions:read- Read access to form submissionsform_submissions:write- Write access to form submissionsforms:read- Read access to formsforms:write- Write access to formsidentity- Read access to my useridentity:write- Write access to my userinstint_updates:read- Read access to InsTINT updatesinstint_updates:write- Write access to InsTINT updatesmarketing_integrations:read- Read access to marketing integrationsmarketing_integrations:write- Write access to marketing integrationsmarketing_integrations_requests:read- Read access to marketing integration publishing requestsmarketing_integrations_requests:write- Publish access to marketing integrationsmixes:read- Read access to mixesmixes:write- Write access to mixesoauth_applications:read- Read access to OAuth 2.0 applicationsoauth_applications:write- Write access to OAuth 2.0 applicationspersonalizations:read- Read access to personalizationspersonalizations:write- Write access to personalizationsposts:read- Read access to postsposts:write- Write access to postsprivacy_requests:read- Read access to privacy requestsprivacy_requests:write- Write access to privacy requestsproduct_accounts:read- Read access to product accountsproduct_accounts:write- Write access to product accountsproduct_feeds:read- Read access to product feedsproduct_feeds:write- Write access to product feedsproducts:read- Read access to productsproducts:write- Write access to productsrewards:read- Read access to rewardsright_request_templates:read- Read access to right request templatesright_request_templates:write- Write access to right request templatesright_request_terms:read- Read access to right request termsright_request_terms:write- Write access to right request termsright_requests:read- Read access to right requestsright_requests:write- Write access to right requestsroles:read- Read access to rolesroles:write- Write access to rolessaved_filters:read- Read access to saved filterssaved_filters:write- Write access to saved filtersschemas:read- Read access to schemasschemas:write- Write access to schemassocial_feeds:read- Read access to social feedssocial_feeds:write- Write access to social feedssubaccount_metrics:read- Read access to account and subaccount metricsteams:read- Read access to teamsteams:write- Write access to teamstints:read- Read access to boardstints:write- Write access to boardstransactions:read- Read access to transactionstransactions:write- Write access to transactionsusers:read- Read access to team usersusers:write- Write access to team userswebhooks:read- Read access to webhookswebhooks:write- Write access to webhooks
id_tokenapiKeyA short-lived token required, in addition to an access token, to change sensitive data. See Changes to Sensitive Data.
API Key: id_token in query
OAuth
authenticationThe OAuth 2.0 endpoints. How to create an OAuth application and get an access token is covered in the Authentication guide.
Create an access token
Exchanges an authorization code for an access token (grant_type=authorization_code), or uses a refresh token to obtain a new access token (grant_type=refresh_token). Access tokens expire after one hour; use the refresh token to get a new one.
Body
The grant to exchange for an access token. Confidential applications authenticate with client_id and client_secret, either in the body or with HTTP Basic authentication (Authorization: Basic base64(client_id:client_secret)).
grant_typestringauthorization_coderefresh_tokenrequiredThe kind of grant being exchanged.
client_idstringThe application's client_id. Required unless sent with HTTP Basic authentication.
client_secretstringThe application's client_secret. Required for confidential applications unless sent with HTTP Basic authentication.
codestringThe authorization code received on redirect_uri. Required when grant_type is authorization_code. Codes expire after 5 minutes and can only be used once.
code_verifierstringThe PKCE code verifier matching the code_challenge sent to the authorization endpoint. Required when grant_type is authorization_code and a code_challenge was sent.
redirect_uristring<uri>The same redirect_uri that was sent to the authorization endpoint. Required when grant_type is authorization_code.
refresh_tokenstringThe refresh token returned with a previous access token. Required when grant_type is refresh_token. The response contains a new refresh token that replaces this one.
scopestringA space-delimited list of scopes. With refresh_token, it can narrow down the originally granted scopes.
Response
The access token.
Bad Request. The request is invalid, for example the code is invalid, expired or already used, the PKCE verifier doesn't match, or a requested scope isn't allowed.
Unauthorized. The client authentication failed (unknown client_id or wrong client_secret).
curl -X POST 'https://api.tintup.com/oauth/token' \
-H 'Content-Type: application/x-www-form-urlencoded' \
-d '{
"grant_type": "authorization_code",
"client_id": "3a7c1e0b9d8f4e6a2b5c7d9e1f3a5b7c",
"client_secret": "9f8e7d6c5b4a39281706f5e4d3c2b1a0",
"code": "1b7e4c9a2d5f8e0c3a6b9d2e5f8a1c4b",
"code_verifier": "dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk",
"redirect_uri": "https://reports.example.com/auth/callback"
}'const response = await fetch('https://api.tintup.com/oauth/token', {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
},
body: JSON.stringify({
"grant_type": "authorization_code",
"client_id": "3a7c1e0b9d8f4e6a2b5c7d9e1f3a5b7c",
"client_secret": "9f8e7d6c5b4a39281706f5e4d3c2b1a0",
"code": "1b7e4c9a2d5f8e0c3a6b9d2e5f8a1c4b",
"code_verifier": "dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk",
"redirect_uri": "https://reports.example.com/auth/callback"
}),
});
const data = await response.json();import requests
payload = {
"grant_type": "authorization_code",
"client_id": "3a7c1e0b9d8f4e6a2b5c7d9e1f3a5b7c",
"client_secret": "9f8e7d6c5b4a39281706f5e4d3c2b1a0",
"code": "1b7e4c9a2d5f8e0c3a6b9d2e5f8a1c4b",
"code_verifier": "dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk",
"redirect_uri": "https://reports.example.com/auth/callback"
}
response = requests.post('https://api.tintup.com/oauth/token', json=payload)
data = response.json(){
"grant_type": "authorization_code",
"client_id": "3a7c1e0b9d8f4e6a2b5c7d9e1f3a5b7c",
"client_secret": "9f8e7d6c5b4a39281706f5e4d3c2b1a0",
"code": "1b7e4c9a2d5f8e0c3a6b9d2e5f8a1c4b",
"code_verifier": "dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk",
"redirect_uri": "https://reports.example.com/auth/callback"
}{
"access_token": "4e8a1c6f3b9d2e7a0c5f8b1d4e7a9c2f",
"token_type": "Bearer",
"expires_in": 3600,
"refresh_token": "7d2f9b4e1a6c8e3f0b5d7a9c2e4f6a8b",
"scope": "tints:read posts:read",
"created_at": 1741970527
}{
"error": "invalid_grant",
"error_description": "The provided authorization grant is invalid, expired, revoked, does not match the redirection URI used in the authorization request, or was issued to another client."
}{
"error": "invalid_client",
"error_description": "Client authentication failed due to unknown client, no client authentication included, or unsupported authentication method."
}Common
group_commonAccounts
accountsRetrieve a list of accounts
Returns the accounts the user has access to.
Parameters
team_idintegerrequiredpathThe ID of the team.
includeArray<string>social_feedssubaccountsqueryA comma-separated list of related resources to include in the response.
filterobjectqueryFilters the list of accounts. All filters are combined with AND.
sortstring-idqueryA comma-separated list of attributes to sort by. Prefix an attribute with - to sort in descending order.
pageobjectqueryOffset pagination. Use page[size] to set the number of items per page and page[number] to select a page. The response's links object contains ready-to-use URLs for the next and previous pages.
Response
A list of accounts.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: accounts:read
curl -X GET 'https://api.tintup.com/v2/teams/{team_id}/accounts'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/accounts', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.tintup.com/v2/teams/{team_id}/accounts')
data = response.json(){
"data": [
{
"id": "4821",
"type": "account",
"attributes": {
"external_id": "17841401839964064",
"name": "Acme Inc.",
"username": "acme",
"image_url": "https://cdn.example.com/avatars/acme.jpg",
"site": null,
"expires_at": "2025-05-13T16:42:07.000Z",
"capabilities": [
"ingest",
"compose"
],
"meta": {},
"followers_count": 12840,
"follows_count": 312,
"media_count": 587,
"likes_count": null,
"created_at": "2025-03-14T16:42:07.000Z",
"updated_at": "2025-03-14T16:42:07.000Z"
},
"relationships": {
"social_feeds": {
"data": [
{
"id": "90211",
"type": "social_feed"
}
],
"meta": {
"count": 2
}
},
"subaccounts": {
"data": [
{
"id": "17841401839964064",
"type": "subaccount"
}
],
"meta": {
"included": false
}
}
}
}
],
"links": {
"self": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=2",
"first": "https://api.tintup.com/v2/teams/1/tints",
"next": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=3",
"prev": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=1"
}
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}Create an account
Connects an account that uses credentials (API keys, passwords, etc.) rather than OAuth, such as an SFTP product feed or a reCAPTCHA site key. The credentials are never returned. An account with the same type and external ID can only be connected once per team.
Body
The account to connect. Only account types that use credentials (API keys, passwords, etc.) can be created this way; OAuth-based accounts are connected with Authenticate an account.
dataNewAccountrequiredConnects an account using credentials instead of OAuth. Which attributes are required, or must be omitted, depends on type; see each attribute.
Parameters
team_idintegerrequiredpathThe ID of the team.
Response
The account.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Unprocessable Entity. The request is missing required parameters or the resource is invalid.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: accounts:write
curl -X POST 'https://api.tintup.com/v2/teams/{team_id}/accounts' \
-H 'Content-Type: application/vnd.api+json' \
-d '{
"data": {
"type": "account",
"attributes": {
"type": "sftp",
"access_token": "acme-feeds",
"secret": "s3cr3t-Pa55word",
"site": "sftp://files.example.com/feeds/products.csv"
}
}
}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/accounts', {
method: 'POST',
headers: {
'Content-Type': 'application/vnd.api+json',
},
body: JSON.stringify({
"data": {
"type": "account",
"attributes": {
"type": "sftp",
"access_token": "acme-feeds",
"secret": "s3cr3t-Pa55word",
"site": "sftp://files.example.com/feeds/products.csv"
}
}
}),
});
const data = await response.json();import requests
payload = {
"data": {
"type": "account",
"attributes": {
"type": "sftp",
"access_token": "acme-feeds",
"secret": "s3cr3t-Pa55word",
"site": "sftp://files.example.com/feeds/products.csv"
}
}
}
response = requests.post('https://api.tintup.com/v2/teams/{team_id}/accounts', json=payload)
data = response.json(){
"data": {
"type": "account",
"attributes": {
"type": "sftp",
"access_token": "acme-feeds",
"secret": "s3cr3t-Pa55word",
"site": "sftp://files.example.com/feeds/products.csv"
}
}
}{
"data": {
"id": "4821",
"type": "account",
"attributes": {
"external_id": "17841401839964064",
"name": "Acme Inc.",
"username": "acme",
"image_url": "https://cdn.example.com/avatars/acme.jpg",
"site": null,
"expires_at": "2025-05-13T16:42:07.000Z",
"capabilities": [
"ingest",
"compose"
],
"meta": {},
"followers_count": 12840,
"follows_count": 312,
"media_count": 587,
"likes_count": null,
"created_at": "2025-03-14T16:42:07.000Z",
"updated_at": "2025-03-14T16:42:07.000Z"
},
"relationships": {
"social_feeds": {
"data": [
{
"id": "90211",
"type": "social_feed"
}
],
"meta": {
"count": 2
}
},
"subaccounts": {
"data": [
{
"id": "17841401839964064",
"type": "subaccount"
}
],
"meta": {
"included": false
}
}
}
}
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"title": "Invalid name",
"detail": "Name can't be blank",
"source": {
"pointer": "/data/attributes/name"
}
}
]
}Retrieve an account
Parameters
team_idintegerrequiredpathThe ID of the team.
account_idintegerrequiredpathThe ID of the account.
includeArray<string>social_feedssubaccountsqueryA comma-separated list of related resources to include in the response.
Response
The account.
Not Found.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: accounts:read
curl -X GET 'https://api.tintup.com/v2/teams/{team_id}/accounts/{account_id}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/accounts/{account_id}', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.tintup.com/v2/teams/{team_id}/accounts/{account_id}')
data = response.json(){
"data": {
"id": "4821",
"type": "account",
"attributes": {
"external_id": "17841401839964064",
"name": "Acme Inc.",
"username": "acme",
"image_url": "https://cdn.example.com/avatars/acme.jpg",
"site": null,
"expires_at": "2025-05-13T16:42:07.000Z",
"capabilities": [
"ingest",
"compose"
],
"meta": {},
"followers_count": 12840,
"follows_count": 312,
"media_count": 587,
"likes_count": null,
"created_at": "2025-03-14T16:42:07.000Z",
"updated_at": "2025-03-14T16:42:07.000Z"
},
"relationships": {
"social_feeds": {
"data": [
{
"id": "90211",
"type": "social_feed"
}
],
"meta": {
"count": 2
}
},
"subaccounts": {
"data": [
{
"id": "17841401839964064",
"type": "subaccount"
}
],
"meta": {
"included": false
}
}
}
}
}{
"errors": [
{
"code": "404",
"title": "Not found",
"status": "404"
}
]
}Delete an account
Only accounts that are not in use by any social feed can be deleted; otherwise a 403 error is returned.
Parameters
team_idintegerrequiredpathThe ID of the team.
account_idintegerrequiredpathThe ID of the account.
Response
No Content. The request succeeded and there is no response body.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Not Found.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: accounts:write
curl -X DELETE 'https://api.tintup.com/v2/teams/{team_id}/accounts/{account_id}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/accounts/{account_id}', {
method: 'DELETE',
});
const data = await response.json();import requests
response = requests.delete('https://api.tintup.com/v2/teams/{team_id}/accounts/{account_id}')
data = response.json(){
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"code": "404",
"title": "Not found",
"status": "404"
}
]
}Reauthenticate an account
Returns the URL of the third-party authorization page for the account. Open this URL (usually in a popup window) so the user can grant access again. Once the user completes the authorization flow, the account's credentials are updated and the result is delivered using the origin or redirect_uri options. The user must authorize the same external account; otherwise the callback fails with a 422 error. Accounts connected with credentials (see Create an account) can't be reauthenticated and return a 422 error.
Parameters
team_idintegerrequiredpathThe ID of the team.
account_idintegerrequiredpathThe ID of the account.
originstring<uri>queryWhen specified, once the user completes the authorization flow, the callback page posts a message to window.opener using window.postMessage with this value as the target origin. The message is a JSON string of the form {"type": "account_new", "data": <response body>, "status": <HTTP status>} (account_edit when reauthenticating), where the response body is the account (or errors).
redirect_uristring<uri>queryWhen specified, once the user completes the authorization flow, the user is redirected to this URI with a data query parameter containing the same JSON message as for origin, encoded using Base64. Takes precedence over origin.
Response
The URL of the third-party authorization page. Open it (usually in a popup window) so the user can grant access.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Not Found.
Unprocessable Entity. The request is missing required parameters or the resource is invalid.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: accounts:write
curl -X GET 'https://api.tintup.com/v2/teams/{team_id}/accounts/{account_id}/edit'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/accounts/{account_id}/edit', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.tintup.com/v2/teams/{team_id}/accounts/{account_id}/edit')
data = response.json(){
"data": {
"id": "9e107d9d372bb6826bd81d3542a419d6",
"type": "redirect",
"attributes": {
"url": "https://auth.example.com/oauth/authorize?client_id=8f14e45f&response_type=code&state=eyJhbGciOiJIUzI1NiJ9"
}
}
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"code": "404",
"title": "Not found",
"status": "404"
}
]
}{
"errors": [
{
"title": "Invalid name",
"detail": "Name can't be blank",
"source": {
"pointer": "/data/attributes/name"
}
}
]
}Authenticate an account
Returns the URL of the third-party authorization page for the requested account type. Open this URL (usually in a popup window) so the user can grant access. Once the user completes the authorization flow, the account is created (and its subaccounts are fetched) and the result is delivered using the origin or redirect_uri options. If the same external account is already connected to the team, the callback fails with a 422 error.
Parameters
team_idintegerrequiredpathThe ID of the team.
typeaccountTypesrequiredqueryThe type of account to authenticate.
sitestringqueryThe store URL, for account types that are tied to a specific site. Required for shopify, where it must be a *.myshopify.com domain (shop is accepted as an alias); otherwise a 422 error is returned.
originstring<uri>queryWhen specified, once the user completes the authorization flow, the callback page posts a message to window.opener using window.postMessage with this value as the target origin. The message is a JSON string of the form {"type": "account_new", "data": <response body>, "status": <HTTP status>} (account_edit when reauthenticating), where the response body is the account (or errors).
redirect_uristring<uri>queryWhen specified, once the user completes the authorization flow, the user is redirected to this URI with a data query parameter containing the same JSON message as for origin, encoded using Base64. Takes precedence over origin.
Response
The URL of the third-party authorization page. Open it (usually in a popup window) so the user can grant access.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Unprocessable Entity. The request is missing required parameters or the resource is invalid.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: accounts:write
curl -X GET 'https://api.tintup.com/v2/teams/{team_id}/accounts/new'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/accounts/new', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.tintup.com/v2/teams/{team_id}/accounts/new')
data = response.json(){
"data": {
"id": "9e107d9d372bb6826bd81d3542a419d6",
"type": "redirect",
"attributes": {
"url": "https://auth.example.com/oauth/authorize?client_id=8f14e45f&response_type=code&state=eyJhbGciOiJIUzI1NiJ9"
}
}
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"title": "Invalid name",
"detail": "Name can't be blank",
"source": {
"pointer": "/data/attributes/name"
}
}
]
}Authentication Factors
authentication_factorsRetrieve a list of authentication factors
Returns all the authentication factors (pending and active) of the current user.
Response
All the authentication factors of the current user. This list isn't paginated.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: authentication_factors:read
curl -X GET 'https://api.tintup.com/v2/authentication_factors'const response = await fetch('https://api.tintup.com/v2/authentication_factors', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.tintup.com/v2/authentication_factors')
data = response.json(){
"data": [
{
"id": "42",
"type": "authentication_factor",
"attributes": {
"status": "pending",
"type": "one_time_password",
"channel": null,
"external_id": null,
"provisioning_url": "otpauth://totp/TrueLoyal:jane.doe%40example.com?secret=JBSWY3DPEHPK3PXPJBSWY3DPEHPK3PXP&issuer=TrueLoyal",
"created_at": "2025-03-14T16:42:07.000Z"
}
}
]
}{
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}Create an authentication factor
Adds an authentication factor to the current user. What happens next depends on the kind of authentication factor:
recovery_code, andout_of_bandwith theemailchannel, areactiveright away.out_of_bandwith thesms,voiceorfaxchannel ispending, and a code is sent toexternal_idimmediately. Verify it with Verify an authentication factor. A new code can be requested after 30 seconds with Create an authentication factor challenge.one_time_passwordispendingand has aprovisioning_urlto add to an authenticator app. Verify it with a code generated by the app.
A user can only have one authentication factor per type and channel combination.
Body
The authentication factor to add to the current user.
dataNewAuthenticationFactorrequiredThe authentication factor to add. Which attributes are allowed depends on type and channel: channel is required for (and only allowed with) out_of_band, and external_id is required for (and only allowed with) the sms, voice and fax channels.
Response
The authentication factor.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Unprocessable Entity. The request is missing required parameters or the resource is invalid.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: authentication_factors:write
id_tokenapiKey in queryA short-lived token required, in addition to an access token, to change sensitive data. See Changes to Sensitive Data.
curl -X POST 'https://api.tintup.com/v2/authentication_factors' \
-H 'Content-Type: application/vnd.api+json' \
-d '{
"data": {
"type": "authentication_factor",
"attributes": {
"type": "out_of_band",
"channel": "sms",
"external_id": "+16045550123"
}
}
}'const response = await fetch('https://api.tintup.com/v2/authentication_factors', {
method: 'POST',
headers: {
'Content-Type': 'application/vnd.api+json',
},
body: JSON.stringify({
"data": {
"type": "authentication_factor",
"attributes": {
"type": "out_of_band",
"channel": "sms",
"external_id": "+16045550123"
}
}
}),
});
const data = await response.json();import requests
payload = {
"data": {
"type": "authentication_factor",
"attributes": {
"type": "out_of_band",
"channel": "sms",
"external_id": "+16045550123"
}
}
}
response = requests.post('https://api.tintup.com/v2/authentication_factors', json=payload)
data = response.json(){
"data": {
"type": "authentication_factor",
"attributes": {
"type": "out_of_band",
"channel": "sms",
"external_id": "+16045550123"
}
}
}{
"data": {
"id": "42",
"type": "authentication_factor",
"attributes": {
"status": "pending",
"type": "one_time_password",
"channel": null,
"external_id": null,
"provisioning_url": "otpauth://totp/TrueLoyal:jane.doe%40example.com?secret=JBSWY3DPEHPK3PXPJBSWY3DPEHPK3PXP&issuer=TrueLoyal",
"created_at": "2025-03-14T16:42:07.000Z"
}
}
}{
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"title": "Invalid name",
"detail": "Name can't be blank",
"source": {
"pointer": "/data/attributes/name"
}
}
]
}Delete an authentication factor
Removes an authentication factor from the current user and emails them about it. If it was the user's default authentication factor, another active authentication factor (other than a recovery code) becomes the default.
Parameters
authentication_factor_idintegerrequiredpathThe ID of an authentication factor of the current user.
Response
No Content. The request succeeded and there is no response body.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Not Found.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: authentication_factors:write
id_tokenapiKey in queryA short-lived token required, in addition to an access token, to change sensitive data. See Changes to Sensitive Data.
curl -X DELETE 'https://api.tintup.com/v2/authentication_factors/{authentication_factor_id}'const response = await fetch('https://api.tintup.com/v2/authentication_factors/{authentication_factor_id}', {
method: 'DELETE',
});
const data = await response.json();import requests
response = requests.delete('https://api.tintup.com/v2/authentication_factors/{authentication_factor_id}')
data = response.json(){
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"code": "404",
"title": "Not found",
"status": "404"
}
]
}Verify an authentication factor
Verifies a pending authentication factor with a code it received or generated, and marks it active. If the user doesn't have a default authentication factor yet, this one becomes the default. An email is sent to the user to let them know an authentication factor was added. Only pending authentication factors can be verified; others return 404.
Body
The code used to verify the pending authentication factor.
dataAuthenticationFactorForVerifyrequiredThe code used to verify a pending authentication factor.
Parameters
authentication_factor_idintegerrequiredpathThe ID of an authentication factor of the current user.
Response
The authentication factor.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Not Found.
Unprocessable Entity. The code is missing, invalid or expired.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: authentication_factors:write
id_tokenapiKey in queryA short-lived token required, in addition to an access token, to change sensitive data. See Changes to Sensitive Data.
curl -X PATCH 'https://api.tintup.com/v2/authentication_factors/{authentication_factor_id}' \
-H 'Content-Type: application/vnd.api+json' \
-d '{
"data": {
"id": "42",
"type": "authentication_factor",
"attributes": {
"challenge": "492817",
"otp_attempt": "492817"
}
}
}'const response = await fetch('https://api.tintup.com/v2/authentication_factors/{authentication_factor_id}', {
method: 'PATCH',
headers: {
'Content-Type': 'application/vnd.api+json',
},
body: JSON.stringify({
"data": {
"id": "42",
"type": "authentication_factor",
"attributes": {
"challenge": "492817",
"otp_attempt": "492817"
}
}
}),
});
const data = await response.json();import requests
payload = {
"data": {
"id": "42",
"type": "authentication_factor",
"attributes": {
"challenge": "492817",
"otp_attempt": "492817"
}
}
}
response = requests.patch('https://api.tintup.com/v2/authentication_factors/{authentication_factor_id}', json=payload)
data = response.json(){
"data": {
"id": "42",
"type": "authentication_factor",
"attributes": {
"challenge": "492817",
"otp_attempt": "492817"
}
}
}{
"data": {
"id": "42",
"type": "authentication_factor",
"attributes": {
"status": "pending",
"type": "one_time_password",
"channel": null,
"external_id": null,
"provisioning_url": "otpauth://totp/TrueLoyal:jane.doe%40example.com?secret=JBSWY3DPEHPK3PXPJBSWY3DPEHPK3PXP&issuer=TrueLoyal",
"created_at": "2025-03-14T16:42:07.000Z"
}
}
}{
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"code": "404",
"title": "Not found",
"status": "404"
}
]
}{
"errors": [
{
"title": "Invalid challenge",
"detail": "Challenge is invalid",
"source": {
"pointer": "/data/attributes/challenge"
}
},
{
"title": "Invalid otp_attempt",
"detail": "Otp attempt is invalid",
"source": {
"pointer": "/data/attributes/otp_attempt"
}
}
]
}Create an authentication factor challenge
Sends a new code for a pending out_of_band authentication factor, for example when the user didn't receive the first one. A code is already sent when the authentication factor is created, and a new one can only be requested every 30 seconds; earlier requests return 429 with a Retry-After header. Authentication factors that are active or aren't out_of_band return 404.
Body
Optional. The authentication factor to challenge is taken from the path, so the body can be omitted.
dataNewAuthenticationFactorChallengerequiredThe challenge to create. The authentication factor is taken from the path.
Parameters
authentication_factor_idintegerrequiredpathThe ID of an authentication factor of the current user.
Response
The authentication factor challenge. A new code was sent.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Not Found.
Too Many Requests. Retry after the time given in the Retry-After header.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: authentication_factors:write
id_tokenapiKey in queryA short-lived token required, in addition to an access token, to change sensitive data. See Changes to Sensitive Data.
curl -X POST 'https://api.tintup.com/v2/authentication_factors/{authentication_factor_id}/challenges' \
-H 'Content-Type: application/vnd.api+json' \
-d '{
"data": {
"type": "authentication_factor_challenge",
"attributes": {
"authentication_factor_id": 42
}
}
}'const response = await fetch('https://api.tintup.com/v2/authentication_factors/{authentication_factor_id}/challenges', {
method: 'POST',
headers: {
'Content-Type': 'application/vnd.api+json',
},
body: JSON.stringify({
"data": {
"type": "authentication_factor_challenge",
"attributes": {
"authentication_factor_id": 42
}
}
}),
});
const data = await response.json();import requests
payload = {
"data": {
"type": "authentication_factor_challenge",
"attributes": {
"authentication_factor_id": 42
}
}
}
response = requests.post('https://api.tintup.com/v2/authentication_factors/{authentication_factor_id}/challenges', json=payload)
data = response.json(){
"data": {
"type": "authentication_factor_challenge",
"attributes": {
"authentication_factor_id": 42
}
}
}{
"data": {
"id": "SM5e0c7a1f9b3d4e2a8c6f0b1d3e5a7c9f",
"type": "authentication_factor_challenge",
"attributes": {
"retry_at": "2025-03-14T16:42:37.000Z"
}
}
}{
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"code": "404",
"title": "Not found",
"status": "404"
}
]
}{
"errors": [
{
"code": "429",
"title": "Too many requests",
"status": "429"
}
]
}Domains
domainsRetrieve a list of domains
Retrieves the team's domains that the user has access to.
Parameters
team_idintegerrequiredpathThe ID of the team.
includeArray<string>default_experiencequeryA comma-separated list of related resources to include in the response.
Response
The domains the user has access to. The list isn't paginated.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: domains:read
curl -X GET 'https://api.tintup.com/v2/teams/{team_id}/domains'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/domains', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.tintup.com/v2/teams/{team_id}/domains')
data = response.json(){
"data": [
{
"id": "42",
"type": "domain",
"attributes": {
"name": "stories.example.com",
"status": "valid",
"created_at": "2025-03-14T16:42:07.000Z",
"updated_at": "2025-03-18T09:15:32.000Z"
},
"relationships": {
"default_experience": {
"data": {
"type": "experience",
"id": "318"
}
}
},
"links": {
"self": "https://api.tintup.com/v2/teams/1/domains/42"
}
}
],
"included": [
{
"id": "42",
"type": "experience",
"attributes": {
"type": "sweepstakes",
"title": "Win a trip to Hawaii",
"description": "Enter our summer sweepstakes for a chance to win a trip for two.",
"analytics_id": "GTM-5XK7Q2P",
"analytics_type": "google_tag_manager",
"captcha_type": null,
"captcha_public_key": null,
"cookie_consent": true,
"noindex": false,
"favicon_url": "https://cdn.example.com/favicons/acme.png",
"maximum_image_size": 104857600,
"maximum_video_size": 1048576000,
"bypass_mime_type_validation": false,
"name": "Summer Sweepstakes 2025",
"status": "active",
"slug": "summer-sweepstakes",
"data": {
"draft": [
{
"sectionType": "banner",
"data": {
"content": {
"title": "Win a trip to Hawaii"
}
}
},
{
"sectionType": "form",
"data": {
"content": {
"fields": [
{
"key": "email",
"type": "email"
}
]
}
}
}
],
"published": [
{
"sectionType": "banner",
"data": {
"content": {
"title": "Win a trip to Hawaii"
}
}
},
{
"sectionType": "form",
"data": {
"content": {
"fields": [
{
"key": "email",
"type": "email"
}
]
}
}
}
],
"locales": {
"draft": [
{
"value": "en",
"isDefault": true
}
],
"published": [
{
"value": "en",
"isDefault": true
}
]
},
"translations": {
"draft": {
"en": {}
},
"published": {
"en": {}
}
},
"customFonts": {
"draft": {},
"published": {}
}
},
"created_at": "2025-03-14T16:42:07.000Z",
"updated_at": "2025-03-18T09:12:44.000Z"
},
"relationships": {
"domain": {
"data": {
"type": "domain",
"id": "3"
}
},
"form_submission_keys": {
"data": [
{
"type": "form_submission_key",
"id": "email"
}
],
"meta": {
"included": false
}
},
"user": {
"data": {
"type": "team",
"id": "1"
},
"meta": {
"included": false
}
},
"submissions": {
"data": [
{
"type": "form_submission",
"id": "88213"
}
],
"links": {
"related": "https://api.tintup.com/v2/teams/1/experiences/42/form_submissions",
"first": "https://api.tintup.com/v2/teams/1/experiences/42/form_submissions",
"next": "https://api.tintup.com/v2/teams/1/experiences/42/form_submissions?page%5Bnumber%5D=2"
},
"meta": {
"total": 1289,
"count": 1289
}
}
},
"links": {
"public": "https://contests.example.com/summer-sweepstakes"
}
}
]
}{
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}Create a domain
Adds a custom domain to the team and starts issuing its SSL certificate; the domain's status is pending until the certificate has been issued. The new domain is automatically shared with the user's role and with every role that has access to new domains.
Body
The domain to create.
dataNewDomainrequiredParameters
team_idintegerrequiredpathThe ID of the team.
Response
The domain.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope or the user doesn't have access to the domain.
Unprocessable Entity. The request is missing required parameters or the resource is invalid.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: domains:write
curl -X POST 'https://api.tintup.com/v2/teams/{team_id}/domains' \
-H 'Content-Type: application/vnd.api+json' \
-d '{
"data": {
"type": "domain",
"attributes": {
"name": "stories.example.com"
}
}
}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/domains', {
method: 'POST',
headers: {
'Content-Type': 'application/vnd.api+json',
},
body: JSON.stringify({
"data": {
"type": "domain",
"attributes": {
"name": "stories.example.com"
}
}
}),
});
const data = await response.json();import requests
payload = {
"data": {
"type": "domain",
"attributes": {
"name": "stories.example.com"
}
}
}
response = requests.post('https://api.tintup.com/v2/teams/{team_id}/domains', json=payload)
data = response.json(){
"data": {
"type": "domain",
"attributes": {
"name": "stories.example.com"
}
}
}{
"data": {
"id": "42",
"type": "domain",
"attributes": {
"name": "stories.example.com",
"status": "valid",
"created_at": "2025-03-14T16:42:07.000Z",
"updated_at": "2025-03-18T09:15:32.000Z"
},
"relationships": {
"default_experience": {
"data": {
"type": "experience",
"id": "318"
}
}
},
"links": {
"self": "https://api.tintup.com/v2/teams/1/domains/42"
}
},
"included": [
{
"id": "42",
"type": "experience",
"attributes": {
"type": "sweepstakes",
"title": "Win a trip to Hawaii",
"description": "Enter our summer sweepstakes for a chance to win a trip for two.",
"analytics_id": "GTM-5XK7Q2P",
"analytics_type": "google_tag_manager",
"captcha_type": null,
"captcha_public_key": null,
"cookie_consent": true,
"noindex": false,
"favicon_url": "https://cdn.example.com/favicons/acme.png",
"maximum_image_size": 104857600,
"maximum_video_size": 1048576000,
"bypass_mime_type_validation": false,
"name": "Summer Sweepstakes 2025",
"status": "active",
"slug": "summer-sweepstakes",
"data": {
"draft": [
{
"sectionType": "banner",
"data": {
"content": {
"title": "Win a trip to Hawaii"
}
}
},
{
"sectionType": "form",
"data": {
"content": {
"fields": [
{
"key": "email",
"type": "email"
}
]
}
}
}
],
"published": [
{
"sectionType": "banner",
"data": {
"content": {
"title": "Win a trip to Hawaii"
}
}
},
{
"sectionType": "form",
"data": {
"content": {
"fields": [
{
"key": "email",
"type": "email"
}
]
}
}
}
],
"locales": {
"draft": [
{
"value": "en",
"isDefault": true
}
],
"published": [
{
"value": "en",
"isDefault": true
}
]
},
"translations": {
"draft": {
"en": {}
},
"published": {
"en": {}
}
},
"customFonts": {
"draft": {},
"published": {}
}
},
"created_at": "2025-03-14T16:42:07.000Z",
"updated_at": "2025-03-18T09:12:44.000Z"
},
"relationships": {
"domain": {
"data": {
"type": "domain",
"id": "3"
}
},
"form_submission_keys": {
"data": [
{
"type": "form_submission_key",
"id": "email"
}
],
"meta": {
"included": false
}
},
"user": {
"data": {
"type": "team",
"id": "1"
},
"meta": {
"included": false
}
},
"submissions": {
"data": [
{
"type": "form_submission",
"id": "88213"
}
],
"links": {
"related": "https://api.tintup.com/v2/teams/1/experiences/42/form_submissions",
"first": "https://api.tintup.com/v2/teams/1/experiences/42/form_submissions",
"next": "https://api.tintup.com/v2/teams/1/experiences/42/form_submissions?page%5Bnumber%5D=2"
},
"meta": {
"total": 1289,
"count": 1289
}
}
},
"links": {
"public": "https://contests.example.com/summer-sweepstakes"
}
}
]
}{
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "403",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"title": "Invalid name",
"detail": "Name can't be blank",
"source": {
"pointer": "/data/attributes/name"
}
}
]
}Retrieve a domain
Retrieves one of the team's domains.
Parameters
team_idintegerrequiredpathThe ID of the team.
domain_idintegerrequiredpathThe ID of the domain.
includeArray<string>default_experiencequeryA comma-separated list of related resources to include in the response.
Response
The domain.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Not Found.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: domains:read
curl -X GET 'https://api.tintup.com/v2/teams/{team_id}/domains/{domain_id}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/domains/{domain_id}', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.tintup.com/v2/teams/{team_id}/domains/{domain_id}')
data = response.json(){
"data": {
"id": "42",
"type": "domain",
"attributes": {
"name": "stories.example.com",
"status": "valid",
"created_at": "2025-03-14T16:42:07.000Z",
"updated_at": "2025-03-18T09:15:32.000Z"
},
"relationships": {
"default_experience": {
"data": {
"type": "experience",
"id": "318"
}
}
},
"links": {
"self": "https://api.tintup.com/v2/teams/1/domains/42"
}
},
"included": [
{
"id": "42",
"type": "experience",
"attributes": {
"type": "sweepstakes",
"title": "Win a trip to Hawaii",
"description": "Enter our summer sweepstakes for a chance to win a trip for two.",
"analytics_id": "GTM-5XK7Q2P",
"analytics_type": "google_tag_manager",
"captcha_type": null,
"captcha_public_key": null,
"cookie_consent": true,
"noindex": false,
"favicon_url": "https://cdn.example.com/favicons/acme.png",
"maximum_image_size": 104857600,
"maximum_video_size": 1048576000,
"bypass_mime_type_validation": false,
"name": "Summer Sweepstakes 2025",
"status": "active",
"slug": "summer-sweepstakes",
"data": {
"draft": [
{
"sectionType": "banner",
"data": {
"content": {
"title": "Win a trip to Hawaii"
}
}
},
{
"sectionType": "form",
"data": {
"content": {
"fields": [
{
"key": "email",
"type": "email"
}
]
}
}
}
],
"published": [
{
"sectionType": "banner",
"data": {
"content": {
"title": "Win a trip to Hawaii"
}
}
},
{
"sectionType": "form",
"data": {
"content": {
"fields": [
{
"key": "email",
"type": "email"
}
]
}
}
}
],
"locales": {
"draft": [
{
"value": "en",
"isDefault": true
}
],
"published": [
{
"value": "en",
"isDefault": true
}
]
},
"translations": {
"draft": {
"en": {}
},
"published": {
"en": {}
}
},
"customFonts": {
"draft": {},
"published": {}
}
},
"created_at": "2025-03-14T16:42:07.000Z",
"updated_at": "2025-03-18T09:12:44.000Z"
},
"relationships": {
"domain": {
"data": {
"type": "domain",
"id": "3"
}
},
"form_submission_keys": {
"data": [
{
"type": "form_submission_key",
"id": "email"
}
],
"meta": {
"included": false
}
},
"user": {
"data": {
"type": "team",
"id": "1"
},
"meta": {
"included": false
}
},
"submissions": {
"data": [
{
"type": "form_submission",
"id": "88213"
}
],
"links": {
"related": "https://api.tintup.com/v2/teams/1/experiences/42/form_submissions",
"first": "https://api.tintup.com/v2/teams/1/experiences/42/form_submissions",
"next": "https://api.tintup.com/v2/teams/1/experiences/42/form_submissions?page%5Bnumber%5D=2"
},
"meta": {
"total": 1289,
"count": 1289
}
}
},
"links": {
"public": "https://contests.example.com/summer-sweepstakes"
}
}
]
}{
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"code": "404",
"title": "Not found",
"status": "404"
}
]
}Delete a domain
Deletes the domain. Experiences published on it are detached from the domain.
Parameters
team_idintegerrequiredpathThe ID of the team.
domain_idintegerrequiredpathThe ID of the domain.
Response
No Content. The request succeeded and there is no response body.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Not Found.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: domains:write
curl -X DELETE 'https://api.tintup.com/v2/teams/{team_id}/domains/{domain_id}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/domains/{domain_id}', {
method: 'DELETE',
});
const data = await response.json();import requests
response = requests.delete('https://api.tintup.com/v2/teams/{team_id}/domains/{domain_id}')
data = response.json(){
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"code": "404",
"title": "Not found",
"status": "404"
}
]
}Update a domain
Sets or clears the experience shown at the root of the domain. The domain's name can't be changed.
Body
The attributes to update.
dataDomainUpdaterequiredParameters
team_idintegerrequiredpathThe ID of the team.
domain_idintegerrequiredpathThe ID of the domain.
Response
The domain.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Not Found.
Unprocessable Entity. The request is missing required parameters or the resource is invalid.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: domains:write
curl -X PATCH 'https://api.tintup.com/v2/teams/{team_id}/domains/{domain_id}' \
-H 'Content-Type: application/vnd.api+json' \
-d '{
"data": {
"type": "domain",
"id": "42",
"attributes": {
"default_experience_id": 318
}
}
}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/domains/{domain_id}', {
method: 'PATCH',
headers: {
'Content-Type': 'application/vnd.api+json',
},
body: JSON.stringify({
"data": {
"type": "domain",
"id": "42",
"attributes": {
"default_experience_id": 318
}
}
}),
});
const data = await response.json();import requests
payload = {
"data": {
"type": "domain",
"id": "42",
"attributes": {
"default_experience_id": 318
}
}
}
response = requests.patch('https://api.tintup.com/v2/teams/{team_id}/domains/{domain_id}', json=payload)
data = response.json(){
"data": {
"type": "domain",
"id": "42",
"attributes": {
"default_experience_id": 318
}
}
}{
"data": {
"id": "42",
"type": "domain",
"attributes": {
"name": "stories.example.com",
"status": "valid",
"created_at": "2025-03-14T16:42:07.000Z",
"updated_at": "2025-03-18T09:15:32.000Z"
},
"relationships": {
"default_experience": {
"data": {
"type": "experience",
"id": "318"
}
}
},
"links": {
"self": "https://api.tintup.com/v2/teams/1/domains/42"
}
},
"included": [
{
"id": "42",
"type": "experience",
"attributes": {
"type": "sweepstakes",
"title": "Win a trip to Hawaii",
"description": "Enter our summer sweepstakes for a chance to win a trip for two.",
"analytics_id": "GTM-5XK7Q2P",
"analytics_type": "google_tag_manager",
"captcha_type": null,
"captcha_public_key": null,
"cookie_consent": true,
"noindex": false,
"favicon_url": "https://cdn.example.com/favicons/acme.png",
"maximum_image_size": 104857600,
"maximum_video_size": 1048576000,
"bypass_mime_type_validation": false,
"name": "Summer Sweepstakes 2025",
"status": "active",
"slug": "summer-sweepstakes",
"data": {
"draft": [
{
"sectionType": "banner",
"data": {
"content": {
"title": "Win a trip to Hawaii"
}
}
},
{
"sectionType": "form",
"data": {
"content": {
"fields": [
{
"key": "email",
"type": "email"
}
]
}
}
}
],
"published": [
{
"sectionType": "banner",
"data": {
"content": {
"title": "Win a trip to Hawaii"
}
}
},
{
"sectionType": "form",
"data": {
"content": {
"fields": [
{
"key": "email",
"type": "email"
}
]
}
}
}
],
"locales": {
"draft": [
{
"value": "en",
"isDefault": true
}
],
"published": [
{
"value": "en",
"isDefault": true
}
]
},
"translations": {
"draft": {
"en": {}
},
"published": {
"en": {}
}
},
"customFonts": {
"draft": {},
"published": {}
}
},
"created_at": "2025-03-14T16:42:07.000Z",
"updated_at": "2025-03-18T09:12:44.000Z"
},
"relationships": {
"domain": {
"data": {
"type": "domain",
"id": "3"
}
},
"form_submission_keys": {
"data": [
{
"type": "form_submission_key",
"id": "email"
}
],
"meta": {
"included": false
}
},
"user": {
"data": {
"type": "team",
"id": "1"
},
"meta": {
"included": false
}
},
"submissions": {
"data": [
{
"type": "form_submission",
"id": "88213"
}
],
"links": {
"related": "https://api.tintup.com/v2/teams/1/experiences/42/form_submissions",
"first": "https://api.tintup.com/v2/teams/1/experiences/42/form_submissions",
"next": "https://api.tintup.com/v2/teams/1/experiences/42/form_submissions?page%5Bnumber%5D=2"
},
"meta": {
"total": 1289,
"count": 1289
}
}
},
"links": {
"public": "https://contests.example.com/summer-sweepstakes"
}
}
]
}{
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"code": "404",
"title": "Not found",
"status": "404"
}
]
}{
"errors": [
{
"title": "Invalid name",
"detail": "Name can't be blank",
"source": {
"pointer": "/data/attributes/name"
}
}
]
}Email Templates
email_templatesRetrieve a list of email templates
Retrieves the team's email templates. Any member of the team can list them.
Parameters
team_idintegerrequiredpathThe ID of the team.
pageobjectqueryOffset pagination. Use page[size] to set the number of items per page and page[number] to select a page. The response's links object contains ready-to-use URLs for the next and previous pages.
filterobjectqueryFilters the email templates.
sortArray<string>id-idname-nametype-typecreated_at-created_atupdated_at-updated_at-idqueryA comma-separated list of fields to sort by. Prefix a field with - to sort in descending order. Defaults to -id (newest first).
includeArray<string>teamqueryA comma-separated list of related resources to include in the response.
Response
A page of the team's email templates.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: email_templates:read
curl -X GET 'https://api.tintup.com/v2/teams/{team_id}/email_templates'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/email_templates', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.tintup.com/v2/teams/{team_id}/email_templates')
data = response.json(){
"data": [
{
"id": "15",
"type": "email_templates",
"attributes": {
"name": "Post-purchase review request",
"type": "review_solicitation",
"locales": {
"en": {
"from": {
"name": "Acme Inc.",
"email": "reviews@example.com"
},
"subject": "Thanks for your review, {{ post.author.name }}",
"body": "<p>Hi {{ post.author.name }},</p>\n<p>Thanks for reviewing us. Here's our reply:</p>\n<blockquote>{{ reply.text }}</blockquote>\n<p>The {{ team.name }} team</p>"
},
"fr": {
"from": {
"name": "Acme Inc.",
"email": "reviews@example.com"
},
"subject": "Merci pour votre avis, {{ post.author.name }}",
"body": "<p>Bonjour {{ post.author.name }},</p>\n<p>Merci pour votre avis. Voici notre réponse :</p>\n<blockquote>{{ reply.text }}</blockquote>\n<p>L'équipe {{ team.name }}</p>"
}
},
"created_at": "2025-03-14T16:42:07.000Z",
"updated_at": "2025-03-18T09:15:32.000Z"
},
"relationships": {
"team": {
"data": {
"type": "team",
"id": "1"
},
"meta": {
"included": false
}
}
}
}
],
"included": [
{
"id": "1",
"type": "team",
"attributes": {
"name": "Acme Inc.",
"image_url": "https://cdn.example.com/logos/acme.png",
"url_shortener_type": "tintly",
"onboarding": "completed",
"shared_tags": [
"summer",
"ugc"
],
"saml_enabled": true,
"idp_entity_id": "https://idp.example.com/metadata",
"idp_sso_target_url": "https://idp.example.com/sso/saml",
"idp_cert": "-----BEGIN CERTIFICATE-----\nMIIDdzCCAl+gAwIBAgIEbGx0ZTANBgkqhkiG9w0BAQsFADBsMRAwDgYDVQQGEwdV\n-----END CERTIFICATE-----",
"force_authn": false,
"authn_requests_signed": false,
"want_assertions_signed": true,
"want_assertions_encrypted": false,
"saml_jit_provisioning": true,
"oidc_enabled": false,
"oidc_identifier": "0oa1b2c3d4e5f6g7h8i9",
"oidc_secret": "9f8e7d6c5b4a39281706f5e4d3c2b1a0",
"oidc_scope": "openid email profile",
"oidc_issuer": "https://login.example.com",
"oidc_authorization_endpoint": "https://login.example.com/oauth2/v1/authorize",
"oidc_token_endpoint": "https://login.example.com/oauth2/v1/token",
"oidc_userinfo_endpoint": "https://login.example.com/oauth2/v1/userinfo",
"oidc_jwks_uri": "https://login.example.com/oauth2/v1/keys",
"plan": "tint_professional",
"plan_expires_at": "2026-03-14T00:00:00.000Z",
"plan_changed_at": "2025-03-14T16:42:07.000Z",
"self_service": false,
"rewards_platform_id": "mrc_4f7a2b9c",
"rewards_platform_key": "7d1e3c5a9b2f4e6d8c0a1b3d5f7e9c2a",
"permissions": [
"moderate_tint",
"modify_tint",
"assets_read"
],
"created_at": "2024-11-02T10:05:44.000Z",
"updated_at": "2025-03-14T16:42:07.000Z"
},
"relationships": {
"role": {
"data": {
"type": "role",
"id": "3"
}
},
"plan": {
"data": {
"type": "plan",
"id": "1"
}
},
"agent": {
"data": {
"type": "agent",
"id": "7"
}
},
"tints": {
"data": [
{
"type": "tint",
"id": "1"
}
],
"meta": {
"active_tints_count": 4,
"count": 6
}
},
"social_feeds": {
"data": [
{
"type": "social_feed",
"id": "1"
}
],
"meta": {
"active_count": 12,
"inactive_count": 3,
"access_error_count": 1,
"active_social_feeds_count": 12,
"inactive_social_feeds_count": 3
}
},
"posts": {
"data": [
{
"type": "post",
"id": "1"
}
],
"meta": {
"posts_ingested_from_beginning_of_month": 18250
}
},
"assets": {
"data": [
{
"type": "asset",
"id": "1"
}
],
"meta": {
"count": 320,
"uploaded_count": 45,
"total": 320,
"uploaded_total": 45
}
},
"mixes": {
"data": [
{
"type": "mix",
"id": "1"
}
],
"meta": {
"count": 2
}
},
"forms": {
"data": [
{
"type": "form",
"id": "1"
}
],
"meta": {
"count": 5,
"published_count": 3
}
},
"personalizations": {
"data": [
{
"type": "personalization",
"id": "1"
}
],
"meta": {
"count": 8
}
}
}
}
],
"links": {
"self": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=2",
"first": "https://api.tintup.com/v2/teams/1/tints",
"next": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=3",
"prev": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=1"
}
}{
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}Create an email template
Creates an email template for the team. Any member of the team can create one.
Body
The email template to create.
dataNewEmailTemplaterequiredParameters
team_idintegerrequiredpathThe ID of the team.
Response
The email template.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Unprocessable Entity. The request is missing required parameters or the resource is invalid.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: email_templates:write
curl -X POST 'https://api.tintup.com/v2/teams/{team_id}/email_templates' \
-H 'Content-Type: application/vnd.api+json' \
-d '{
"data": {
"type": "email_templates",
"attributes": {
"name": "Review reply",
"type": "review_reply",
"locales": {
"en": {
"from": {
"name": "Acme Inc.",
"email": "reviews@example.com"
},
"subject": "Thanks for your review, {{ post.author.name }}",
"body": "<p>Hi {{ post.author.name }},</p>\n<p>Thanks for reviewing us. Here'\''s our reply:</p>\n<blockquote>{{ reply.text }}</blockquote>\n<p>The {{ team.name }} team</p>"
}
}
}
}
}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/email_templates', {
method: 'POST',
headers: {
'Content-Type': 'application/vnd.api+json',
},
body: JSON.stringify({
"data": {
"type": "email_templates",
"attributes": {
"name": "Review reply",
"type": "review_reply",
"locales": {
"en": {
"from": {
"name": "Acme Inc.",
"email": "reviews@example.com"
},
"subject": "Thanks for your review, {{ post.author.name }}",
"body": "<p>Hi {{ post.author.name }},</p>\n<p>Thanks for reviewing us. Here's our reply:</p>\n<blockquote>{{ reply.text }}</blockquote>\n<p>The {{ team.name }} team</p>"
}
}
}
}
}),
});
const data = await response.json();import requests
payload = {
"data": {
"type": "email_templates",
"attributes": {
"name": "Review reply",
"type": "review_reply",
"locales": {
"en": {
"from": {
"name": "Acme Inc.",
"email": "reviews@example.com"
},
"subject": "Thanks for your review, {{ post.author.name }}",
"body": "<p>Hi {{ post.author.name }},</p>\n<p>Thanks for reviewing us. Here's our reply:</p>\n<blockquote>{{ reply.text }}</blockquote>\n<p>The {{ team.name }} team</p>"
}
}
}
}
}
response = requests.post('https://api.tintup.com/v2/teams/{team_id}/email_templates', json=payload)
data = response.json(){
"data": {
"type": "email_templates",
"attributes": {
"name": "Review reply",
"type": "review_reply",
"locales": {
"en": {
"from": {
"name": "Acme Inc.",
"email": "reviews@example.com"
},
"subject": "Thanks for your review, {{ post.author.name }}",
"body": "<p>Hi {{ post.author.name }},</p>\n<p>Thanks for reviewing us. Here's our reply:</p>\n<blockquote>{{ reply.text }}</blockquote>\n<p>The {{ team.name }} team</p>"
}
}
}
}
}{
"data": {
"id": "15",
"type": "email_templates",
"attributes": {
"name": "Post-purchase review request",
"type": "review_solicitation",
"locales": {
"en": {
"from": {
"name": "Acme Inc.",
"email": "reviews@example.com"
},
"subject": "Thanks for your review, {{ post.author.name }}",
"body": "<p>Hi {{ post.author.name }},</p>\n<p>Thanks for reviewing us. Here's our reply:</p>\n<blockquote>{{ reply.text }}</blockquote>\n<p>The {{ team.name }} team</p>"
},
"fr": {
"from": {
"name": "Acme Inc.",
"email": "reviews@example.com"
},
"subject": "Merci pour votre avis, {{ post.author.name }}",
"body": "<p>Bonjour {{ post.author.name }},</p>\n<p>Merci pour votre avis. Voici notre réponse :</p>\n<blockquote>{{ reply.text }}</blockquote>\n<p>L'équipe {{ team.name }}</p>"
}
},
"created_at": "2025-03-14T16:42:07.000Z",
"updated_at": "2025-03-18T09:15:32.000Z"
},
"relationships": {
"team": {
"data": {
"type": "team",
"id": "1"
},
"meta": {
"included": false
}
}
}
},
"included": [
{
"id": "1",
"type": "team",
"attributes": {
"name": "Acme Inc.",
"image_url": "https://cdn.example.com/logos/acme.png",
"url_shortener_type": "tintly",
"onboarding": "completed",
"shared_tags": [
"summer",
"ugc"
],
"saml_enabled": true,
"idp_entity_id": "https://idp.example.com/metadata",
"idp_sso_target_url": "https://idp.example.com/sso/saml",
"idp_cert": "-----BEGIN CERTIFICATE-----\nMIIDdzCCAl+gAwIBAgIEbGx0ZTANBgkqhkiG9w0BAQsFADBsMRAwDgYDVQQGEwdV\n-----END CERTIFICATE-----",
"force_authn": false,
"authn_requests_signed": false,
"want_assertions_signed": true,
"want_assertions_encrypted": false,
"saml_jit_provisioning": true,
"oidc_enabled": false,
"oidc_identifier": "0oa1b2c3d4e5f6g7h8i9",
"oidc_secret": "9f8e7d6c5b4a39281706f5e4d3c2b1a0",
"oidc_scope": "openid email profile",
"oidc_issuer": "https://login.example.com",
"oidc_authorization_endpoint": "https://login.example.com/oauth2/v1/authorize",
"oidc_token_endpoint": "https://login.example.com/oauth2/v1/token",
"oidc_userinfo_endpoint": "https://login.example.com/oauth2/v1/userinfo",
"oidc_jwks_uri": "https://login.example.com/oauth2/v1/keys",
"plan": "tint_professional",
"plan_expires_at": "2026-03-14T00:00:00.000Z",
"plan_changed_at": "2025-03-14T16:42:07.000Z",
"self_service": false,
"rewards_platform_id": "mrc_4f7a2b9c",
"rewards_platform_key": "7d1e3c5a9b2f4e6d8c0a1b3d5f7e9c2a",
"permissions": [
"moderate_tint",
"modify_tint",
"assets_read"
],
"created_at": "2024-11-02T10:05:44.000Z",
"updated_at": "2025-03-14T16:42:07.000Z"
},
"relationships": {
"role": {
"data": {
"type": "role",
"id": "3"
}
},
"plan": {
"data": {
"type": "plan",
"id": "1"
}
},
"agent": {
"data": {
"type": "agent",
"id": "7"
}
},
"tints": {
"data": [
{
"type": "tint",
"id": "1"
}
],
"meta": {
"active_tints_count": 4,
"count": 6
}
},
"social_feeds": {
"data": [
{
"type": "social_feed",
"id": "1"
}
],
"meta": {
"active_count": 12,
"inactive_count": 3,
"access_error_count": 1,
"active_social_feeds_count": 12,
"inactive_social_feeds_count": 3
}
},
"posts": {
"data": [
{
"type": "post",
"id": "1"
}
],
"meta": {
"posts_ingested_from_beginning_of_month": 18250
}
},
"assets": {
"data": [
{
"type": "asset",
"id": "1"
}
],
"meta": {
"count": 320,
"uploaded_count": 45,
"total": 320,
"uploaded_total": 45
}
},
"mixes": {
"data": [
{
"type": "mix",
"id": "1"
}
],
"meta": {
"count": 2
}
},
"forms": {
"data": [
{
"type": "form",
"id": "1"
}
],
"meta": {
"count": 5,
"published_count": 3
}
},
"personalizations": {
"data": [
{
"type": "personalization",
"id": "1"
}
],
"meta": {
"count": 8
}
}
}
}
]
}{
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"title": "Invalid name",
"detail": "Name can't be blank",
"source": {
"pointer": "/data/attributes/name"
}
}
]
}Delete multiple email templates
Deletes several of the team's email templates at once. IDs that don't match one of the team's templates are ignored.
Body
The email templates to delete.
dataArray<EmailTemplateBulkDelete>requiredParameters
team_idintegerrequiredpathThe ID of the team.
Response
No Content. The request succeeded and there is no response body.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Unprocessable Entity. The request is missing required parameters or the resource is invalid.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: email_templates:write
curl -X DELETE 'https://api.tintup.com/v2/teams/{team_id}/email_templates' \
-H 'Content-Type: application/vnd.api+json; ext=bulk' \
-d '{
"data": [
{
"type": "email_templates",
"id": "15"
},
{
"type": "email_templates",
"id": "16"
}
]
}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/email_templates', {
method: 'DELETE',
headers: {
'Content-Type': 'application/vnd.api+json; ext=bulk',
},
body: JSON.stringify({
"data": [
{
"type": "email_templates",
"id": "15"
},
{
"type": "email_templates",
"id": "16"
}
]
}),
});
const data = await response.json();import requests
payload = {
"data": [
{
"type": "email_templates",
"id": "15"
},
{
"type": "email_templates",
"id": "16"
}
]
}
response = requests.delete('https://api.tintup.com/v2/teams/{team_id}/email_templates', json=payload)
data = response.json(){
"data": [
{
"type": "email_templates",
"id": "15"
},
{
"type": "email_templates",
"id": "16"
}
]
}{
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"title": "Invalid name",
"detail": "Name can't be blank",
"source": {
"pointer": "/data/attributes/name"
}
}
]
}Retrieve an email template
Retrieves one of the team's email templates.
Parameters
team_idintegerrequiredpathThe ID of the team.
email_template_idintegerrequiredpathThe ID of the email template.
includeArray<string>teamqueryA comma-separated list of related resources to include in the response.
Response
The email template.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Not Found.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: email_templates:read
curl -X GET 'https://api.tintup.com/v2/teams/{team_id}/email_templates/{email_template_id}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/email_templates/{email_template_id}', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.tintup.com/v2/teams/{team_id}/email_templates/{email_template_id}')
data = response.json(){
"data": {
"id": "15",
"type": "email_templates",
"attributes": {
"name": "Post-purchase review request",
"type": "review_solicitation",
"locales": {
"en": {
"from": {
"name": "Acme Inc.",
"email": "reviews@example.com"
},
"subject": "Thanks for your review, {{ post.author.name }}",
"body": "<p>Hi {{ post.author.name }},</p>\n<p>Thanks for reviewing us. Here's our reply:</p>\n<blockquote>{{ reply.text }}</blockquote>\n<p>The {{ team.name }} team</p>"
},
"fr": {
"from": {
"name": "Acme Inc.",
"email": "reviews@example.com"
},
"subject": "Merci pour votre avis, {{ post.author.name }}",
"body": "<p>Bonjour {{ post.author.name }},</p>\n<p>Merci pour votre avis. Voici notre réponse :</p>\n<blockquote>{{ reply.text }}</blockquote>\n<p>L'équipe {{ team.name }}</p>"
}
},
"created_at": "2025-03-14T16:42:07.000Z",
"updated_at": "2025-03-18T09:15:32.000Z"
},
"relationships": {
"team": {
"data": {
"type": "team",
"id": "1"
},
"meta": {
"included": false
}
}
}
},
"included": [
{
"id": "1",
"type": "team",
"attributes": {
"name": "Acme Inc.",
"image_url": "https://cdn.example.com/logos/acme.png",
"url_shortener_type": "tintly",
"onboarding": "completed",
"shared_tags": [
"summer",
"ugc"
],
"saml_enabled": true,
"idp_entity_id": "https://idp.example.com/metadata",
"idp_sso_target_url": "https://idp.example.com/sso/saml",
"idp_cert": "-----BEGIN CERTIFICATE-----\nMIIDdzCCAl+gAwIBAgIEbGx0ZTANBgkqhkiG9w0BAQsFADBsMRAwDgYDVQQGEwdV\n-----END CERTIFICATE-----",
"force_authn": false,
"authn_requests_signed": false,
"want_assertions_signed": true,
"want_assertions_encrypted": false,
"saml_jit_provisioning": true,
"oidc_enabled": false,
"oidc_identifier": "0oa1b2c3d4e5f6g7h8i9",
"oidc_secret": "9f8e7d6c5b4a39281706f5e4d3c2b1a0",
"oidc_scope": "openid email profile",
"oidc_issuer": "https://login.example.com",
"oidc_authorization_endpoint": "https://login.example.com/oauth2/v1/authorize",
"oidc_token_endpoint": "https://login.example.com/oauth2/v1/token",
"oidc_userinfo_endpoint": "https://login.example.com/oauth2/v1/userinfo",
"oidc_jwks_uri": "https://login.example.com/oauth2/v1/keys",
"plan": "tint_professional",
"plan_expires_at": "2026-03-14T00:00:00.000Z",
"plan_changed_at": "2025-03-14T16:42:07.000Z",
"self_service": false,
"rewards_platform_id": "mrc_4f7a2b9c",
"rewards_platform_key": "7d1e3c5a9b2f4e6d8c0a1b3d5f7e9c2a",
"permissions": [
"moderate_tint",
"modify_tint",
"assets_read"
],
"created_at": "2024-11-02T10:05:44.000Z",
"updated_at": "2025-03-14T16:42:07.000Z"
},
"relationships": {
"role": {
"data": {
"type": "role",
"id": "3"
}
},
"plan": {
"data": {
"type": "plan",
"id": "1"
}
},
"agent": {
"data": {
"type": "agent",
"id": "7"
}
},
"tints": {
"data": [
{
"type": "tint",
"id": "1"
}
],
"meta": {
"active_tints_count": 4,
"count": 6
}
},
"social_feeds": {
"data": [
{
"type": "social_feed",
"id": "1"
}
],
"meta": {
"active_count": 12,
"inactive_count": 3,
"access_error_count": 1,
"active_social_feeds_count": 12,
"inactive_social_feeds_count": 3
}
},
"posts": {
"data": [
{
"type": "post",
"id": "1"
}
],
"meta": {
"posts_ingested_from_beginning_of_month": 18250
}
},
"assets": {
"data": [
{
"type": "asset",
"id": "1"
}
],
"meta": {
"count": 320,
"uploaded_count": 45,
"total": 320,
"uploaded_total": 45
}
},
"mixes": {
"data": [
{
"type": "mix",
"id": "1"
}
],
"meta": {
"count": 2
}
},
"forms": {
"data": [
{
"type": "form",
"id": "1"
}
],
"meta": {
"count": 5,
"published_count": 3
}
},
"personalizations": {
"data": [
{
"type": "personalization",
"id": "1"
}
],
"meta": {
"count": 8
}
}
}
}
]
}{
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"code": "404",
"title": "Not found",
"status": "404"
}
]
}Delete an email template
Deletes the email template.
Parameters
team_idintegerrequiredpathThe ID of the team.
email_template_idintegerrequiredpathThe ID of the email template.
Response
No Content. The request succeeded and there is no response body.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Not Found.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: email_templates:write
curl -X DELETE 'https://api.tintup.com/v2/teams/{team_id}/email_templates/{email_template_id}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/email_templates/{email_template_id}', {
method: 'DELETE',
});
const data = await response.json();import requests
response = requests.delete('https://api.tintup.com/v2/teams/{team_id}/email_templates/{email_template_id}')
data = response.json(){
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"code": "404",
"title": "Not found",
"status": "404"
}
]
}Update an email template
Updates the template's name or content. The template's type can't be changed.
Body
The attributes to update.
dataEmailTemplateUpdaterequiredParameters
team_idintegerrequiredpathThe ID of the team.
email_template_idintegerrequiredpathThe ID of the email template.
Response
The email template.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Not Found.
Unprocessable Entity. The request is missing required parameters or the resource is invalid.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: email_templates:write
curl -X PATCH 'https://api.tintup.com/v2/teams/{team_id}/email_templates/{email_template_id}' \
-H 'Content-Type: application/vnd.api+json' \
-d '{
"data": {
"type": "email_templates",
"id": "15",
"attributes": {
"name": "Post-purchase review request (v2)"
}
}
}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/email_templates/{email_template_id}', {
method: 'PATCH',
headers: {
'Content-Type': 'application/vnd.api+json',
},
body: JSON.stringify({
"data": {
"type": "email_templates",
"id": "15",
"attributes": {
"name": "Post-purchase review request (v2)"
}
}
}),
});
const data = await response.json();import requests
payload = {
"data": {
"type": "email_templates",
"id": "15",
"attributes": {
"name": "Post-purchase review request (v2)"
}
}
}
response = requests.patch('https://api.tintup.com/v2/teams/{team_id}/email_templates/{email_template_id}', json=payload)
data = response.json(){
"data": {
"type": "email_templates",
"id": "15",
"attributes": {
"name": "Post-purchase review request (v2)"
}
}
}{
"data": {
"id": "15",
"type": "email_templates",
"attributes": {
"name": "Post-purchase review request",
"type": "review_solicitation",
"locales": {
"en": {
"from": {
"name": "Acme Inc.",
"email": "reviews@example.com"
},
"subject": "Thanks for your review, {{ post.author.name }}",
"body": "<p>Hi {{ post.author.name }},</p>\n<p>Thanks for reviewing us. Here's our reply:</p>\n<blockquote>{{ reply.text }}</blockquote>\n<p>The {{ team.name }} team</p>"
},
"fr": {
"from": {
"name": "Acme Inc.",
"email": "reviews@example.com"
},
"subject": "Merci pour votre avis, {{ post.author.name }}",
"body": "<p>Bonjour {{ post.author.name }},</p>\n<p>Merci pour votre avis. Voici notre réponse :</p>\n<blockquote>{{ reply.text }}</blockquote>\n<p>L'équipe {{ team.name }}</p>"
}
},
"created_at": "2025-03-14T16:42:07.000Z",
"updated_at": "2025-03-18T09:15:32.000Z"
},
"relationships": {
"team": {
"data": {
"type": "team",
"id": "1"
},
"meta": {
"included": false
}
}
}
},
"included": [
{
"id": "1",
"type": "team",
"attributes": {
"name": "Acme Inc.",
"image_url": "https://cdn.example.com/logos/acme.png",
"url_shortener_type": "tintly",
"onboarding": "completed",
"shared_tags": [
"summer",
"ugc"
],
"saml_enabled": true,
"idp_entity_id": "https://idp.example.com/metadata",
"idp_sso_target_url": "https://idp.example.com/sso/saml",
"idp_cert": "-----BEGIN CERTIFICATE-----\nMIIDdzCCAl+gAwIBAgIEbGx0ZTANBgkqhkiG9w0BAQsFADBsMRAwDgYDVQQGEwdV\n-----END CERTIFICATE-----",
"force_authn": false,
"authn_requests_signed": false,
"want_assertions_signed": true,
"want_assertions_encrypted": false,
"saml_jit_provisioning": true,
"oidc_enabled": false,
"oidc_identifier": "0oa1b2c3d4e5f6g7h8i9",
"oidc_secret": "9f8e7d6c5b4a39281706f5e4d3c2b1a0",
"oidc_scope": "openid email profile",
"oidc_issuer": "https://login.example.com",
"oidc_authorization_endpoint": "https://login.example.com/oauth2/v1/authorize",
"oidc_token_endpoint": "https://login.example.com/oauth2/v1/token",
"oidc_userinfo_endpoint": "https://login.example.com/oauth2/v1/userinfo",
"oidc_jwks_uri": "https://login.example.com/oauth2/v1/keys",
"plan": "tint_professional",
"plan_expires_at": "2026-03-14T00:00:00.000Z",
"plan_changed_at": "2025-03-14T16:42:07.000Z",
"self_service": false,
"rewards_platform_id": "mrc_4f7a2b9c",
"rewards_platform_key": "7d1e3c5a9b2f4e6d8c0a1b3d5f7e9c2a",
"permissions": [
"moderate_tint",
"modify_tint",
"assets_read"
],
"created_at": "2024-11-02T10:05:44.000Z",
"updated_at": "2025-03-14T16:42:07.000Z"
},
"relationships": {
"role": {
"data": {
"type": "role",
"id": "3"
}
},
"plan": {
"data": {
"type": "plan",
"id": "1"
}
},
"agent": {
"data": {
"type": "agent",
"id": "7"
}
},
"tints": {
"data": [
{
"type": "tint",
"id": "1"
}
],
"meta": {
"active_tints_count": 4,
"count": 6
}
},
"social_feeds": {
"data": [
{
"type": "social_feed",
"id": "1"
}
],
"meta": {
"active_count": 12,
"inactive_count": 3,
"access_error_count": 1,
"active_social_feeds_count": 12,
"inactive_social_feeds_count": 3
}
},
"posts": {
"data": [
{
"type": "post",
"id": "1"
}
],
"meta": {
"posts_ingested_from_beginning_of_month": 18250
}
},
"assets": {
"data": [
{
"type": "asset",
"id": "1"
}
],
"meta": {
"count": 320,
"uploaded_count": 45,
"total": 320,
"uploaded_total": 45
}
},
"mixes": {
"data": [
{
"type": "mix",
"id": "1"
}
],
"meta": {
"count": 2
}
},
"forms": {
"data": [
{
"type": "form",
"id": "1"
}
],
"meta": {
"count": 5,
"published_count": 3
}
},
"personalizations": {
"data": [
{
"type": "personalization",
"id": "1"
}
],
"meta": {
"count": 8
}
}
}
}
]
}{
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"code": "404",
"title": "Not found",
"status": "404"
}
]
}{
"errors": [
{
"title": "Invalid name",
"detail": "Name can't be blank",
"source": {
"pointer": "/data/attributes/name"
}
}
]
}Fonts
fontsRetrieve a list of fonts
Retrieves the team's fonts that the user has access to.
Parameters
team_idintegerrequiredpathThe ID of the team.
pageobjectqueryOffset pagination. Use page[size] to set the number of items per page and page[number] to select a page. The response's links object contains ready-to-use URLs for the next and previous pages.
sortArray<string>id-idname-namecreated_at-created_atupdated_at-updated_at-idqueryA comma-separated list of fields to sort by. Prefix a field with - to sort in descending order. Defaults to -id (newest first).
Response
A page of the fonts the user has access to.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: fonts:read
curl -X GET 'https://api.tintup.com/v2/teams/{team_id}/fonts'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/fonts', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.tintup.com/v2/teams/{team_id}/fonts')
data = response.json(){
"data": [
{
"id": "7",
"type": "font",
"attributes": {
"name": "Quicksand",
"url": "https://storage.example.com/fonts/quicksand-regular.woff2?X-Amz-Expires=604800&X-Amz-Signature=3f9a1c0b7d",
"format": "woff2",
"metrics": {
"ascent": 1000,
"descent": -250,
"units_per_em": 1000
},
"created_at": "2025-03-14T16:42:07.000Z",
"updated_at": "2025-03-14T16:42:07.000Z"
},
"links": {
"css": "https://api.tintup.com/v2/teams/1/fonts/7.css"
}
}
],
"links": {
"self": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=2",
"first": "https://api.tintup.com/v2/teams/1/tints",
"next": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=3",
"prev": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=1"
}
}{
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}Create a font
Creates a font from a file uploaded with the font upload endpoint. Creating a font takes three steps: create an upload, send the file to the upload's url with its headers, then call this endpoint with the upload's id as upload_id. The format and metrics are detected from the file. The new font is automatically shared with the user's role and with every role that has access to new fonts.
Body
The font to create.
dataNewFontrequiredParameters
team_idintegerrequiredpathThe ID of the team.
Response
The font.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Unprocessable Entity. The request is missing required parameters or the resource is invalid.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: fonts:write
curl -X POST 'https://api.tintup.com/v2/teams/{team_id}/fonts' \
-H 'Content-Type: application/vnd.api+json' \
-d '{
"data": {
"type": "font",
"attributes": {
"name": "Quicksand",
"upload_id": "eyJfcmFpbHMiOnsiZGF0YSI6ODgyMTUsInB1ciI6ImJsb2JfaWQifX0=--6b1f0e3c2d9a8b7c6d5e4f3a2b1c0d9e8f7a6b5c"
}
}
}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/fonts', {
method: 'POST',
headers: {
'Content-Type': 'application/vnd.api+json',
},
body: JSON.stringify({
"data": {
"type": "font",
"attributes": {
"name": "Quicksand",
"upload_id": "eyJfcmFpbHMiOnsiZGF0YSI6ODgyMTUsInB1ciI6ImJsb2JfaWQifX0=--6b1f0e3c2d9a8b7c6d5e4f3a2b1c0d9e8f7a6b5c"
}
}
}),
});
const data = await response.json();import requests
payload = {
"data": {
"type": "font",
"attributes": {
"name": "Quicksand",
"upload_id": "eyJfcmFpbHMiOnsiZGF0YSI6ODgyMTUsInB1ciI6ImJsb2JfaWQifX0=--6b1f0e3c2d9a8b7c6d5e4f3a2b1c0d9e8f7a6b5c"
}
}
}
response = requests.post('https://api.tintup.com/v2/teams/{team_id}/fonts', json=payload)
data = response.json(){
"data": {
"type": "font",
"attributes": {
"name": "Quicksand",
"upload_id": "eyJfcmFpbHMiOnsiZGF0YSI6ODgyMTUsInB1ciI6ImJsb2JfaWQifX0=--6b1f0e3c2d9a8b7c6d5e4f3a2b1c0d9e8f7a6b5c"
}
}
}{
"data": {
"id": "7",
"type": "font",
"attributes": {
"name": "Quicksand",
"url": "https://storage.example.com/fonts/quicksand-regular.woff2?X-Amz-Expires=604800&X-Amz-Signature=3f9a1c0b7d",
"format": "woff2",
"metrics": {
"ascent": 1000,
"descent": -250,
"units_per_em": 1000
},
"created_at": "2025-03-14T16:42:07.000Z",
"updated_at": "2025-03-14T16:42:07.000Z"
},
"links": {
"css": "https://api.tintup.com/v2/teams/1/fonts/7.css"
}
}
}{
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"title": "Invalid name",
"detail": "Name can't be blank",
"source": {
"pointer": "/data/attributes/name"
}
}
]
}Create a font upload
Starts a direct upload for a font file. Send the file's bytes to the returned url with an HTTP PUT request and the returned headers, then create the font with the upload's id as upload_id. Accepted formats are WOFF, WOFF2, TrueType, OpenType, Embedded OpenType, and SVG, up to 5 MB. Any valid access token for a member of the team can create an upload; no specific scope is checked. A missing or invalid token results in a 403.
Body
The file to upload.
dataNewUploadrequiredParameters
team_idintegerrequiredpathThe ID of the team.
Response
The upload. Send the file to its url, then create the font with its id as upload_id.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Unprocessable Entity. The request is missing required parameters or the resource is invalid.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
curl -X POST 'https://api.tintup.com/v2/teams/{team_id}/fonts/upload' \
-H 'Content-Type: application/vnd.api+json' \
-d '{
"data": {
"type": "upload",
"attributes": {
"filename": "quicksand-regular.woff2",
"content_type": "font/woff2",
"byte_size": 38416,
"checksum": "1B2M2Y8AsgTpgAmY7PhCfg=="
}
}
}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/fonts/upload', {
method: 'POST',
headers: {
'Content-Type': 'application/vnd.api+json',
},
body: JSON.stringify({
"data": {
"type": "upload",
"attributes": {
"filename": "quicksand-regular.woff2",
"content_type": "font/woff2",
"byte_size": 38416,
"checksum": "1B2M2Y8AsgTpgAmY7PhCfg=="
}
}
}),
});
const data = await response.json();import requests
payload = {
"data": {
"type": "upload",
"attributes": {
"filename": "quicksand-regular.woff2",
"content_type": "font/woff2",
"byte_size": 38416,
"checksum": "1B2M2Y8AsgTpgAmY7PhCfg=="
}
}
}
response = requests.post('https://api.tintup.com/v2/teams/{team_id}/fonts/upload', json=payload)
data = response.json(){
"data": {
"type": "upload",
"attributes": {
"filename": "quicksand-regular.woff2",
"content_type": "font/woff2",
"byte_size": 38416,
"checksum": "1B2M2Y8AsgTpgAmY7PhCfg=="
}
}
}{
"data": {
"id": "eyJfcmFpbHMiOnsiZGF0YSI6ODgyMTUsInB1ciI6ImJsb2JfaWQifX0=--6b1f0e3c2d9a8b7c6d5e4f3a2b1c0d9e8f7a6b5c",
"type": "upload",
"attributes": {
"url": "https://uploads.example.com/9f8e7d6c5b4a3f2e1d0c?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Expires=300&X-Amz-Signature=8c1d2e3f4a",
"headers": {
"Content-Type": "font/woff2",
"Content-MD5": "1B2M2Y8AsgTpgAmY7PhCfg=="
}
}
}
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"title": "Invalid name",
"detail": "Name can't be blank",
"source": {
"pointer": "/data/attributes/name"
}
}
]
}Delete a font
Deletes one of the team's fonts.
Parameters
team_idintegerrequiredpathThe ID of the team.
font_idintegerrequiredpathThe ID of the font.
Response
No Content. The request succeeded and there is no response body.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Not Found.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: fonts:write
curl -X DELETE 'https://api.tintup.com/v2/teams/{team_id}/fonts/{font_id}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/fonts/{font_id}', {
method: 'DELETE',
});
const data = await response.json();import requests
response = requests.delete('https://api.tintup.com/v2/teams/{team_id}/fonts/{font_id}')
data = response.json(){
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"code": "404",
"title": "Not found",
"status": "404"
}
]
}Retrieve fonts as a CSS stylesheet
Returns a stylesheet containing one @font-face rule per requested font, for use in a <link rel="stylesheet"> tag. This is the URL returned in each font's links.css.
Without an Authorization header the endpoint is public: team_id can be the team's ID or one of its domain names, and any of the team's fonts can be requested. With an access token, team_id must be a team ID, and the token needs the fonts:read scope.
Parameters
team_idinteger | stringrequiredpathThe ID of the team. Without an access token, it can also be the name of one of the team's custom domains, so experiences can load fonts from their own domain.
font_idsArray<integer>requiredpathA comma-separated list of font IDs, followed by the .css extension in the path (for example 7,9.css).
Response
A stylesheet with one @font-face rule per requested font that was found. Requested IDs that don't match one of the team's fonts are skipped.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Not Found. None of the requested fonts exist for the team, or the domain name doesn't match a domain.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: fonts:read
curl -X GET 'https://api.tintup.com/v2/teams/{team_id}/fonts/{font_ids}.css'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/fonts/{font_ids}.css', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.tintup.com/v2/teams/{team_id}/fonts/{font_ids}.css')
data = response.json()@font-face { font-family: "Quicksand"; font-style: normal; font-weight: 400; src: local("Quicksand"), url("https://storage.example.com/fonts/quicksand-regular.woff2?X-Amz-Expires=604800&X-Amz-Signature=3f9a1c0b7d"); font-display: block; }
@font-face { font-family: "Merriweather"; font-style: normal; font-weight: 400; src: local("Merriweather"), url("https://storage.example.com/fonts/merriweather-regular.ttf?X-Amz-Expires=604800&X-Amz-Signature=a41e9d27c5"); font-display: block; }
{
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"code": "404",
"title": "Not found",
"status": "404"
}
]
}OAuth 2.0 Applications
oauth_applicationsRetrieve a list of OAuth applications
Returns the team's OAuth applications that the current user has access to through their role. Send a valid id_token as well to get the client_secret of each application.
Parameters
team_idintegerrequiredpathThe ID of the team.
pageobjectqueryOffset pagination. Use page[size] to set the number of items per page and page[number] to select a page. The response's links object contains ready-to-use URLs for the next and previous pages.
sortstring-idqueryA comma-separated list of attributes to sort by, such as id, name, created_at or updated_at. Prefix an attribute with - to sort in descending order.
Response
A list of OAuth applications.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
access_tokenoauth2OAuth 2.0 authorization code flow.
id_tokenapiKey in queryA short-lived token required, in addition to an access token, to change sensitive data. See Changes to Sensitive Data.
curl -X GET 'https://api.tintup.com/v2/teams/{team_id}/oauth/applications'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/oauth/applications', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.tintup.com/v2/teams/{team_id}/oauth/applications')
data = response.json(){
"data": [
{
"id": "17",
"type": "oauth_application",
"attributes": {
"name": "Acme Reporting",
"redirect_uri": "https://reports.example.com/auth/callback",
"version": 20190326,
"client_id": "3a7c1e0b9d8f4e6a2b5c7d9e1f3a5b7c",
"client_secret": "9f8e7d6c5b4a39281706f5e4d3c2b1a0",
"created_at": "2025-03-14T16:42:07.000Z",
"updated_at": "2025-03-14T16:42:07.000Z"
}
}
],
"links": {
"self": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=2",
"first": "https://api.tintup.com/v2/teams/1/tints",
"next": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=3",
"prev": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=1"
}
}{
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}Create an OAuth application
Creates an OAuth application owned by the team. The current user's role, and every role that has access to new OAuth applications, get access to it. Send a valid id_token as well to get the client_secret in the response.
Body
The OAuth application to create.
dataNewOAuthApplicationrequiredThe OAuth application to create.
Parameters
team_idintegerrequiredpathThe ID of the team.
Response
The OAuth application.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Unprocessable Entity. The request is missing required parameters or the resource is invalid.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
access_tokenoauth2OAuth 2.0 authorization code flow.
id_tokenapiKey in queryA short-lived token required, in addition to an access token, to change sensitive data. See Changes to Sensitive Data.
curl -X POST 'https://api.tintup.com/v2/teams/{team_id}/oauth/applications' \
-H 'Content-Type: application/vnd.api+json' \
-d '{
"data": {
"type": "oauth_application",
"attributes": {
"name": "Acme Reporting",
"redirect_uri": "https://reports.example.com/auth/callback"
}
}
}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/oauth/applications', {
method: 'POST',
headers: {
'Content-Type': 'application/vnd.api+json',
},
body: JSON.stringify({
"data": {
"type": "oauth_application",
"attributes": {
"name": "Acme Reporting",
"redirect_uri": "https://reports.example.com/auth/callback"
}
}
}),
});
const data = await response.json();import requests
payload = {
"data": {
"type": "oauth_application",
"attributes": {
"name": "Acme Reporting",
"redirect_uri": "https://reports.example.com/auth/callback"
}
}
}
response = requests.post('https://api.tintup.com/v2/teams/{team_id}/oauth/applications', json=payload)
data = response.json(){
"data": {
"type": "oauth_application",
"attributes": {
"name": "Acme Reporting",
"redirect_uri": "https://reports.example.com/auth/callback"
}
}
}{
"data": {
"id": "17",
"type": "oauth_application",
"attributes": {
"name": "Acme Reporting",
"redirect_uri": "https://reports.example.com/auth/callback",
"version": 20190326,
"client_id": "3a7c1e0b9d8f4e6a2b5c7d9e1f3a5b7c",
"client_secret": "9f8e7d6c5b4a39281706f5e4d3c2b1a0",
"created_at": "2025-03-14T16:42:07.000Z",
"updated_at": "2025-03-14T16:42:07.000Z"
}
}
}{
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"title": "Invalid name",
"detail": "Name can't be blank",
"source": {
"pointer": "/data/attributes/name"
}
}
]
}Retrieve an OAuth application
Retrieves one of the team's OAuth applications. Send a valid id_token as well to get the client_secret in the response.
Parameters
team_idintegerrequiredpathThe ID of the team.
oauth_application_idintegerrequiredpathThe ID of the OAuth application.
Response
The OAuth application.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Not Found.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
access_tokenoauth2OAuth 2.0 authorization code flow.
id_tokenapiKey in queryA short-lived token required, in addition to an access token, to change sensitive data. See Changes to Sensitive Data.
curl -X GET 'https://api.tintup.com/v2/teams/{team_id}/oauth/applications/{oauth_application_id}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/oauth/applications/{oauth_application_id}', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.tintup.com/v2/teams/{team_id}/oauth/applications/{oauth_application_id}')
data = response.json(){
"data": {
"id": "17",
"type": "oauth_application",
"attributes": {
"name": "Acme Reporting",
"redirect_uri": "https://reports.example.com/auth/callback",
"version": 20190326,
"client_id": "3a7c1e0b9d8f4e6a2b5c7d9e1f3a5b7c",
"client_secret": "9f8e7d6c5b4a39281706f5e4d3c2b1a0",
"created_at": "2025-03-14T16:42:07.000Z",
"updated_at": "2025-03-14T16:42:07.000Z"
}
}
}{
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"code": "404",
"title": "Not found",
"status": "404"
}
]
}Delete an OAuth application
Deletes the OAuth application.
Parameters
team_idintegerrequiredpathThe ID of the team.
oauth_application_idintegerrequiredpathThe ID of the OAuth application.
Response
No Content. The request succeeded and there is no response body.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Not Found.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
curl -X DELETE 'https://api.tintup.com/v2/teams/{team_id}/oauth/applications/{oauth_application_id}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/oauth/applications/{oauth_application_id}', {
method: 'DELETE',
});
const data = await response.json();import requests
response = requests.delete('https://api.tintup.com/v2/teams/{team_id}/oauth/applications/{oauth_application_id}')
data = response.json(){
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"code": "404",
"title": "Not found",
"status": "404"
}
]
}Update an OAuth application
Updates the OAuth application. Send a valid id_token as well to get the client_secret in the response.
Body
The OAuth application attributes to change.
dataOAuthApplicationUpdaterequiredThe attributes to change. Omitted attributes are left unchanged.
Parameters
team_idintegerrequiredpathThe ID of the team.
oauth_application_idintegerrequiredpathThe ID of the OAuth application.
Response
The OAuth application.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Not Found.
Unprocessable Entity. The request is missing required parameters or the resource is invalid.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
access_tokenoauth2OAuth 2.0 authorization code flow.
id_tokenapiKey in queryA short-lived token required, in addition to an access token, to change sensitive data. See Changes to Sensitive Data.
curl -X PATCH 'https://api.tintup.com/v2/teams/{team_id}/oauth/applications/{oauth_application_id}' \
-H 'Content-Type: application/vnd.api+json' \
-d '{
"data": {
"id": "17",
"type": "oauth_application",
"attributes": {
"name": "Acme Reporting",
"redirect_uri": "https://reports.example.com/auth/callback"
}
}
}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/oauth/applications/{oauth_application_id}', {
method: 'PATCH',
headers: {
'Content-Type': 'application/vnd.api+json',
},
body: JSON.stringify({
"data": {
"id": "17",
"type": "oauth_application",
"attributes": {
"name": "Acme Reporting",
"redirect_uri": "https://reports.example.com/auth/callback"
}
}
}),
});
const data = await response.json();import requests
payload = {
"data": {
"id": "17",
"type": "oauth_application",
"attributes": {
"name": "Acme Reporting",
"redirect_uri": "https://reports.example.com/auth/callback"
}
}
}
response = requests.patch('https://api.tintup.com/v2/teams/{team_id}/oauth/applications/{oauth_application_id}', json=payload)
data = response.json(){
"data": {
"id": "17",
"type": "oauth_application",
"attributes": {
"name": "Acme Reporting",
"redirect_uri": "https://reports.example.com/auth/callback"
}
}
}{
"data": {
"id": "17",
"type": "oauth_application",
"attributes": {
"name": "Acme Reporting",
"redirect_uri": "https://reports.example.com/auth/callback",
"version": 20190326,
"client_id": "3a7c1e0b9d8f4e6a2b5c7d9e1f3a5b7c",
"client_secret": "9f8e7d6c5b4a39281706f5e4d3c2b1a0",
"created_at": "2025-03-14T16:42:07.000Z",
"updated_at": "2025-03-14T16:42:07.000Z"
}
}
}{
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"code": "404",
"title": "Not found",
"status": "404"
}
]
}{
"errors": [
{
"title": "Invalid name",
"detail": "Name can't be blank",
"source": {
"pointer": "/data/attributes/name"
}
}
]
}Privacy Requests
privacy_requestsRetrieve a list of privacy requests
Parameters
team_idintegerrequiredpathThe ID of the team.
sortstring-idqueryA comma-separated list of attributes to sort by. Prefix an attribute with - to sort in descending order.
includeArray<string>teamqueryA comma-separated list of related resources to include in the response.
pageobjectqueryOffset pagination. Use page[size] to set the number of items per page and page[number] to select a page. The response's links object contains ready-to-use URLs for the next and previous pages.
Response
A list of privacy requests.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: privacy_requests:read
curl -X GET 'https://api.tintup.com/v2/teams/{team_id}/privacy/requests'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/privacy/requests', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.tintup.com/v2/teams/{team_id}/privacy/requests')
data = response.json(){
"data": [
{
"id": "37",
"type": "privacy_request",
"attributes": {
"type": "erasure",
"status": "pending",
"identifier_type": "id",
"identifier_hash": "3c1bd5494bbc5e832580d202fa3adbee31b038baebe334ab2436a3933ce468d0",
"created_at": "2025-03-14T16:42:07.000Z",
"updated_at": "2025-03-14T16:43:12.000Z"
},
"relationships": {
"team": {
"data": {
"type": "team",
"id": "1"
},
"meta": {
"included": false
}
}
}
}
],
"links": {
"self": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=2",
"first": "https://api.tintup.com/v2/teams/1/tints",
"next": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=3",
"prev": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=1"
}
}{
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}Create a privacy request
Creates a privacy request and processes it asynchronously. For an erasure request, the loyalty member's form submissions and assets are deleted and their community member profile is anonymized and deactivated. Poll the request until its status is success or failure.
Body
The privacy request to create.
dataNewPrivacyRequestrequiredParameters
team_idintegerrequiredpathThe ID of the team.
Response
The privacy request.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Unprocessable Entity. The request is missing required parameters or the resource is invalid.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: privacy_requests:write
curl -X POST 'https://api.tintup.com/v2/teams/{team_id}/privacy/requests' \
-H 'Content-Type: application/vnd.api+json' \
-d '{
"data": {
"type": "privacy_request",
"attributes": {
"type": "erasure",
"identifier_type": "id",
"identifier": "65f3a1c2e4b0a91d2c7e8f10"
}
}
}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/privacy/requests', {
method: 'POST',
headers: {
'Content-Type': 'application/vnd.api+json',
},
body: JSON.stringify({
"data": {
"type": "privacy_request",
"attributes": {
"type": "erasure",
"identifier_type": "id",
"identifier": "65f3a1c2e4b0a91d2c7e8f10"
}
}
}),
});
const data = await response.json();import requests
payload = {
"data": {
"type": "privacy_request",
"attributes": {
"type": "erasure",
"identifier_type": "id",
"identifier": "65f3a1c2e4b0a91d2c7e8f10"
}
}
}
response = requests.post('https://api.tintup.com/v2/teams/{team_id}/privacy/requests', json=payload)
data = response.json(){
"data": {
"type": "privacy_request",
"attributes": {
"type": "erasure",
"identifier_type": "id",
"identifier": "65f3a1c2e4b0a91d2c7e8f10"
}
}
}{
"data": {
"id": "37",
"type": "privacy_request",
"attributes": {
"type": "erasure",
"status": "pending",
"identifier_type": "id",
"identifier_hash": "3c1bd5494bbc5e832580d202fa3adbee31b038baebe334ab2436a3933ce468d0",
"created_at": "2025-03-14T16:42:07.000Z",
"updated_at": "2025-03-14T16:43:12.000Z"
},
"relationships": {
"team": {
"data": {
"type": "team",
"id": "1"
},
"meta": {
"included": false
}
}
}
}
}{
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"title": "Invalid name",
"detail": "Name can't be blank",
"source": {
"pointer": "/data/attributes/name"
}
}
]
}Retrieve a privacy request
Parameters
team_idintegerrequiredpathThe ID of the team.
privacy_request_idintegerrequiredpathThe ID of the privacy request.
includeArray<string>teamqueryA comma-separated list of related resources to include in the response.
Response
The privacy request.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Not Found.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: privacy_requests:read
curl -X GET 'https://api.tintup.com/v2/teams/{team_id}/privacy/requests/{privacy_request_id}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/privacy/requests/{privacy_request_id}', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.tintup.com/v2/teams/{team_id}/privacy/requests/{privacy_request_id}')
data = response.json(){
"data": {
"id": "37",
"type": "privacy_request",
"attributes": {
"type": "erasure",
"status": "pending",
"identifier_type": "id",
"identifier_hash": "3c1bd5494bbc5e832580d202fa3adbee31b038baebe334ab2436a3933ce468d0",
"created_at": "2025-03-14T16:42:07.000Z",
"updated_at": "2025-03-14T16:43:12.000Z"
},
"relationships": {
"team": {
"data": {
"type": "team",
"id": "1"
},
"meta": {
"included": false
}
}
}
}
}{
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"code": "404",
"title": "Not found",
"status": "404"
}
]
}Roles
rolesRetrieve a list of roles
Returns the team's roles.
Parameters
team_idintegerrequiredpathThe ID of the team.
includeArray<string>userstintsaccountscollectionsdomainsfontsexperiencesproduct_accountsproduct_feedspersonalizationsoauth_applicationswebhooksformsmixesqueryA comma-separated list of related resources to include in the response. Included resources are limited to those you have access to.
filterobjectqueryFilters the roles.
sortArray<string>id-idname-namecreated_at-created_atupdated_at-updated_at-idqueryA comma-separated list of attributes to sort by. Prefix an attribute with - to sort in descending order.
pageobjectqueryOffset pagination. Use page[size] to set the number of items per page and page[number] to select a page. The response's links object contains ready-to-use URLs for the next and previous pages.
Response
A list of roles.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: roles:read
curl -X GET 'https://api.tintup.com/v2/teams/{team_id}/roles'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/roles', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.tintup.com/v2/teams/{team_id}/roles')
data = response.json(){
"data": [
{
"id": "3",
"type": "role",
"attributes": {
"name": "Content Moderator",
"description": "Moderates posts and manages rights requests for the brand boards.",
"permissions": [
"moderate_tint",
"modify_tint",
"assets_read",
"replies_r",
"replies_cu"
],
"created_at": "2025-03-14T16:42:07.000Z",
"updated_at": "2025-03-20T09:15:31.000Z"
},
"relationships": {
"users": {
"data": [
{
"type": "user",
"id": "42"
}
],
"meta": {
"count": 3
}
},
"tints": {
"data": [
{
"type": "tint",
"id": "12"
}
],
"links": {
"related": "https://api.tintup.com/v2/teams/1/roles/3/tints",
"first": "https://api.tintup.com/v2/teams/1/roles/3/tints",
"next": "https://api.tintup.com/v2/teams/1/roles/3/tints?page%5Bnumber%5D=2"
},
"meta": {
"count": 2
}
},
"accounts": {
"data": [
{
"type": "account",
"id": "3"
}
],
"links": {
"related": "https://api.tintup.com/v2/teams/1/roles/3/accounts",
"first": "https://api.tintup.com/v2/teams/1/roles/3/accounts",
"next": "https://api.tintup.com/v2/teams/1/roles/3/accounts?page%5Bnumber%5D=2"
},
"meta": {
"count": 1
}
},
"collections": {
"data": [
{
"type": "collection",
"id": "8"
}
],
"links": {
"related": "https://api.tintup.com/v2/teams/1/roles/3/collections",
"first": "https://api.tintup.com/v2/teams/1/roles/3/collections",
"next": "https://api.tintup.com/v2/teams/1/roles/3/collections?page%5Bnumber%5D=2"
},
"meta": {
"count": 1
}
},
"domains": {
"data": [
{
"type": "domain",
"id": "2"
}
],
"links": {
"related": "https://api.tintup.com/v2/teams/1/roles/3/domains",
"first": "https://api.tintup.com/v2/teams/1/roles/3/domains",
"next": "https://api.tintup.com/v2/teams/1/roles/3/domains?page%5Bnumber%5D=2"
},
"meta": {
"count": 1
}
},
"fonts": {
"data": [
{
"type": "font",
"id": "5"
}
],
"links": {
"related": "https://api.tintup.com/v2/teams/1/roles/3/fonts",
"first": "https://api.tintup.com/v2/teams/1/roles/3/fonts",
"next": "https://api.tintup.com/v2/teams/1/roles/3/fonts?page%5Bnumber%5D=2"
},
"meta": {
"count": 1
}
},
"experiences": {
"data": [
{
"type": "experience",
"id": "21"
}
],
"links": {
"related": "https://api.tintup.com/v2/teams/1/roles/3/experiences",
"first": "https://api.tintup.com/v2/teams/1/roles/3/experiences",
"next": "https://api.tintup.com/v2/teams/1/roles/3/experiences?page%5Bnumber%5D=2"
},
"meta": {
"count": 2
}
},
"product_accounts": {
"data": [
{
"type": "product_account",
"id": "4"
}
],
"links": {
"related": "https://api.tintup.com/v2/teams/1/roles/3/product_accounts",
"first": "https://api.tintup.com/v2/teams/1/roles/3/product_accounts",
"next": "https://api.tintup.com/v2/teams/1/roles/3/product_accounts?page%5Bnumber%5D=2"
},
"meta": {
"count": 1
}
},
"product_feeds": {
"data": [
{
"type": "product_feed",
"id": "6"
}
],
"links": {
"related": "https://api.tintup.com/v2/teams/1/roles/3/product_feeds",
"first": "https://api.tintup.com/v2/teams/1/roles/3/product_feeds",
"next": "https://api.tintup.com/v2/teams/1/roles/3/product_feeds?page%5Bnumber%5D=2"
},
"meta": {
"count": 1
}
},
"personalizations": {
"data": [
{
"type": "personalization",
"id": "9"
}
],
"links": {
"related": "https://api.tintup.com/v2/teams/1/roles/3/personalizations",
"first": "https://api.tintup.com/v2/teams/1/roles/3/personalizations",
"next": "https://api.tintup.com/v2/teams/1/roles/3/personalizations?page%5Bnumber%5D=2"
},
"meta": {
"count": 1
}
},
"oauth_applications": {
"data": [
{
"type": "oauth_application",
"id": "7"
}
],
"links": {
"related": "https://api.tintup.com/v2/teams/1/roles/3/oauth_applications",
"first": "https://api.tintup.com/v2/teams/1/roles/3/oauth_applications",
"next": "https://api.tintup.com/v2/teams/1/roles/3/oauth_applications?page%5Bnumber%5D=2"
},
"meta": {
"count": 1
}
},
"webhooks": {
"data": [
{
"type": "webhook",
"id": "11"
}
],
"links": {
"related": "https://api.tintup.com/v2/teams/1/roles/3/webhooks",
"first": "https://api.tintup.com/v2/teams/1/roles/3/webhooks",
"next": "https://api.tintup.com/v2/teams/1/roles/3/webhooks?page%5Bnumber%5D=2"
},
"meta": {
"count": 1
}
},
"forms": {
"data": [
{
"type": "form",
"id": "14"
}
],
"links": {
"related": "https://api.tintup.com/v2/teams/1/roles/3/forms",
"first": "https://api.tintup.com/v2/teams/1/roles/3/forms",
"next": "https://api.tintup.com/v2/teams/1/roles/3/forms?page%5Bnumber%5D=2"
},
"meta": {
"count": 1
}
},
"mixes": {
"data": [
{
"type": "mix",
"id": "10"
}
],
"links": {
"related": "https://api.tintup.com/v2/teams/1/roles/3/mixes",
"first": "https://api.tintup.com/v2/teams/1/roles/3/mixes",
"next": "https://api.tintup.com/v2/teams/1/roles/3/mixes?page%5Bnumber%5D=2"
},
"meta": {
"count": 1
}
}
}
}
],
"included": [
{}
],
"links": {
"self": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=2",
"first": "https://api.tintup.com/v2/teams/1/tints",
"next": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=3",
"prev": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=1"
}
}{
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}Create a role
Creates a role for the team.
Body
The role to create.
dataNewRolerequiredParameters
team_idintegerrequiredpathThe ID of the team.
Response
The role.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Unprocessable Entity. The request is missing required parameters or the resource is invalid.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: roles:write
curl -X POST 'https://api.tintup.com/v2/teams/{team_id}/roles' \
-H 'Content-Type: application/vnd.api+json' \
-d '{
"data": {
"type": "role",
"attributes": {
"name": "Content Moderator",
"description": "Moderates posts and manages rights requests for the brand boards.",
"permissions": [
"moderate_tint",
"modify_tint",
"assets_read"
],
"tint_ids": [
12,
15
]
}
}
}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/roles', {
method: 'POST',
headers: {
'Content-Type': 'application/vnd.api+json',
},
body: JSON.stringify({
"data": {
"type": "role",
"attributes": {
"name": "Content Moderator",
"description": "Moderates posts and manages rights requests for the brand boards.",
"permissions": [
"moderate_tint",
"modify_tint",
"assets_read"
],
"tint_ids": [
12,
15
]
}
}
}),
});
const data = await response.json();import requests
payload = {
"data": {
"type": "role",
"attributes": {
"name": "Content Moderator",
"description": "Moderates posts and manages rights requests for the brand boards.",
"permissions": [
"moderate_tint",
"modify_tint",
"assets_read"
],
"tint_ids": [
12,
15
]
}
}
}
response = requests.post('https://api.tintup.com/v2/teams/{team_id}/roles', json=payload)
data = response.json(){
"data": {
"type": "role",
"attributes": {
"name": "Content Moderator",
"description": "Moderates posts and manages rights requests for the brand boards.",
"permissions": [
"moderate_tint",
"modify_tint",
"assets_read"
],
"tint_ids": [
12,
15
]
}
}
}{
"data": {
"id": "3",
"type": "role",
"attributes": {
"name": "Content Moderator",
"description": "Moderates posts and manages rights requests for the brand boards.",
"permissions": [
"moderate_tint",
"modify_tint",
"assets_read",
"replies_r",
"replies_cu"
],
"created_at": "2025-03-14T16:42:07.000Z",
"updated_at": "2025-03-20T09:15:31.000Z"
},
"relationships": {
"users": {
"data": [
{
"type": "user",
"id": "42"
}
],
"meta": {
"count": 3
}
},
"tints": {
"data": [
{
"type": "tint",
"id": "12"
}
],
"links": {
"related": "https://api.tintup.com/v2/teams/1/roles/3/tints",
"first": "https://api.tintup.com/v2/teams/1/roles/3/tints",
"next": "https://api.tintup.com/v2/teams/1/roles/3/tints?page%5Bnumber%5D=2"
},
"meta": {
"count": 2
}
},
"accounts": {
"data": [
{
"type": "account",
"id": "3"
}
],
"links": {
"related": "https://api.tintup.com/v2/teams/1/roles/3/accounts",
"first": "https://api.tintup.com/v2/teams/1/roles/3/accounts",
"next": "https://api.tintup.com/v2/teams/1/roles/3/accounts?page%5Bnumber%5D=2"
},
"meta": {
"count": 1
}
},
"collections": {
"data": [
{
"type": "collection",
"id": "8"
}
],
"links": {
"related": "https://api.tintup.com/v2/teams/1/roles/3/collections",
"first": "https://api.tintup.com/v2/teams/1/roles/3/collections",
"next": "https://api.tintup.com/v2/teams/1/roles/3/collections?page%5Bnumber%5D=2"
},
"meta": {
"count": 1
}
},
"domains": {
"data": [
{
"type": "domain",
"id": "2"
}
],
"links": {
"related": "https://api.tintup.com/v2/teams/1/roles/3/domains",
"first": "https://api.tintup.com/v2/teams/1/roles/3/domains",
"next": "https://api.tintup.com/v2/teams/1/roles/3/domains?page%5Bnumber%5D=2"
},
"meta": {
"count": 1
}
},
"fonts": {
"data": [
{
"type": "font",
"id": "5"
}
],
"links": {
"related": "https://api.tintup.com/v2/teams/1/roles/3/fonts",
"first": "https://api.tintup.com/v2/teams/1/roles/3/fonts",
"next": "https://api.tintup.com/v2/teams/1/roles/3/fonts?page%5Bnumber%5D=2"
},
"meta": {
"count": 1
}
},
"experiences": {
"data": [
{
"type": "experience",
"id": "21"
}
],
"links": {
"related": "https://api.tintup.com/v2/teams/1/roles/3/experiences",
"first": "https://api.tintup.com/v2/teams/1/roles/3/experiences",
"next": "https://api.tintup.com/v2/teams/1/roles/3/experiences?page%5Bnumber%5D=2"
},
"meta": {
"count": 2
}
},
"product_accounts": {
"data": [
{
"type": "product_account",
"id": "4"
}
],
"links": {
"related": "https://api.tintup.com/v2/teams/1/roles/3/product_accounts",
"first": "https://api.tintup.com/v2/teams/1/roles/3/product_accounts",
"next": "https://api.tintup.com/v2/teams/1/roles/3/product_accounts?page%5Bnumber%5D=2"
},
"meta": {
"count": 1
}
},
"product_feeds": {
"data": [
{
"type": "product_feed",
"id": "6"
}
],
"links": {
"related": "https://api.tintup.com/v2/teams/1/roles/3/product_feeds",
"first": "https://api.tintup.com/v2/teams/1/roles/3/product_feeds",
"next": "https://api.tintup.com/v2/teams/1/roles/3/product_feeds?page%5Bnumber%5D=2"
},
"meta": {
"count": 1
}
},
"personalizations": {
"data": [
{
"type": "personalization",
"id": "9"
}
],
"links": {
"related": "https://api.tintup.com/v2/teams/1/roles/3/personalizations",
"first": "https://api.tintup.com/v2/teams/1/roles/3/personalizations",
"next": "https://api.tintup.com/v2/teams/1/roles/3/personalizations?page%5Bnumber%5D=2"
},
"meta": {
"count": 1
}
},
"oauth_applications": {
"data": [
{
"type": "oauth_application",
"id": "7"
}
],
"links": {
"related": "https://api.tintup.com/v2/teams/1/roles/3/oauth_applications",
"first": "https://api.tintup.com/v2/teams/1/roles/3/oauth_applications",
"next": "https://api.tintup.com/v2/teams/1/roles/3/oauth_applications?page%5Bnumber%5D=2"
},
"meta": {
"count": 1
}
},
"webhooks": {
"data": [
{
"type": "webhook",
"id": "11"
}
],
"links": {
"related": "https://api.tintup.com/v2/teams/1/roles/3/webhooks",
"first": "https://api.tintup.com/v2/teams/1/roles/3/webhooks",
"next": "https://api.tintup.com/v2/teams/1/roles/3/webhooks?page%5Bnumber%5D=2"
},
"meta": {
"count": 1
}
},
"forms": {
"data": [
{
"type": "form",
"id": "14"
}
],
"links": {
"related": "https://api.tintup.com/v2/teams/1/roles/3/forms",
"first": "https://api.tintup.com/v2/teams/1/roles/3/forms",
"next": "https://api.tintup.com/v2/teams/1/roles/3/forms?page%5Bnumber%5D=2"
},
"meta": {
"count": 1
}
},
"mixes": {
"data": [
{
"type": "mix",
"id": "10"
}
],
"links": {
"related": "https://api.tintup.com/v2/teams/1/roles/3/mixes",
"first": "https://api.tintup.com/v2/teams/1/roles/3/mixes",
"next": "https://api.tintup.com/v2/teams/1/roles/3/mixes?page%5Bnumber%5D=2"
},
"meta": {
"count": 1
}
}
}
},
"included": [
{}
]
}{
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"title": "Invalid name",
"detail": "Name can't be blank",
"source": {
"pointer": "/data/attributes/name"
}
}
]
}Retrieve a role
Retrieves one of the team's roles.
Parameters
team_idintegerrequiredpathThe ID of the team.
role_idintegerrequiredpathThe ID of the role.
includeArray<string>userstintsaccountscollectionsdomainsfontsexperiencesproduct_accountsproduct_feedspersonalizationsoauth_applicationswebhooksformsmixesqueryA comma-separated list of related resources to include in the response. Included resources are limited to those you have access to.
Response
The role.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Not Found.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: roles:read
curl -X GET 'https://api.tintup.com/v2/teams/{team_id}/roles/{role_id}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/roles/{role_id}', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.tintup.com/v2/teams/{team_id}/roles/{role_id}')
data = response.json(){
"data": {
"id": "3",
"type": "role",
"attributes": {
"name": "Content Moderator",
"description": "Moderates posts and manages rights requests for the brand boards.",
"permissions": [
"moderate_tint",
"modify_tint",
"assets_read",
"replies_r",
"replies_cu"
],
"created_at": "2025-03-14T16:42:07.000Z",
"updated_at": "2025-03-20T09:15:31.000Z"
},
"relationships": {
"users": {
"data": [
{
"type": "user",
"id": "42"
}
],
"meta": {
"count": 3
}
},
"tints": {
"data": [
{
"type": "tint",
"id": "12"
}
],
"links": {
"related": "https://api.tintup.com/v2/teams/1/roles/3/tints",
"first": "https://api.tintup.com/v2/teams/1/roles/3/tints",
"next": "https://api.tintup.com/v2/teams/1/roles/3/tints?page%5Bnumber%5D=2"
},
"meta": {
"count": 2
}
},
"accounts": {
"data": [
{
"type": "account",
"id": "3"
}
],
"links": {
"related": "https://api.tintup.com/v2/teams/1/roles/3/accounts",
"first": "https://api.tintup.com/v2/teams/1/roles/3/accounts",
"next": "https://api.tintup.com/v2/teams/1/roles/3/accounts?page%5Bnumber%5D=2"
},
"meta": {
"count": 1
}
},
"collections": {
"data": [
{
"type": "collection",
"id": "8"
}
],
"links": {
"related": "https://api.tintup.com/v2/teams/1/roles/3/collections",
"first": "https://api.tintup.com/v2/teams/1/roles/3/collections",
"next": "https://api.tintup.com/v2/teams/1/roles/3/collections?page%5Bnumber%5D=2"
},
"meta": {
"count": 1
}
},
"domains": {
"data": [
{
"type": "domain",
"id": "2"
}
],
"links": {
"related": "https://api.tintup.com/v2/teams/1/roles/3/domains",
"first": "https://api.tintup.com/v2/teams/1/roles/3/domains",
"next": "https://api.tintup.com/v2/teams/1/roles/3/domains?page%5Bnumber%5D=2"
},
"meta": {
"count": 1
}
},
"fonts": {
"data": [
{
"type": "font",
"id": "5"
}
],
"links": {
"related": "https://api.tintup.com/v2/teams/1/roles/3/fonts",
"first": "https://api.tintup.com/v2/teams/1/roles/3/fonts",
"next": "https://api.tintup.com/v2/teams/1/roles/3/fonts?page%5Bnumber%5D=2"
},
"meta": {
"count": 1
}
},
"experiences": {
"data": [
{
"type": "experience",
"id": "21"
}
],
"links": {
"related": "https://api.tintup.com/v2/teams/1/roles/3/experiences",
"first": "https://api.tintup.com/v2/teams/1/roles/3/experiences",
"next": "https://api.tintup.com/v2/teams/1/roles/3/experiences?page%5Bnumber%5D=2"
},
"meta": {
"count": 2
}
},
"product_accounts": {
"data": [
{
"type": "product_account",
"id": "4"
}
],
"links": {
"related": "https://api.tintup.com/v2/teams/1/roles/3/product_accounts",
"first": "https://api.tintup.com/v2/teams/1/roles/3/product_accounts",
"next": "https://api.tintup.com/v2/teams/1/roles/3/product_accounts?page%5Bnumber%5D=2"
},
"meta": {
"count": 1
}
},
"product_feeds": {
"data": [
{
"type": "product_feed",
"id": "6"
}
],
"links": {
"related": "https://api.tintup.com/v2/teams/1/roles/3/product_feeds",
"first": "https://api.tintup.com/v2/teams/1/roles/3/product_feeds",
"next": "https://api.tintup.com/v2/teams/1/roles/3/product_feeds?page%5Bnumber%5D=2"
},
"meta": {
"count": 1
}
},
"personalizations": {
"data": [
{
"type": "personalization",
"id": "9"
}
],
"links": {
"related": "https://api.tintup.com/v2/teams/1/roles/3/personalizations",
"first": "https://api.tintup.com/v2/teams/1/roles/3/personalizations",
"next": "https://api.tintup.com/v2/teams/1/roles/3/personalizations?page%5Bnumber%5D=2"
},
"meta": {
"count": 1
}
},
"oauth_applications": {
"data": [
{
"type": "oauth_application",
"id": "7"
}
],
"links": {
"related": "https://api.tintup.com/v2/teams/1/roles/3/oauth_applications",
"first": "https://api.tintup.com/v2/teams/1/roles/3/oauth_applications",
"next": "https://api.tintup.com/v2/teams/1/roles/3/oauth_applications?page%5Bnumber%5D=2"
},
"meta": {
"count": 1
}
},
"webhooks": {
"data": [
{
"type": "webhook",
"id": "11"
}
],
"links": {
"related": "https://api.tintup.com/v2/teams/1/roles/3/webhooks",
"first": "https://api.tintup.com/v2/teams/1/roles/3/webhooks",
"next": "https://api.tintup.com/v2/teams/1/roles/3/webhooks?page%5Bnumber%5D=2"
},
"meta": {
"count": 1
}
},
"forms": {
"data": [
{
"type": "form",
"id": "14"
}
],
"links": {
"related": "https://api.tintup.com/v2/teams/1/roles/3/forms",
"first": "https://api.tintup.com/v2/teams/1/roles/3/forms",
"next": "https://api.tintup.com/v2/teams/1/roles/3/forms?page%5Bnumber%5D=2"
},
"meta": {
"count": 1
}
},
"mixes": {
"data": [
{
"type": "mix",
"id": "10"
}
],
"links": {
"related": "https://api.tintup.com/v2/teams/1/roles/3/mixes",
"first": "https://api.tintup.com/v2/teams/1/roles/3/mixes",
"next": "https://api.tintup.com/v2/teams/1/roles/3/mixes?page%5Bnumber%5D=2"
},
"meta": {
"count": 1
}
}
}
},
"included": [
{}
]
}{
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"code": "404",
"title": "Not found",
"status": "404"
}
]
}Delete a role
Deletes the role. Team members who are assigned the role are removed from the team along with it.
Parameters
team_idintegerrequiredpathThe ID of the team.
role_idintegerrequiredpathThe ID of the role.
Response
No Content. The request succeeded and there is no response body.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Not Found.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: roles:write
curl -X DELETE 'https://api.tintup.com/v2/teams/{team_id}/roles/{role_id}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/roles/{role_id}', {
method: 'DELETE',
});
const data = await response.json();import requests
response = requests.delete('https://api.tintup.com/v2/teams/{team_id}/roles/{role_id}')
data = response.json(){
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"code": "404",
"title": "Not found",
"status": "404"
}
]
}Update a role
Updates the role.
Body
The attributes of the role to change.
dataRoleUpdaterequiredParameters
team_idintegerrequiredpathThe ID of the team.
role_idintegerrequiredpathThe ID of the role.
Response
The role.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Not Found.
Unprocessable Entity. The request is missing required parameters or the resource is invalid.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: roles:write
curl -X PATCH 'https://api.tintup.com/v2/teams/{team_id}/roles/{role_id}' \
-H 'Content-Type: application/vnd.api+json' \
-d '{
"data": {
"id": "3",
"type": "role",
"attributes": {
"permissions": [
"moderate_tint",
"modify_tint",
"assets_read",
"replies_r"
],
"tint_ids": {
"+": [
18
],
"-": [
12
]
}
}
}
}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/roles/{role_id}', {
method: 'PATCH',
headers: {
'Content-Type': 'application/vnd.api+json',
},
body: JSON.stringify({
"data": {
"id": "3",
"type": "role",
"attributes": {
"permissions": [
"moderate_tint",
"modify_tint",
"assets_read",
"replies_r"
],
"tint_ids": {
"+": [
18
],
"-": [
12
]
}
}
}
}),
});
const data = await response.json();import requests
payload = {
"data": {
"id": "3",
"type": "role",
"attributes": {
"permissions": [
"moderate_tint",
"modify_tint",
"assets_read",
"replies_r"
],
"tint_ids": {
"+": [
18
],
"-": [
12
]
}
}
}
}
response = requests.patch('https://api.tintup.com/v2/teams/{team_id}/roles/{role_id}', json=payload)
data = response.json(){
"data": {
"id": "3",
"type": "role",
"attributes": {
"permissions": [
"moderate_tint",
"modify_tint",
"assets_read",
"replies_r"
],
"tint_ids": {
"+": [
18
],
"-": [
12
]
}
}
}
}{
"data": {
"id": "3",
"type": "role",
"attributes": {
"name": "Content Moderator",
"description": "Moderates posts and manages rights requests for the brand boards.",
"permissions": [
"moderate_tint",
"modify_tint",
"assets_read",
"replies_r",
"replies_cu"
],
"created_at": "2025-03-14T16:42:07.000Z",
"updated_at": "2025-03-20T09:15:31.000Z"
},
"relationships": {
"users": {
"data": [
{
"type": "user",
"id": "42"
}
],
"meta": {
"count": 3
}
},
"tints": {
"data": [
{
"type": "tint",
"id": "12"
}
],
"links": {
"related": "https://api.tintup.com/v2/teams/1/roles/3/tints",
"first": "https://api.tintup.com/v2/teams/1/roles/3/tints",
"next": "https://api.tintup.com/v2/teams/1/roles/3/tints?page%5Bnumber%5D=2"
},
"meta": {
"count": 2
}
},
"accounts": {
"data": [
{
"type": "account",
"id": "3"
}
],
"links": {
"related": "https://api.tintup.com/v2/teams/1/roles/3/accounts",
"first": "https://api.tintup.com/v2/teams/1/roles/3/accounts",
"next": "https://api.tintup.com/v2/teams/1/roles/3/accounts?page%5Bnumber%5D=2"
},
"meta": {
"count": 1
}
},
"collections": {
"data": [
{
"type": "collection",
"id": "8"
}
],
"links": {
"related": "https://api.tintup.com/v2/teams/1/roles/3/collections",
"first": "https://api.tintup.com/v2/teams/1/roles/3/collections",
"next": "https://api.tintup.com/v2/teams/1/roles/3/collections?page%5Bnumber%5D=2"
},
"meta": {
"count": 1
}
},
"domains": {
"data": [
{
"type": "domain",
"id": "2"
}
],
"links": {
"related": "https://api.tintup.com/v2/teams/1/roles/3/domains",
"first": "https://api.tintup.com/v2/teams/1/roles/3/domains",
"next": "https://api.tintup.com/v2/teams/1/roles/3/domains?page%5Bnumber%5D=2"
},
"meta": {
"count": 1
}
},
"fonts": {
"data": [
{
"type": "font",
"id": "5"
}
],
"links": {
"related": "https://api.tintup.com/v2/teams/1/roles/3/fonts",
"first": "https://api.tintup.com/v2/teams/1/roles/3/fonts",
"next": "https://api.tintup.com/v2/teams/1/roles/3/fonts?page%5Bnumber%5D=2"
},
"meta": {
"count": 1
}
},
"experiences": {
"data": [
{
"type": "experience",
"id": "21"
}
],
"links": {
"related": "https://api.tintup.com/v2/teams/1/roles/3/experiences",
"first": "https://api.tintup.com/v2/teams/1/roles/3/experiences",
"next": "https://api.tintup.com/v2/teams/1/roles/3/experiences?page%5Bnumber%5D=2"
},
"meta": {
"count": 2
}
},
"product_accounts": {
"data": [
{
"type": "product_account",
"id": "4"
}
],
"links": {
"related": "https://api.tintup.com/v2/teams/1/roles/3/product_accounts",
"first": "https://api.tintup.com/v2/teams/1/roles/3/product_accounts",
"next": "https://api.tintup.com/v2/teams/1/roles/3/product_accounts?page%5Bnumber%5D=2"
},
"meta": {
"count": 1
}
},
"product_feeds": {
"data": [
{
"type": "product_feed",
"id": "6"
}
],
"links": {
"related": "https://api.tintup.com/v2/teams/1/roles/3/product_feeds",
"first": "https://api.tintup.com/v2/teams/1/roles/3/product_feeds",
"next": "https://api.tintup.com/v2/teams/1/roles/3/product_feeds?page%5Bnumber%5D=2"
},
"meta": {
"count": 1
}
},
"personalizations": {
"data": [
{
"type": "personalization",
"id": "9"
}
],
"links": {
"related": "https://api.tintup.com/v2/teams/1/roles/3/personalizations",
"first": "https://api.tintup.com/v2/teams/1/roles/3/personalizations",
"next": "https://api.tintup.com/v2/teams/1/roles/3/personalizations?page%5Bnumber%5D=2"
},
"meta": {
"count": 1
}
},
"oauth_applications": {
"data": [
{
"type": "oauth_application",
"id": "7"
}
],
"links": {
"related": "https://api.tintup.com/v2/teams/1/roles/3/oauth_applications",
"first": "https://api.tintup.com/v2/teams/1/roles/3/oauth_applications",
"next": "https://api.tintup.com/v2/teams/1/roles/3/oauth_applications?page%5Bnumber%5D=2"
},
"meta": {
"count": 1
}
},
"webhooks": {
"data": [
{
"type": "webhook",
"id": "11"
}
],
"links": {
"related": "https://api.tintup.com/v2/teams/1/roles/3/webhooks",
"first": "https://api.tintup.com/v2/teams/1/roles/3/webhooks",
"next": "https://api.tintup.com/v2/teams/1/roles/3/webhooks?page%5Bnumber%5D=2"
},
"meta": {
"count": 1
}
},
"forms": {
"data": [
{
"type": "form",
"id": "14"
}
],
"links": {
"related": "https://api.tintup.com/v2/teams/1/roles/3/forms",
"first": "https://api.tintup.com/v2/teams/1/roles/3/forms",
"next": "https://api.tintup.com/v2/teams/1/roles/3/forms?page%5Bnumber%5D=2"
},
"meta": {
"count": 1
}
},
"mixes": {
"data": [
{
"type": "mix",
"id": "10"
}
],
"links": {
"related": "https://api.tintup.com/v2/teams/1/roles/3/mixes",
"first": "https://api.tintup.com/v2/teams/1/roles/3/mixes",
"next": "https://api.tintup.com/v2/teams/1/roles/3/mixes?page%5Bnumber%5D=2"
},
"meta": {
"count": 1
}
}
}
},
"included": [
{}
]
}{
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"code": "404",
"title": "Not found",
"status": "404"
}
]
}{
"errors": [
{
"title": "Invalid name",
"detail": "Name can't be blank",
"source": {
"pointer": "/data/attributes/name"
}
}
]
}Subaccounts
subaccountsA subaccount is an account that can be accessed directly using the specified account credentials, such as an Instagram business or creator account or a Facebook page.
Retrieve a list of subaccounts for an account
Returns the pages, organizations, channels, boards, etc. that can be accessed with the account, sorted by ID. Subaccounts are refreshed from the source whenever the account is authenticated.
Parameters
team_idintegerrequiredpathThe ID of the team.
account_idintegerrequiredpathThe ID of the account.
filterobjectqueryFilters the list of subaccounts. All filters are combined with AND.
pageobjectqueryOffset pagination. Use page[size] to set the number of items per page and page[number] to select a page. The response's links object contains ready-to-use URLs for the next and previous pages.
Response
A list of subaccounts.
Not Found.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: accounts:read
curl -X GET 'https://api.tintup.com/v2/teams/{team_id}/accounts/{account_id}/subaccounts'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/accounts/{account_id}/subaccounts', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.tintup.com/v2/teams/{team_id}/accounts/{account_id}/subaccounts')
data = response.json(){
"data": [
{
"id": "17841401839964064",
"type": "subaccount",
"attributes": {
"type": "page",
"name": "Acme Inc.",
"username": "acme",
"biography": "Outdoor gear for every adventure.",
"image_url": "https://cdn.example.com/avatars/acme.jpg",
"url": "https://www.instagram.com/acme",
"capabilities": [
"ingest",
"compose"
],
"meta": {},
"followers_count": 12840,
"follows_count": 312,
"media_count": 587
},
"relationships": {
"account": {
"data": {
"id": "4821",
"type": "account"
},
"meta": {
"included": false
}
}
}
}
],
"links": {
"self": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=2",
"first": "https://api.tintup.com/v2/teams/1/tints",
"next": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=3",
"prev": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=1"
}
}{
"errors": [
{
"code": "404",
"title": "Not found",
"status": "404"
}
]
}Retrieve a list of subaccounts
Parameters
team_idintegerrequiredpathThe ID of the team.
filterobjectquerypageobjectqueryOffset pagination. Use page[size] to set the number of items per page and page[number] to select a page. The response's links object contains ready-to-use URLs for the next and previous pages.
Response
A list of subaccounts.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: accounts:read
curl -X GET 'https://api.tintup.com/v2/teams/{team_id}/subaccounts'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/subaccounts', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.tintup.com/v2/teams/{team_id}/subaccounts')
data = response.json(){
"data": [
{
"id": "17841401839964064",
"type": "subaccount",
"attributes": {
"type": "page",
"name": "Acme Inc.",
"username": "acme",
"biography": "Outdoor gear for every adventure.",
"image_url": "https://cdn.example.com/avatars/acme.jpg",
"url": "https://www.instagram.com/acme",
"capabilities": [
"ingest",
"compose"
],
"meta": {},
"followers_count": 12840,
"follows_count": 312,
"media_count": 587
},
"relationships": {
"account": {
"data": {
"id": "4821",
"type": "account"
},
"meta": {
"included": false
}
}
}
}
],
"links": {
"self": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=2",
"first": "https://api.tintup.com/v2/teams/1/tints",
"next": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=3",
"prev": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=1"
}
}Team Users
team_usersRetrieve my user
Returns the user who owns the access token.
Parameters
includeArray<string>authentication_factorsteamsteams.rolequeryA comma-separated list of related resources to include in the response.
Response
The authenticated user.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: identity
curl -X GET 'https://api.tintup.com/v2/me'const response = await fetch('https://api.tintup.com/v2/me', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.tintup.com/v2/me')
data = response.json(){
"data": {
"id": "42",
"type": "user",
"attributes": {
"first_name": "Jane",
"last_name": "Doe",
"organization": "Acme Inc.",
"image_url": "https://cdn.example.com/avatars/jane-doe.png",
"email": "jane.doe@example.com",
"default_authentication_factor_id": 5,
"temporary_support_access_ends_at": "2025-03-21T16:42:07.000Z",
"created_at": "2024-11-02T10:05:44.000Z",
"updated_at": "2025-03-14T16:42:07.000Z"
},
"relationships": {
"authentication_factors": {
"data": [
{
"type": "authentication_factor",
"id": "5"
}
],
"links": {
"related": "https://api.tintup.com/v2/authentication_factors"
}
},
"teams": {
"data": [
{
"type": "team",
"id": "1"
}
],
"links": {
"related": "https://api.tintup.com/v2/teams"
}
}
},
"links": {
"self": "https://api.tintup.com/v2/me"
}
},
"included": [
{}
]
}{
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}Update my user
Updates the user who owns the access token. Changing the email or password attributes, or setting temporary_support_access_ends_at, additionally requires a valid ID token for the current access token, passed in the id_token query parameter; otherwise, the request fails with a 403 Forbidden error (code 4030002). A security email is sent to the user when their email or password is changed or when support access is granted.
Body
The attributes of the authenticated user to change.
dataMeUpdaterequiredResponse
The authenticated user.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Unprocessable Entity. The request is missing required parameters or the resource is invalid.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: identity:write
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: identity:write
id_tokenapiKey in queryA short-lived token required, in addition to an access token, to change sensitive data. See Changes to Sensitive Data.
curl -X PATCH 'https://api.tintup.com/v2/me' \
-H 'Content-Type: application/vnd.api+json' \
-d '{
"data": {
"type": "user",
"attributes": {
"first_name": "Jane",
"last_name": "Doe",
"organization": "Acme Inc."
}
}
}'const response = await fetch('https://api.tintup.com/v2/me', {
method: 'PATCH',
headers: {
'Content-Type': 'application/vnd.api+json',
},
body: JSON.stringify({
"data": {
"type": "user",
"attributes": {
"first_name": "Jane",
"last_name": "Doe",
"organization": "Acme Inc."
}
}
}),
});
const data = await response.json();import requests
payload = {
"data": {
"type": "user",
"attributes": {
"first_name": "Jane",
"last_name": "Doe",
"organization": "Acme Inc."
}
}
}
response = requests.patch('https://api.tintup.com/v2/me', json=payload)
data = response.json(){
"data": {
"type": "user",
"attributes": {
"first_name": "Jane",
"last_name": "Doe",
"organization": "Acme Inc."
}
}
}{
"data": {
"id": "42",
"type": "user",
"attributes": {
"first_name": "Jane",
"last_name": "Doe",
"organization": "Acme Inc.",
"image_url": "https://cdn.example.com/avatars/jane-doe.png",
"email": "jane.doe@example.com",
"default_authentication_factor_id": 5,
"temporary_support_access_ends_at": "2025-03-21T16:42:07.000Z",
"created_at": "2024-11-02T10:05:44.000Z",
"updated_at": "2025-03-14T16:42:07.000Z"
},
"relationships": {
"authentication_factors": {
"data": [
{
"type": "authentication_factor",
"id": "5"
}
],
"links": {
"related": "https://api.tintup.com/v2/authentication_factors"
}
},
"teams": {
"data": [
{
"type": "team",
"id": "1"
}
],
"links": {
"related": "https://api.tintup.com/v2/teams"
}
}
},
"links": {
"self": "https://api.tintup.com/v2/me"
}
},
"included": [
{}
]
}{
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"title": "Invalid name",
"detail": "Name can't be blank",
"source": {
"pointer": "/data/attributes/name"
}
}
]
}Retrieve a list of users
Returns the members of the team.
Parameters
team_idintegerrequiredpathThe ID of the team.
includeArray<string>rolequeryA comma-separated list of related resources to include in the response.
filterobjectqueryFilters the team's users. email, first_name and last_name are exact matches and are combined; the other filters are combined with them.
sortArray<string>id-idcreated_at-created_atupdated_at-updated_atskip_idp-skip_idp-idqueryA comma-separated list of attributes to sort by. Prefix an attribute with - to sort in descending order. id sorts by the order in which users were added to the team.
pageobjectqueryOffset pagination. Use page[size] to set the number of items per page and page[number] to select a page. The response's links object contains ready-to-use URLs for the next and previous pages.
Response
A list of team users.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: users:read
curl -X GET 'https://api.tintup.com/v2/teams/{team_id}/users'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/users', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.tintup.com/v2/teams/{team_id}/users')
data = response.json(){
"data": [
{
"id": "42",
"type": "user",
"attributes": {
"first_name": "Jane",
"last_name": "Doe",
"organization": "Acme Inc.",
"image_url": "https://cdn.example.com/avatars/jane-doe.png",
"email": "jane.doe@example.com",
"skip_idp": false,
"created_at": "2025-01-08T13:22:10.000Z",
"updated_at": "2025-03-14T16:42:07.000Z"
},
"relationships": {
"role": {
"data": {
"type": "role",
"id": "3"
}
}
}
}
],
"included": [
{}
],
"links": {
"self": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=2",
"first": "https://api.tintup.com/v2/teams/1/tints",
"next": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=3",
"prev": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=1"
},
"meta": {
"total": 12
}
}{
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}Invite users to a team
Invites a single user (application/vnd.api+json with a single resource object) or multiple users (application/vnd.api+json; ext=bulk with an array of resource objects) to the team, and emails them an invitation. An account is created for email addresses that don't have one yet. The response contains a single user or an array of users accordingly.
Body
The user to invite, or, with the ext=bulk media type, an array of users to invite. When any of the users is invalid, none are invited.
application/vnd.api+jsonobjectdataNewTeamUserrequiredapplication/vnd.api+json; ext=bulkobjectdataArray<NewTeamUser>requiredParameters
team_idintegerrequiredpathThe ID of the team.
Response
The invited user, or an array of the invited users when the request contained an array of resource objects.
Unauthorized. The access token is missing, invalid, expired or revoked.
Payment Required. Inviting the users would exceed the number of users allowed by the team's plan.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Unprocessable Entity. The request is missing required parameters or the resource is invalid.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: users:write
curl -X POST 'https://api.tintup.com/v2/teams/{team_id}/users' \
-H 'Content-Type: application/vnd.api+json' \
-d '{
"data": {
"type": "user",
"attributes": {
"email": "john.smith@example.com",
"role_id": 3
}
}
}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/users', {
method: 'POST',
headers: {
'Content-Type': 'application/vnd.api+json',
},
body: JSON.stringify({
"data": {
"type": "user",
"attributes": {
"email": "john.smith@example.com",
"role_id": 3
}
}
}),
});
const data = await response.json();import requests
payload = {
"data": {
"type": "user",
"attributes": {
"email": "john.smith@example.com",
"role_id": 3
}
}
}
response = requests.post('https://api.tintup.com/v2/teams/{team_id}/users', json=payload)
data = response.json(){
"data": {
"type": "user",
"attributes": {
"email": "john.smith@example.com",
"role_id": 3
}
}
}{
"data": [
{
"type": "user",
"attributes": {
"email": "john.smith@example.com",
"role_id": 3
}
},
{
"type": "user",
"attributes": {
"email": "maria.garcia@example.com",
"role_id": 4,
"skip_idp": true
}
}
]
}{
"data": {
"id": "42",
"type": "user",
"attributes": {
"first_name": "Jane",
"last_name": "Doe",
"organization": "Acme Inc.",
"image_url": "https://cdn.example.com/avatars/jane-doe.png",
"email": "jane.doe@example.com",
"skip_idp": false,
"created_at": "2025-01-08T13:22:10.000Z",
"updated_at": "2025-03-14T16:42:07.000Z"
},
"relationships": {
"role": {
"data": {
"type": "role",
"id": "3"
}
}
}
}
}{
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4020001",
"title": "Payment Required",
"status": "402",
"detail": "You have exceeded your plan's limit of 10"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"title": "Invalid name",
"detail": "Name can't be blank",
"source": {
"pointer": "/data/attributes/name"
}
}
]
}Remove multiple users from a team
The authenticated user can't remove themselves and is skipped, as are users that aren't members of the team.
Body
The users to remove from the team.
dataArray<TeamUserIdentifier>requiredParameters
team_idintegerrequiredpathThe ID of the team.
Response
No Content. The request succeeded and there is no response body.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Unprocessable Entity. The request is missing required parameters or the resource is invalid.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: users:write
curl -X DELETE 'https://api.tintup.com/v2/teams/{team_id}/users' \
-H 'Content-Type: application/vnd.api+json; ext=bulk' \
-d '{
"data": [
{
"id": "42",
"type": "user"
},
{
"id": "57",
"type": "user"
}
]
}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/users', {
method: 'DELETE',
headers: {
'Content-Type': 'application/vnd.api+json; ext=bulk',
},
body: JSON.stringify({
"data": [
{
"id": "42",
"type": "user"
},
{
"id": "57",
"type": "user"
}
]
}),
});
const data = await response.json();import requests
payload = {
"data": [
{
"id": "42",
"type": "user"
},
{
"id": "57",
"type": "user"
}
]
}
response = requests.delete('https://api.tintup.com/v2/teams/{team_id}/users', json=payload)
data = response.json(){
"data": [
{
"id": "42",
"type": "user"
},
{
"id": "57",
"type": "user"
}
]
}{
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"title": "Invalid name",
"detail": "Name can't be blank",
"source": {
"pointer": "/data/attributes/name"
}
}
]
}Update multiple users
Updates the role and skip_idp attribute of several team members at once. Users that aren't members of the team are skipped, and you can't update yourself. PUT is also accepted.
Body
The users to update. When any of the users is invalid, none are updated.
dataArray<TeamUserUpdate>requiredParameters
team_idintegerrequiredpathThe ID of the team.
Response
The updated team users.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Unprocessable Entity. The request is missing required parameters or the resource is invalid.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: users:write
curl -X PATCH 'https://api.tintup.com/v2/teams/{team_id}/users' \
-H 'Content-Type: application/vnd.api+json; ext=bulk' \
-d '{
"data": [
{
"id": "42",
"type": "user",
"attributes": {
"role_id": 4
}
},
{
"id": "57",
"type": "user",
"attributes": {
"skip_idp": true
}
}
]
}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/users', {
method: 'PATCH',
headers: {
'Content-Type': 'application/vnd.api+json; ext=bulk',
},
body: JSON.stringify({
"data": [
{
"id": "42",
"type": "user",
"attributes": {
"role_id": 4
}
},
{
"id": "57",
"type": "user",
"attributes": {
"skip_idp": true
}
}
]
}),
});
const data = await response.json();import requests
payload = {
"data": [
{
"id": "42",
"type": "user",
"attributes": {
"role_id": 4
}
},
{
"id": "57",
"type": "user",
"attributes": {
"skip_idp": True
}
}
]
}
response = requests.patch('https://api.tintup.com/v2/teams/{team_id}/users', json=payload)
data = response.json(){
"data": [
{
"id": "42",
"type": "user",
"attributes": {
"role_id": 4
}
},
{
"id": "57",
"type": "user",
"attributes": {
"skip_idp": true
}
}
]
}{
"data": [
{
"id": "42",
"type": "user",
"attributes": {
"first_name": "Jane",
"last_name": "Doe",
"organization": "Acme Inc.",
"image_url": "https://cdn.example.com/avatars/jane-doe.png",
"email": "jane.doe@example.com",
"skip_idp": false,
"created_at": "2025-01-08T13:22:10.000Z",
"updated_at": "2025-03-14T16:42:07.000Z"
},
"relationships": {
"role": {
"data": {
"type": "role",
"id": "3"
}
}
}
}
]
}{
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"title": "Invalid name",
"detail": "Name can't be blank",
"source": {
"pointer": "/data/attributes/name"
}
}
]
}Retrieve a user
Returns a member of the team.
Parameters
team_idintegerrequiredpathThe ID of the team.
user_idintegerrequiredpathThe ID of the user.
includeArray<string>rolequeryA comma-separated list of related resources to include in the response.
Response
The team user.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Not Found.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: users:read
curl -X GET 'https://api.tintup.com/v2/teams/{team_id}/users/{user_id}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/users/{user_id}', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.tintup.com/v2/teams/{team_id}/users/{user_id}')
data = response.json(){
"data": {
"id": "42",
"type": "user",
"attributes": {
"first_name": "Jane",
"last_name": "Doe",
"organization": "Acme Inc.",
"image_url": "https://cdn.example.com/avatars/jane-doe.png",
"email": "jane.doe@example.com",
"skip_idp": false,
"created_at": "2025-01-08T13:22:10.000Z",
"updated_at": "2025-03-14T16:42:07.000Z"
},
"relationships": {
"role": {
"data": {
"type": "role",
"id": "3"
}
}
}
},
"included": [
{}
]
}{
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"code": "404",
"title": "Not found",
"status": "404"
}
]
}Remove a user from a team
The authenticated user can't remove themselves.
Parameters
team_idintegerrequiredpathThe ID of the team.
user_idintegerrequiredpathThe ID of the user.
Response
No Content. The request succeeded and there is no response body.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Not Found.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: users:write
curl -X DELETE 'https://api.tintup.com/v2/teams/{team_id}/users/{user_id}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/users/{user_id}', {
method: 'DELETE',
});
const data = await response.json();import requests
response = requests.delete('https://api.tintup.com/v2/teams/{team_id}/users/{user_id}')
data = response.json(){
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"code": "404",
"title": "Not found",
"status": "404"
}
]
}Update a user
Updates the role and skip_idp attribute of a team member. You can't update yourself.
Body
The membership attributes of the user to change.
dataTeamUserUpdaterequiredParameters
team_idintegerrequiredpathThe ID of the team.
user_idintegerrequiredpathThe ID of the user.
includeArray<string>rolequeryA comma-separated list of related resources to include in the response.
Response
The team user.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Not Found.
Unprocessable Entity. The request is missing required parameters or the resource is invalid.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: users:write
curl -X PATCH 'https://api.tintup.com/v2/teams/{team_id}/users/{user_id}' \
-H 'Content-Type: application/vnd.api+json' \
-d '{
"data": {
"id": "42",
"type": "user",
"attributes": {
"role_id": 4
}
}
}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/users/{user_id}', {
method: 'PATCH',
headers: {
'Content-Type': 'application/vnd.api+json',
},
body: JSON.stringify({
"data": {
"id": "42",
"type": "user",
"attributes": {
"role_id": 4
}
}
}),
});
const data = await response.json();import requests
payload = {
"data": {
"id": "42",
"type": "user",
"attributes": {
"role_id": 4
}
}
}
response = requests.patch('https://api.tintup.com/v2/teams/{team_id}/users/{user_id}', json=payload)
data = response.json(){
"data": {
"id": "42",
"type": "user",
"attributes": {
"role_id": 4
}
}
}{
"data": {
"id": "42",
"type": "user",
"attributes": {
"first_name": "Jane",
"last_name": "Doe",
"organization": "Acme Inc.",
"image_url": "https://cdn.example.com/avatars/jane-doe.png",
"email": "jane.doe@example.com",
"skip_idp": false,
"created_at": "2025-01-08T13:22:10.000Z",
"updated_at": "2025-03-14T16:42:07.000Z"
},
"relationships": {
"role": {
"data": {
"type": "role",
"id": "3"
}
}
}
},
"included": [
{}
]
}{
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"code": "404",
"title": "Not found",
"status": "404"
}
]
}{
"errors": [
{
"title": "Invalid name",
"detail": "Name can't be blank",
"source": {
"pointer": "/data/attributes/name"
}
}
]
}Create a user export request
Asynchronously exports the team's users to a CSV file. Once complete, a websocket message of type teams_user_export_request containing the ID, status and URL is delivered to the user's private channel (private-user- followed by the user's ID). You may also poll the status of the request using the endpoint below.
Body
The export request to create.
dataNewTeamsUserExportRequestrequiredParameters
team_idintegerrequiredpathThe ID of the team.
Response
The team user export request.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: users:read
curl -X POST 'https://api.tintup.com/v2/teams/{team_id}/users/export/requests' \
-H 'Content-Type: application/vnd.api+json' \
-d '{
"data": {
"type": "teams_user_export_request"
}
}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/users/export/requests', {
method: 'POST',
headers: {
'Content-Type': 'application/vnd.api+json',
},
body: JSON.stringify({
"data": {
"type": "teams_user_export_request"
}
}),
});
const data = await response.json();import requests
payload = {
"data": {
"type": "teams_user_export_request"
}
}
response = requests.post('https://api.tintup.com/v2/teams/{team_id}/users/export/requests', json=payload)
data = response.json(){
"data": {
"type": "teams_user_export_request"
}
}{
"data": {
"id": "OxZZQtuh5sXIKA",
"type": "teams_user_export_request",
"attributes": {
"status": "pending",
"url": null
},
"relationships": {
"team": {
"meta": {
"included": false
},
"data": {
"type": "team",
"id": "1"
}
}
}
}
}{
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}Check the status of a user export request
Retrieves the status of one of the team's user export requests.
Parameters
team_idintegerrequiredpathThe ID of the team.
teams_user_export_request_idstringrequiredpathThe ID of the export request, as returned when it was created.
Response
The team user export request.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Not Found.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: users:read
curl -X GET 'https://api.tintup.com/v2/teams/{team_id}/users/export/requests/{teams_user_export_request_id}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/users/export/requests/{teams_user_export_request_id}', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.tintup.com/v2/teams/{team_id}/users/export/requests/{teams_user_export_request_id}')
data = response.json(){
"data": {
"id": "OxZZQtuh5sXIKA",
"type": "teams_user_export_request",
"attributes": {
"status": "pending",
"url": null
},
"relationships": {
"team": {
"meta": {
"included": false
},
"data": {
"type": "team",
"id": "1"
}
}
}
}
}{
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"code": "404",
"title": "Not found",
"status": "404"
}
]
}Teams
teamsRetrieve a list of teams
Returns the teams the authenticated user is a member of.
Parameters
includeArray<string>agentassetsformsmixespersonalizationsplanrolesocial_feedstintsqueryA comma-separated list of related resources to include in the response.
filterobjectqueryFilters the teams.
sortArray<string>id-idname-namecreated_at-created_at-idqueryA comma-separated list of attributes to sort by. Prefix an attribute with - to sort in descending order.
pageobjectqueryOffset pagination. Use page[size] to set the number of items per page and page[number] to select a page. The response's links object contains ready-to-use URLs for the next and previous pages.
Response
A list of the teams the authenticated user is a member of.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: teams:read
curl -X GET 'https://api.tintup.com/v2/teams'const response = await fetch('https://api.tintup.com/v2/teams', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.tintup.com/v2/teams')
data = response.json(){
"data": [
{
"id": "1",
"type": "team",
"attributes": {
"name": "Acme Inc.",
"image_url": "https://cdn.example.com/logos/acme.png",
"url_shortener_type": "tintly",
"onboarding": "completed",
"shared_tags": [
"summer",
"ugc"
],
"saml_enabled": true,
"idp_entity_id": "https://idp.example.com/metadata",
"idp_sso_target_url": "https://idp.example.com/sso/saml",
"idp_cert": "-----BEGIN CERTIFICATE-----\nMIIDdzCCAl+gAwIBAgIEbGx0ZTANBgkqhkiG9w0BAQsFADBsMRAwDgYDVQQGEwdV\n-----END CERTIFICATE-----",
"force_authn": false,
"authn_requests_signed": false,
"want_assertions_signed": true,
"want_assertions_encrypted": false,
"saml_jit_provisioning": true,
"oidc_enabled": false,
"oidc_identifier": "0oa1b2c3d4e5f6g7h8i9",
"oidc_secret": "9f8e7d6c5b4a39281706f5e4d3c2b1a0",
"oidc_scope": "openid email profile",
"oidc_issuer": "https://login.example.com",
"oidc_authorization_endpoint": "https://login.example.com/oauth2/v1/authorize",
"oidc_token_endpoint": "https://login.example.com/oauth2/v1/token",
"oidc_userinfo_endpoint": "https://login.example.com/oauth2/v1/userinfo",
"oidc_jwks_uri": "https://login.example.com/oauth2/v1/keys",
"plan": "tint_professional",
"plan_expires_at": "2026-03-14T00:00:00.000Z",
"plan_changed_at": "2025-03-14T16:42:07.000Z",
"self_service": false,
"rewards_platform_id": "mrc_4f7a2b9c",
"rewards_platform_key": "7d1e3c5a9b2f4e6d8c0a1b3d5f7e9c2a",
"permissions": [
"moderate_tint",
"modify_tint",
"assets_read"
],
"created_at": "2024-11-02T10:05:44.000Z",
"updated_at": "2025-03-14T16:42:07.000Z"
},
"relationships": {
"role": {
"data": {
"type": "role",
"id": "3"
}
},
"plan": {
"data": {
"type": "plan",
"id": "1"
}
},
"agent": {
"data": {
"type": "agent",
"id": "7"
}
},
"tints": {
"data": [
{
"type": "tint",
"id": "1"
}
],
"meta": {
"active_tints_count": 4,
"count": 6
}
},
"social_feeds": {
"data": [
{
"type": "social_feed",
"id": "1"
}
],
"meta": {
"active_count": 12,
"inactive_count": 3,
"access_error_count": 1,
"active_social_feeds_count": 12,
"inactive_social_feeds_count": 3
}
},
"posts": {
"data": [
{
"type": "post",
"id": "1"
}
],
"meta": {
"posts_ingested_from_beginning_of_month": 18250
}
},
"assets": {
"data": [
{
"type": "asset",
"id": "1"
}
],
"meta": {
"count": 320,
"uploaded_count": 45,
"total": 320,
"uploaded_total": 45
}
},
"mixes": {
"data": [
{
"type": "mix",
"id": "1"
}
],
"meta": {
"count": 2
}
},
"forms": {
"data": [
{
"type": "form",
"id": "1"
}
],
"meta": {
"count": 5,
"published_count": 3
}
},
"personalizations": {
"data": [
{
"type": "personalization",
"id": "1"
}
],
"meta": {
"count": 8
}
}
}
}
],
"included": [
{}
],
"links": {
"self": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=2",
"first": "https://api.tintup.com/v2/teams/1/tints",
"next": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=3",
"prev": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=1"
}
}{
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}Create a team
Creates a team on a self-service plan, subscribes it to the plan using the payment token, and makes the authenticated user its administrator. If the payment token can't be processed, the request fails with a 422 Unprocessable Entity error on billing_platform_token.
Body
The team to create.
dataNewTeamrequiredResponse
The team.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Unprocessable Entity. The request is missing required parameters or the resource is invalid.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: teams:write
curl -X POST 'https://api.tintup.com/v2/teams' \
-H 'Content-Type: application/vnd.api+json' \
-d '{
"data": {
"type": "team",
"attributes": {
"name": "Acme Inc.",
"plan": "tint_starter",
"billing_platform_type": "chargify",
"billing_platform_token": "tok_9s8d7f6g5h4j3k2l"
}
}
}'const response = await fetch('https://api.tintup.com/v2/teams', {
method: 'POST',
headers: {
'Content-Type': 'application/vnd.api+json',
},
body: JSON.stringify({
"data": {
"type": "team",
"attributes": {
"name": "Acme Inc.",
"plan": "tint_starter",
"billing_platform_type": "chargify",
"billing_platform_token": "tok_9s8d7f6g5h4j3k2l"
}
}
}),
});
const data = await response.json();import requests
payload = {
"data": {
"type": "team",
"attributes": {
"name": "Acme Inc.",
"plan": "tint_starter",
"billing_platform_type": "chargify",
"billing_platform_token": "tok_9s8d7f6g5h4j3k2l"
}
}
}
response = requests.post('https://api.tintup.com/v2/teams', json=payload)
data = response.json(){
"data": {
"type": "team",
"attributes": {
"name": "Acme Inc.",
"plan": "tint_starter",
"billing_platform_type": "chargify",
"billing_platform_token": "tok_9s8d7f6g5h4j3k2l"
}
}
}{
"data": {
"id": "1",
"type": "team",
"attributes": {
"name": "Acme Inc.",
"image_url": "https://cdn.example.com/logos/acme.png",
"url_shortener_type": "tintly",
"onboarding": "completed",
"shared_tags": [
"summer",
"ugc"
],
"saml_enabled": true,
"idp_entity_id": "https://idp.example.com/metadata",
"idp_sso_target_url": "https://idp.example.com/sso/saml",
"idp_cert": "-----BEGIN CERTIFICATE-----\nMIIDdzCCAl+gAwIBAgIEbGx0ZTANBgkqhkiG9w0BAQsFADBsMRAwDgYDVQQGEwdV\n-----END CERTIFICATE-----",
"force_authn": false,
"authn_requests_signed": false,
"want_assertions_signed": true,
"want_assertions_encrypted": false,
"saml_jit_provisioning": true,
"oidc_enabled": false,
"oidc_identifier": "0oa1b2c3d4e5f6g7h8i9",
"oidc_secret": "9f8e7d6c5b4a39281706f5e4d3c2b1a0",
"oidc_scope": "openid email profile",
"oidc_issuer": "https://login.example.com",
"oidc_authorization_endpoint": "https://login.example.com/oauth2/v1/authorize",
"oidc_token_endpoint": "https://login.example.com/oauth2/v1/token",
"oidc_userinfo_endpoint": "https://login.example.com/oauth2/v1/userinfo",
"oidc_jwks_uri": "https://login.example.com/oauth2/v1/keys",
"plan": "tint_professional",
"plan_expires_at": "2026-03-14T00:00:00.000Z",
"plan_changed_at": "2025-03-14T16:42:07.000Z",
"self_service": false,
"rewards_platform_id": "mrc_4f7a2b9c",
"rewards_platform_key": "7d1e3c5a9b2f4e6d8c0a1b3d5f7e9c2a",
"permissions": [
"moderate_tint",
"modify_tint",
"assets_read"
],
"created_at": "2024-11-02T10:05:44.000Z",
"updated_at": "2025-03-14T16:42:07.000Z"
},
"relationships": {
"role": {
"data": {
"type": "role",
"id": "3"
}
},
"plan": {
"data": {
"type": "plan",
"id": "1"
}
},
"agent": {
"data": {
"type": "agent",
"id": "7"
}
},
"tints": {
"data": [
{
"type": "tint",
"id": "1"
}
],
"meta": {
"active_tints_count": 4,
"count": 6
}
},
"social_feeds": {
"data": [
{
"type": "social_feed",
"id": "1"
}
],
"meta": {
"active_count": 12,
"inactive_count": 3,
"access_error_count": 1,
"active_social_feeds_count": 12,
"inactive_social_feeds_count": 3
}
},
"posts": {
"data": [
{
"type": "post",
"id": "1"
}
],
"meta": {
"posts_ingested_from_beginning_of_month": 18250
}
},
"assets": {
"data": [
{
"type": "asset",
"id": "1"
}
],
"meta": {
"count": 320,
"uploaded_count": 45,
"total": 320,
"uploaded_total": 45
}
},
"mixes": {
"data": [
{
"type": "mix",
"id": "1"
}
],
"meta": {
"count": 2
}
},
"forms": {
"data": [
{
"type": "form",
"id": "1"
}
],
"meta": {
"count": 5,
"published_count": 3
}
},
"personalizations": {
"data": [
{
"type": "personalization",
"id": "1"
}
],
"meta": {
"count": 8
}
}
}
},
"included": [
{}
]
}{
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"title": "Invalid name",
"detail": "Name can't be blank",
"source": {
"pointer": "/data/attributes/name"
}
}
]
}Retrieve a team
Returns a team the authenticated user is a member of.
Parameters
team_idintegerrequiredpathThe ID of the team.
includeArray<string>agentassetsformsmixespersonalizationsplanrolesocial_feedstintsqueryA comma-separated list of related resources to include in the response.
Response
The team.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Not Found.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: teams:read
curl -X GET 'https://api.tintup.com/v2/teams/{team_id}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.tintup.com/v2/teams/{team_id}')
data = response.json(){
"data": {
"id": "1",
"type": "team",
"attributes": {
"name": "Acme Inc.",
"image_url": "https://cdn.example.com/logos/acme.png",
"url_shortener_type": "tintly",
"onboarding": "completed",
"shared_tags": [
"summer",
"ugc"
],
"saml_enabled": true,
"idp_entity_id": "https://idp.example.com/metadata",
"idp_sso_target_url": "https://idp.example.com/sso/saml",
"idp_cert": "-----BEGIN CERTIFICATE-----\nMIIDdzCCAl+gAwIBAgIEbGx0ZTANBgkqhkiG9w0BAQsFADBsMRAwDgYDVQQGEwdV\n-----END CERTIFICATE-----",
"force_authn": false,
"authn_requests_signed": false,
"want_assertions_signed": true,
"want_assertions_encrypted": false,
"saml_jit_provisioning": true,
"oidc_enabled": false,
"oidc_identifier": "0oa1b2c3d4e5f6g7h8i9",
"oidc_secret": "9f8e7d6c5b4a39281706f5e4d3c2b1a0",
"oidc_scope": "openid email profile",
"oidc_issuer": "https://login.example.com",
"oidc_authorization_endpoint": "https://login.example.com/oauth2/v1/authorize",
"oidc_token_endpoint": "https://login.example.com/oauth2/v1/token",
"oidc_userinfo_endpoint": "https://login.example.com/oauth2/v1/userinfo",
"oidc_jwks_uri": "https://login.example.com/oauth2/v1/keys",
"plan": "tint_professional",
"plan_expires_at": "2026-03-14T00:00:00.000Z",
"plan_changed_at": "2025-03-14T16:42:07.000Z",
"self_service": false,
"rewards_platform_id": "mrc_4f7a2b9c",
"rewards_platform_key": "7d1e3c5a9b2f4e6d8c0a1b3d5f7e9c2a",
"permissions": [
"moderate_tint",
"modify_tint",
"assets_read"
],
"created_at": "2024-11-02T10:05:44.000Z",
"updated_at": "2025-03-14T16:42:07.000Z"
},
"relationships": {
"role": {
"data": {
"type": "role",
"id": "3"
}
},
"plan": {
"data": {
"type": "plan",
"id": "1"
}
},
"agent": {
"data": {
"type": "agent",
"id": "7"
}
},
"tints": {
"data": [
{
"type": "tint",
"id": "1"
}
],
"meta": {
"active_tints_count": 4,
"count": 6
}
},
"social_feeds": {
"data": [
{
"type": "social_feed",
"id": "1"
}
],
"meta": {
"active_count": 12,
"inactive_count": 3,
"access_error_count": 1,
"active_social_feeds_count": 12,
"inactive_social_feeds_count": 3
}
},
"posts": {
"data": [
{
"type": "post",
"id": "1"
}
],
"meta": {
"posts_ingested_from_beginning_of_month": 18250
}
},
"assets": {
"data": [
{
"type": "asset",
"id": "1"
}
],
"meta": {
"count": 320,
"uploaded_count": 45,
"total": 320,
"uploaded_total": 45
}
},
"mixes": {
"data": [
{
"type": "mix",
"id": "1"
}
],
"meta": {
"count": 2
}
},
"forms": {
"data": [
{
"type": "form",
"id": "1"
}
],
"meta": {
"count": 5,
"published_count": 3
}
},
"personalizations": {
"data": [
{
"type": "personalization",
"id": "1"
}
],
"meta": {
"count": 8
}
}
}
},
"included": [
{}
]
}{
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"code": "404",
"title": "Not found",
"status": "404"
}
]
}Delete a team
Cancels the team's subscription at the end of the current billing period. Only available to teams billed through Chargify; otherwise, the request fails with a 403 Forbidden error.
Parameters
team_idintegerrequiredpathThe ID of the team.
Response
No Content. The request succeeded and there is no response body.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Not Found.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: teams:write
curl -X DELETE 'https://api.tintup.com/v2/teams/{team_id}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}', {
method: 'DELETE',
});
const data = await response.json();import requests
response = requests.delete('https://api.tintup.com/v2/teams/{team_id}')
data = response.json(){
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"code": "404",
"title": "Not found",
"status": "404"
}
]
}Update a team
Updates the team.
Body
The attributes of the team to change.
dataTeamUpdaterequiredParameters
team_idintegerrequiredpathThe ID of the team.
includeArray<string>agentassetsformsmixespersonalizationsplanrolesocial_feedstintsqueryA comma-separated list of related resources to include in the response.
Response
The team.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Not Found.
Unprocessable Entity. The request is missing required parameters or the resource is invalid.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: teams:write
curl -X PATCH 'https://api.tintup.com/v2/teams/{team_id}' \
-H 'Content-Type: application/vnd.api+json' \
-d '{
"data": {
"id": "1",
"type": "team",
"attributes": {
"name": "Acme Inc.",
"image_url": "https://cdn.example.com/logos/acme.png",
"shared_tags": true
}
}
}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}', {
method: 'PATCH',
headers: {
'Content-Type': 'application/vnd.api+json',
},
body: JSON.stringify({
"data": {
"id": "1",
"type": "team",
"attributes": {
"name": "Acme Inc.",
"image_url": "https://cdn.example.com/logos/acme.png",
"shared_tags": true
}
}
}),
});
const data = await response.json();import requests
payload = {
"data": {
"id": "1",
"type": "team",
"attributes": {
"name": "Acme Inc.",
"image_url": "https://cdn.example.com/logos/acme.png",
"shared_tags": True
}
}
}
response = requests.patch('https://api.tintup.com/v2/teams/{team_id}', json=payload)
data = response.json(){
"data": {
"id": "1",
"type": "team",
"attributes": {
"name": "Acme Inc.",
"image_url": "https://cdn.example.com/logos/acme.png",
"shared_tags": true
}
}
}{
"data": {
"id": "1",
"type": "team",
"attributes": {
"name": "Acme Inc.",
"image_url": "https://cdn.example.com/logos/acme.png",
"url_shortener_type": "tintly",
"onboarding": "completed",
"shared_tags": [
"summer",
"ugc"
],
"saml_enabled": true,
"idp_entity_id": "https://idp.example.com/metadata",
"idp_sso_target_url": "https://idp.example.com/sso/saml",
"idp_cert": "-----BEGIN CERTIFICATE-----\nMIIDdzCCAl+gAwIBAgIEbGx0ZTANBgkqhkiG9w0BAQsFADBsMRAwDgYDVQQGEwdV\n-----END CERTIFICATE-----",
"force_authn": false,
"authn_requests_signed": false,
"want_assertions_signed": true,
"want_assertions_encrypted": false,
"saml_jit_provisioning": true,
"oidc_enabled": false,
"oidc_identifier": "0oa1b2c3d4e5f6g7h8i9",
"oidc_secret": "9f8e7d6c5b4a39281706f5e4d3c2b1a0",
"oidc_scope": "openid email profile",
"oidc_issuer": "https://login.example.com",
"oidc_authorization_endpoint": "https://login.example.com/oauth2/v1/authorize",
"oidc_token_endpoint": "https://login.example.com/oauth2/v1/token",
"oidc_userinfo_endpoint": "https://login.example.com/oauth2/v1/userinfo",
"oidc_jwks_uri": "https://login.example.com/oauth2/v1/keys",
"plan": "tint_professional",
"plan_expires_at": "2026-03-14T00:00:00.000Z",
"plan_changed_at": "2025-03-14T16:42:07.000Z",
"self_service": false,
"rewards_platform_id": "mrc_4f7a2b9c",
"rewards_platform_key": "7d1e3c5a9b2f4e6d8c0a1b3d5f7e9c2a",
"permissions": [
"moderate_tint",
"modify_tint",
"assets_read"
],
"created_at": "2024-11-02T10:05:44.000Z",
"updated_at": "2025-03-14T16:42:07.000Z"
},
"relationships": {
"role": {
"data": {
"type": "role",
"id": "3"
}
},
"plan": {
"data": {
"type": "plan",
"id": "1"
}
},
"agent": {
"data": {
"type": "agent",
"id": "7"
}
},
"tints": {
"data": [
{
"type": "tint",
"id": "1"
}
],
"meta": {
"active_tints_count": 4,
"count": 6
}
},
"social_feeds": {
"data": [
{
"type": "social_feed",
"id": "1"
}
],
"meta": {
"active_count": 12,
"inactive_count": 3,
"access_error_count": 1,
"active_social_feeds_count": 12,
"inactive_social_feeds_count": 3
}
},
"posts": {
"data": [
{
"type": "post",
"id": "1"
}
],
"meta": {
"posts_ingested_from_beginning_of_month": 18250
}
},
"assets": {
"data": [
{
"type": "asset",
"id": "1"
}
],
"meta": {
"count": 320,
"uploaded_count": 45,
"total": 320,
"uploaded_total": 45
}
},
"mixes": {
"data": [
{
"type": "mix",
"id": "1"
}
],
"meta": {
"count": 2
}
},
"forms": {
"data": [
{
"type": "form",
"id": "1"
}
],
"meta": {
"count": 5,
"published_count": 3
}
},
"personalizations": {
"data": [
{
"type": "personalization",
"id": "1"
}
],
"meta": {
"count": 8
}
}
}
},
"included": [
{}
]
}{
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"code": "404",
"title": "Not found",
"status": "404"
}
]
}{
"errors": [
{
"title": "Invalid name",
"detail": "Name can't be blank",
"source": {
"pointer": "/data/attributes/name"
}
}
]
}Experience Builder
group_experience_builderExperiences
experiencesRetrieve a list of experiences
Returns the experiences the user has access to.
Parameters
team_idintegerrequiredpathThe ID of the team.
includeArray<string>domainform_submission_keyssubmissionsuserqueryA comma-separated list of related resources to include in the response. Only applies to authenticated requests.
pageobjectqueryOffset pagination. Use page[size] to set the number of items per page and page[number] to select a page. The response's links object contains ready-to-use URLs for the next and previous pages.
filterobjectqueryFilters the list of experiences.
sortstring-idqueryA comma-separated list of attributes to sort by. Prefix an attribute with - to sort in descending order.
Response
A list of experiences.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: experiences:read
curl -X GET 'https://api.tintup.com/v2/teams/{team_id}/experiences'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/experiences', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.tintup.com/v2/teams/{team_id}/experiences')
data = response.json(){
"data": [
{
"id": "42",
"type": "experience",
"attributes": {
"type": "sweepstakes",
"title": "Win a trip to Hawaii",
"description": "Enter our summer sweepstakes for a chance to win a trip for two.",
"analytics_id": "GTM-5XK7Q2P",
"analytics_type": "google_tag_manager",
"captcha_type": null,
"captcha_public_key": null,
"cookie_consent": true,
"noindex": false,
"favicon_url": "https://cdn.example.com/favicons/acme.png",
"maximum_image_size": 104857600,
"maximum_video_size": 1048576000,
"bypass_mime_type_validation": false,
"name": "Summer Sweepstakes 2025",
"status": "active",
"slug": "summer-sweepstakes",
"data": {
"draft": [
{
"sectionType": "banner",
"data": {
"content": {
"title": "Win a trip to Hawaii"
}
}
},
{
"sectionType": "form",
"data": {
"content": {
"fields": [
{
"key": "email",
"type": "email"
}
]
}
}
}
],
"published": [
{
"sectionType": "banner",
"data": {
"content": {
"title": "Win a trip to Hawaii"
}
}
},
{
"sectionType": "form",
"data": {
"content": {
"fields": [
{
"key": "email",
"type": "email"
}
]
}
}
}
],
"locales": {
"draft": [
{
"value": "en",
"isDefault": true
}
],
"published": [
{
"value": "en",
"isDefault": true
}
]
},
"translations": {
"draft": {
"en": {}
},
"published": {
"en": {}
}
},
"customFonts": {
"draft": {},
"published": {}
}
},
"created_at": "2025-03-14T16:42:07.000Z",
"updated_at": "2025-03-18T09:12:44.000Z"
},
"relationships": {
"domain": {
"data": {
"type": "domain",
"id": "3"
}
},
"form_submission_keys": {
"data": [
{
"type": "form_submission_key",
"id": "email"
}
],
"meta": {
"included": false
}
},
"user": {
"data": {
"type": "team",
"id": "1"
},
"meta": {
"included": false
}
},
"submissions": {
"data": [
{
"type": "form_submission",
"id": "88213"
}
],
"links": {
"related": "https://api.tintup.com/v2/teams/1/experiences/42/form_submissions",
"first": "https://api.tintup.com/v2/teams/1/experiences/42/form_submissions",
"next": "https://api.tintup.com/v2/teams/1/experiences/42/form_submissions?page%5Bnumber%5D=2"
},
"meta": {
"total": 1289,
"count": 1289
}
}
},
"links": {
"public": "https://contests.example.com/summer-sweepstakes"
}
}
],
"links": {
"self": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=2",
"first": "https://api.tintup.com/v2/teams/1/tints",
"next": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=3",
"prev": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=1"
},
"meta": {
"total": 18
}
}{
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}Create an experience
Creates an experience and grants access to it to the user's role and to the roles that have access to new experiences.
Body
The experience to create.
dataNewExperiencerequiredParameters
team_idintegerrequiredpathThe ID of the team.
includeArray<string>domainform_submission_keyssubmissionsuserqueryA comma-separated list of related resources to include in the response. Only applies to authenticated requests.
Response
The experience.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Unprocessable Entity. The request is missing required parameters or the resource is invalid.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: experiences:write
curl -X POST 'https://api.tintup.com/v2/teams/{team_id}/experiences' \
-H 'Content-Type: application/vnd.api+json' \
-d '{
"data": {
"type": "experience",
"attributes": {
"type": "sweepstakes",
"name": "Summer Sweepstakes 2025",
"title": "Win a trip to Hawaii",
"slug": "summer-sweepstakes",
"domain_id": 3,
"cookie_consent": true
}
}
}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/experiences', {
method: 'POST',
headers: {
'Content-Type': 'application/vnd.api+json',
},
body: JSON.stringify({
"data": {
"type": "experience",
"attributes": {
"type": "sweepstakes",
"name": "Summer Sweepstakes 2025",
"title": "Win a trip to Hawaii",
"slug": "summer-sweepstakes",
"domain_id": 3,
"cookie_consent": true
}
}
}),
});
const data = await response.json();import requests
payload = {
"data": {
"type": "experience",
"attributes": {
"type": "sweepstakes",
"name": "Summer Sweepstakes 2025",
"title": "Win a trip to Hawaii",
"slug": "summer-sweepstakes",
"domain_id": 3,
"cookie_consent": True
}
}
}
response = requests.post('https://api.tintup.com/v2/teams/{team_id}/experiences', json=payload)
data = response.json(){
"data": {
"type": "experience",
"attributes": {
"type": "sweepstakes",
"name": "Summer Sweepstakes 2025",
"title": "Win a trip to Hawaii",
"slug": "summer-sweepstakes",
"domain_id": 3,
"cookie_consent": true
}
}
}{
"data": {
"id": "42",
"type": "experience",
"attributes": {
"type": "sweepstakes",
"title": "Win a trip to Hawaii",
"description": "Enter our summer sweepstakes for a chance to win a trip for two.",
"analytics_id": "GTM-5XK7Q2P",
"analytics_type": "google_tag_manager",
"captcha_type": null,
"captcha_public_key": null,
"cookie_consent": true,
"noindex": false,
"favicon_url": "https://cdn.example.com/favicons/acme.png",
"maximum_image_size": 104857600,
"maximum_video_size": 1048576000,
"bypass_mime_type_validation": false,
"name": "Summer Sweepstakes 2025",
"status": "active",
"slug": "summer-sweepstakes",
"data": {
"draft": [
{
"sectionType": "banner",
"data": {
"content": {
"title": "Win a trip to Hawaii"
}
}
},
{
"sectionType": "form",
"data": {
"content": {
"fields": [
{
"key": "email",
"type": "email"
}
]
}
}
}
],
"published": [
{
"sectionType": "banner",
"data": {
"content": {
"title": "Win a trip to Hawaii"
}
}
},
{
"sectionType": "form",
"data": {
"content": {
"fields": [
{
"key": "email",
"type": "email"
}
]
}
}
}
],
"locales": {
"draft": [
{
"value": "en",
"isDefault": true
}
],
"published": [
{
"value": "en",
"isDefault": true
}
]
},
"translations": {
"draft": {
"en": {}
},
"published": {
"en": {}
}
},
"customFonts": {
"draft": {},
"published": {}
}
},
"created_at": "2025-03-14T16:42:07.000Z",
"updated_at": "2025-03-18T09:12:44.000Z"
},
"relationships": {
"domain": {
"data": {
"type": "domain",
"id": "3"
}
},
"form_submission_keys": {
"data": [
{
"type": "form_submission_key",
"id": "email"
}
],
"meta": {
"included": false
}
},
"user": {
"data": {
"type": "team",
"id": "1"
},
"meta": {
"included": false
}
},
"submissions": {
"data": [
{
"type": "form_submission",
"id": "88213"
}
],
"links": {
"related": "https://api.tintup.com/v2/teams/1/experiences/42/form_submissions",
"first": "https://api.tintup.com/v2/teams/1/experiences/42/form_submissions",
"next": "https://api.tintup.com/v2/teams/1/experiences/42/form_submissions?page%5Bnumber%5D=2"
},
"meta": {
"total": 1289,
"count": 1289
}
}
},
"links": {
"public": "https://contests.example.com/summer-sweepstakes"
}
}
}{
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"title": "Invalid name",
"detail": "Name can't be blank",
"source": {
"pointer": "/data/attributes/name"
}
}
]
}Delete multiple experiences
Deletes several experiences at once.
Body
The experiences to delete. IDs the user can't access are ignored.
dataArray<ExperienceIdentifier>requiredParameters
team_idintegerrequiredpathThe ID of the team.
Response
No Content. The request succeeded and there is no response body.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: experiences:write
curl -X DELETE 'https://api.tintup.com/v2/teams/{team_id}/experiences' \
-H 'Content-Type: application/vnd.api+json; ext=bulk' \
-d '{
"data": [
{
"id": "42",
"type": "experience"
},
{
"id": "43",
"type": "experience"
}
]
}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/experiences', {
method: 'DELETE',
headers: {
'Content-Type': 'application/vnd.api+json; ext=bulk',
},
body: JSON.stringify({
"data": [
{
"id": "42",
"type": "experience"
},
{
"id": "43",
"type": "experience"
}
]
}),
});
const data = await response.json();import requests
payload = {
"data": [
{
"id": "42",
"type": "experience"
},
{
"id": "43",
"type": "experience"
}
]
}
response = requests.delete('https://api.tintup.com/v2/teams/{team_id}/experiences', json=payload)
data = response.json(){
"data": [
{
"id": "42",
"type": "experience"
},
{
"id": "43",
"type": "experience"
}
]
}{
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}Update multiple experiences
Updates several experiences in a single request. If any experience is invalid, none are updated and the errors are returned. The experience type can't be changed. PUT is accepted as an alias of PATCH.
Body
The experiences to update. If any experience is invalid, none are updated.
dataArray<ExperienceBulkUpdate>requiredParameters
team_idintegerrequiredpathThe ID of the team.
Response
A list of experiences.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Unprocessable Entity. The request is missing required parameters or the resource is invalid.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: experiences:write
curl -X PATCH 'https://api.tintup.com/v2/teams/{team_id}/experiences' \
-H 'Content-Type: application/vnd.api+json; ext=bulk' \
-d '{
"data": [
{
"id": "42",
"type": "experience",
"attributes": {
"status": "archived"
}
},
{
"id": "43",
"type": "experience",
"attributes": {
"status": "archived"
}
}
]
}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/experiences', {
method: 'PATCH',
headers: {
'Content-Type': 'application/vnd.api+json; ext=bulk',
},
body: JSON.stringify({
"data": [
{
"id": "42",
"type": "experience",
"attributes": {
"status": "archived"
}
},
{
"id": "43",
"type": "experience",
"attributes": {
"status": "archived"
}
}
]
}),
});
const data = await response.json();import requests
payload = {
"data": [
{
"id": "42",
"type": "experience",
"attributes": {
"status": "archived"
}
},
{
"id": "43",
"type": "experience",
"attributes": {
"status": "archived"
}
}
]
}
response = requests.patch('https://api.tintup.com/v2/teams/{team_id}/experiences', json=payload)
data = response.json(){
"data": [
{
"id": "42",
"type": "experience",
"attributes": {
"status": "archived"
}
},
{
"id": "43",
"type": "experience",
"attributes": {
"status": "archived"
}
}
]
}{
"data": [
{
"id": "42",
"type": "experience",
"attributes": {
"type": "sweepstakes",
"title": "Win a trip to Hawaii",
"description": "Enter our summer sweepstakes for a chance to win a trip for two.",
"analytics_id": "GTM-5XK7Q2P",
"analytics_type": "google_tag_manager",
"captcha_type": null,
"captcha_public_key": null,
"cookie_consent": true,
"noindex": false,
"favicon_url": "https://cdn.example.com/favicons/acme.png",
"maximum_image_size": 104857600,
"maximum_video_size": 1048576000,
"bypass_mime_type_validation": false,
"name": "Summer Sweepstakes 2025",
"status": "active",
"slug": "summer-sweepstakes",
"data": {
"draft": [
{
"sectionType": "banner",
"data": {
"content": {
"title": "Win a trip to Hawaii"
}
}
},
{
"sectionType": "form",
"data": {
"content": {
"fields": [
{
"key": "email",
"type": "email"
}
]
}
}
}
],
"published": [
{
"sectionType": "banner",
"data": {
"content": {
"title": "Win a trip to Hawaii"
}
}
},
{
"sectionType": "form",
"data": {
"content": {
"fields": [
{
"key": "email",
"type": "email"
}
]
}
}
}
],
"locales": {
"draft": [
{
"value": "en",
"isDefault": true
}
],
"published": [
{
"value": "en",
"isDefault": true
}
]
},
"translations": {
"draft": {
"en": {}
},
"published": {
"en": {}
}
},
"customFonts": {
"draft": {},
"published": {}
}
},
"created_at": "2025-03-14T16:42:07.000Z",
"updated_at": "2025-03-18T09:12:44.000Z"
},
"relationships": {
"domain": {
"data": {
"type": "domain",
"id": "3"
}
},
"form_submission_keys": {
"data": [
{
"type": "form_submission_key",
"id": "email"
}
],
"meta": {
"included": false
}
},
"user": {
"data": {
"type": "team",
"id": "1"
},
"meta": {
"included": false
}
},
"submissions": {
"data": [
{
"type": "form_submission",
"id": "88213"
}
],
"links": {
"related": "https://api.tintup.com/v2/teams/1/experiences/42/form_submissions",
"first": "https://api.tintup.com/v2/teams/1/experiences/42/form_submissions",
"next": "https://api.tintup.com/v2/teams/1/experiences/42/form_submissions?page%5Bnumber%5D=2"
},
"meta": {
"total": 1289,
"count": 1289
}
}
},
"links": {
"public": "https://contests.example.com/summer-sweepstakes"
}
}
],
"links": {
"self": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=2",
"first": "https://api.tintup.com/v2/teams/1/tints",
"next": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=3",
"prev": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=1"
}
}{
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"title": "Invalid name",
"detail": "Name can't be blank",
"source": {
"pointer": "/data/attributes/name"
}
}
]
}Retrieve an experience
With an access token, retrieves one of the experiences the user has access to by ID. Without an Authorization header, retrieves a published experience by ID or by slug. When using a slug, team_id may also be the name of the experience's custom domain, the request's Referer must be allowed for the experience, and the experience's impression count is incremented.
Parameters
team_idinteger | stringrequiredpathThe ID of the team. When retrieving a published experience by slug, this can also be the name of the experience's custom domain.
experience_idinteger | stringrequiredpathThe ID or slug of the experience. Slugs are only accepted when retrieving a published experience without authentication.
includeArray<string>domainform_submission_keyssubmissionsuserqueryA comma-separated list of related resources to include in the response. Only applies to authenticated requests.
Response
The experience. Unauthenticated requests receive a reduced set of attributes.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Not Found.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: experiences:read
curl -X GET 'https://api.tintup.com/v2/teams/{team_id}/experiences/{experience_id}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/experiences/{experience_id}', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.tintup.com/v2/teams/{team_id}/experiences/{experience_id}')
data = response.json(){
"data": {
"id": "42",
"type": "experience",
"attributes": {
"type": "sweepstakes",
"title": "Win a trip to Hawaii",
"description": "Enter our summer sweepstakes for a chance to win a trip for two.",
"analytics_id": "GTM-5XK7Q2P",
"analytics_type": "google_tag_manager",
"captcha_type": null,
"captcha_public_key": null,
"cookie_consent": true,
"noindex": false,
"favicon_url": "https://cdn.example.com/favicons/acme.png",
"maximum_image_size": 104857600,
"maximum_video_size": 1048576000,
"bypass_mime_type_validation": false,
"name": "Summer Sweepstakes 2025",
"status": "active",
"slug": "summer-sweepstakes",
"data": {
"draft": [
{
"sectionType": "banner",
"data": {
"content": {
"title": "Win a trip to Hawaii"
}
}
},
{
"sectionType": "form",
"data": {
"content": {
"fields": [
{
"key": "email",
"type": "email"
}
]
}
}
}
],
"published": [
{
"sectionType": "banner",
"data": {
"content": {
"title": "Win a trip to Hawaii"
}
}
},
{
"sectionType": "form",
"data": {
"content": {
"fields": [
{
"key": "email",
"type": "email"
}
]
}
}
}
],
"locales": {
"draft": [
{
"value": "en",
"isDefault": true
}
],
"published": [
{
"value": "en",
"isDefault": true
}
]
},
"translations": {
"draft": {
"en": {}
},
"published": {
"en": {}
}
},
"customFonts": {
"draft": {},
"published": {}
}
},
"created_at": "2025-03-14T16:42:07.000Z",
"updated_at": "2025-03-18T09:12:44.000Z"
},
"relationships": {
"domain": {
"data": {
"type": "domain",
"id": "3"
}
},
"form_submission_keys": {
"data": [
{
"type": "form_submission_key",
"id": "email"
}
],
"meta": {
"included": false
}
},
"user": {
"data": {
"type": "team",
"id": "1"
},
"meta": {
"included": false
}
},
"submissions": {
"data": [
{
"type": "form_submission",
"id": "88213"
}
],
"links": {
"related": "https://api.tintup.com/v2/teams/1/experiences/42/form_submissions",
"first": "https://api.tintup.com/v2/teams/1/experiences/42/form_submissions",
"next": "https://api.tintup.com/v2/teams/1/experiences/42/form_submissions?page%5Bnumber%5D=2"
},
"meta": {
"total": 1289,
"count": 1289
}
}
},
"links": {
"public": "https://contests.example.com/summer-sweepstakes"
}
}
}{
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"code": "404",
"title": "Not found",
"status": "404"
}
]
}Delete an experience
Deletes the experience.
Parameters
team_idintegerrequiredpathThe ID of the team.
experience_idintegerrequiredpathThe ID of the experience.
Response
No Content. The request succeeded and there is no response body.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Not Found.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: experiences:write
curl -X DELETE 'https://api.tintup.com/v2/teams/{team_id}/experiences/{experience_id}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/experiences/{experience_id}', {
method: 'DELETE',
});
const data = await response.json();import requests
response = requests.delete('https://api.tintup.com/v2/teams/{team_id}/experiences/{experience_id}')
data = response.json(){
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"code": "404",
"title": "Not found",
"status": "404"
}
]
}Update an experience
PUT is accepted as an alias of PATCH.
Body
The attributes to change. Attributes that are left out are unchanged.
dataExperienceUpdaterequiredParameters
team_idintegerrequiredpathThe ID of the team.
experience_idintegerrequiredpathThe ID of the experience.
includeArray<string>domainform_submission_keyssubmissionsuserqueryA comma-separated list of related resources to include in the response. Only applies to authenticated requests.
Response
The experience.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Not Found.
Unprocessable Entity. The request is missing required parameters or the resource is invalid.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: experiences:write
curl -X PATCH 'https://api.tintup.com/v2/teams/{team_id}/experiences/{experience_id}' \
-H 'Content-Type: application/vnd.api+json' \
-d '{
"data": {
"type": "experience",
"attributes": {
"title": "Win a trip to Hawaii",
"analytics_type": "google_tag_manager",
"analytics_id": "GTM-5XK7Q2P"
}
}
}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/experiences/{experience_id}', {
method: 'PATCH',
headers: {
'Content-Type': 'application/vnd.api+json',
},
body: JSON.stringify({
"data": {
"type": "experience",
"attributes": {
"title": "Win a trip to Hawaii",
"analytics_type": "google_tag_manager",
"analytics_id": "GTM-5XK7Q2P"
}
}
}),
});
const data = await response.json();import requests
payload = {
"data": {
"type": "experience",
"attributes": {
"title": "Win a trip to Hawaii",
"analytics_type": "google_tag_manager",
"analytics_id": "GTM-5XK7Q2P"
}
}
}
response = requests.patch('https://api.tintup.com/v2/teams/{team_id}/experiences/{experience_id}', json=payload)
data = response.json(){
"data": {
"type": "experience",
"attributes": {
"title": "Win a trip to Hawaii",
"analytics_type": "google_tag_manager",
"analytics_id": "GTM-5XK7Q2P"
}
}
}{
"data": {
"id": "42",
"type": "experience",
"attributes": {
"type": "sweepstakes",
"title": "Win a trip to Hawaii",
"description": "Enter our summer sweepstakes for a chance to win a trip for two.",
"analytics_id": "GTM-5XK7Q2P",
"analytics_type": "google_tag_manager",
"captcha_type": null,
"captcha_public_key": null,
"cookie_consent": true,
"noindex": false,
"favicon_url": "https://cdn.example.com/favicons/acme.png",
"maximum_image_size": 104857600,
"maximum_video_size": 1048576000,
"bypass_mime_type_validation": false,
"name": "Summer Sweepstakes 2025",
"status": "active",
"slug": "summer-sweepstakes",
"data": {
"draft": [
{
"sectionType": "banner",
"data": {
"content": {
"title": "Win a trip to Hawaii"
}
}
},
{
"sectionType": "form",
"data": {
"content": {
"fields": [
{
"key": "email",
"type": "email"
}
]
}
}
}
],
"published": [
{
"sectionType": "banner",
"data": {
"content": {
"title": "Win a trip to Hawaii"
}
}
},
{
"sectionType": "form",
"data": {
"content": {
"fields": [
{
"key": "email",
"type": "email"
}
]
}
}
}
],
"locales": {
"draft": [
{
"value": "en",
"isDefault": true
}
],
"published": [
{
"value": "en",
"isDefault": true
}
]
},
"translations": {
"draft": {
"en": {}
},
"published": {
"en": {}
}
},
"customFonts": {
"draft": {},
"published": {}
}
},
"created_at": "2025-03-14T16:42:07.000Z",
"updated_at": "2025-03-18T09:12:44.000Z"
},
"relationships": {
"domain": {
"data": {
"type": "domain",
"id": "3"
}
},
"form_submission_keys": {
"data": [
{
"type": "form_submission_key",
"id": "email"
}
],
"meta": {
"included": false
}
},
"user": {
"data": {
"type": "team",
"id": "1"
},
"meta": {
"included": false
}
},
"submissions": {
"data": [
{
"type": "form_submission",
"id": "88213"
}
],
"links": {
"related": "https://api.tintup.com/v2/teams/1/experiences/42/form_submissions",
"first": "https://api.tintup.com/v2/teams/1/experiences/42/form_submissions",
"next": "https://api.tintup.com/v2/teams/1/experiences/42/form_submissions?page%5Bnumber%5D=2"
},
"meta": {
"total": 1289,
"count": 1289
}
}
},
"links": {
"public": "https://contests.example.com/summer-sweepstakes"
}
}
}{
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"code": "404",
"title": "Not found",
"status": "404"
}
]
}{
"errors": [
{
"title": "Invalid name",
"detail": "Name can't be blank",
"source": {
"pointer": "/data/attributes/name"
}
}
]
}Form Submissions
form_submissionsRetrieve a list of form submissions
Requires access to the experience.
Parameters
team_idintegerrequiredpathThe ID of the team.
experience_idintegerrequiredpathThe ID of the experience.
filterobjectqueryFilters the list of form submissions.
sortstring-idqueryA comma-separated list of attributes to sort by. Prefix an attribute with - to sort in descending order.
includeArray<string>experiencefilespostqueryA comma-separated list of related resources to include in the response.
pageobjectqueryOffset pagination. Use page[size] to set the number of items per page and page[number] to select a page. The response's links object contains ready-to-use URLs for the next and previous pages.
Response
A list of form submissions.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Not Found.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: form_submissions:read
curl -X GET 'https://api.tintup.com/v2/teams/{team_id}/experiences/{experience_id}/form_submissions'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/experiences/{experience_id}/form_submissions', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.tintup.com/v2/teams/{team_id}/experiences/{experience_id}/form_submissions')
data = response.json(){
"data": [
{
"id": "88213",
"type": "form_submission",
"attributes": {
"data": {
"first_name": "Jane",
"last_name": "Doe",
"email": "jane.doe@example.com"
},
"user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 14_4) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.4 Safari/605.1.15",
"referer": "https://contests.example.com/summer-sweepstakes",
"locale": "en",
"metadata": {
"utm_source": "newsletter"
},
"remote_ip_city": "Vancouver",
"remote_ip_most_specific_subdivision": "BC",
"remote_ip_country": "CA",
"city": "Vancouver, BC, CA",
"created_at": "2025-03-14T16:42:07.000Z"
},
"relationships": {
"person": {
"data": {
"type": "person",
"id": "65f3a1c2e4b0a91d2c7e8f10"
}
},
"experience": {
"data": {
"type": "experience",
"id": "42"
},
"meta": {
"included": false
}
},
"post": {
"data": {
"type": "post",
"id": "7731902"
},
"meta": {
"included": false
}
},
"terms": {
"meta": {
"included": false
}
},
"files": {
"data": [
{
"type": "upload",
"id": "eyJfcmFpbHMiOnsiZGF0YSI6NDU2NzgsInB1ciI6ImJsb2JfaWQifX0=--1a2b3c4d5e6f70819a2b3c4d5e6f708192a3b4c5"
}
],
"meta": {
"included": false
}
}
}
}
],
"links": {
"self": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=2",
"first": "https://api.tintup.com/v2/teams/1/tints",
"next": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=3",
"prev": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=1"
},
"meta": {
"impressions": 15230,
"total": 1289
}
}{
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"code": "404",
"title": "Not found",
"status": "404"
}
]
}Create a form submission
Submits the experience's form. This endpoint is public; the experience must be active, the request's Referer must be allowed for the experience, and the captcha token must be valid when the experience uses a captcha. For teams connected to a loyalty program, an optional Authorization: Bearer header may carry the loyalty member's JWT; the submission is then linked to that member, and an invalid token is rejected with a 403.
Body
The form's fields as key/value pairs.
application/x-www-form-urlencodedFormSubmissionFieldsThe experience's form fields as key/value pairs; they are stored as is in the submission's data. For poll experiences, send post_id (the ID of the post voted for) and vote (the number of votes, usually 1). When the experience uses a captcha, also send the g-recaptcha-response (Google reCAPTCHA) or h-captcha-response (hCaptcha) token.
multipart/form-dataFormSubmissionFieldsThe experience's form fields as key/value pairs; they are stored as is in the submission's data. For poll experiences, send post_id (the ID of the post voted for) and vote (the number of votes, usually 1). When the experience uses a captcha, also send the g-recaptcha-response (Google reCAPTCHA) or h-captcha-response (hCaptcha) token.
Parameters
team_idintegerrequiredpathThe ID of the team.
experience_idintegerrequiredpathThe ID of the experience.
localestringqueryThe locale the form was displayed in, stored in the submission's locale attribute.
X-TINT-MetadatastringheaderExtra data to store in the submission's metadata attribute, as a URL-encoded query string.
X-TINT-Anonymous-UIDstringheaderAn identifier of the anonymous visitor, stored with the submission.
X-TINT-Device-FingerprintstringheaderA fingerprint of the visitor's device, stored with the submission.
Response
The form submission was created.
Payment Required. The team reached its plan's form submission limit.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Not Found.
Unprocessable Entity. The request is missing required parameters or the resource is invalid.
curl -X POST 'https://api.tintup.com/v2/teams/{team_id}/experiences/{experience_id}/form_submissions' \
-H 'Content-Type: application/x-www-form-urlencoded' \
-d '{
"first_name": "Jane",
"last_name": "Doe",
"email": "jane.doe@example.com"
}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/experiences/{experience_id}/form_submissions', {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
},
body: JSON.stringify({
"first_name": "Jane",
"last_name": "Doe",
"email": "jane.doe@example.com"
}),
});
const data = await response.json();import requests
payload = {
"first_name": "Jane",
"last_name": "Doe",
"email": "jane.doe@example.com"
}
response = requests.post('https://api.tintup.com/v2/teams/{team_id}/experiences/{experience_id}/form_submissions', json=payload)
data = response.json(){
"first_name": "Jane",
"last_name": "Doe",
"email": "jane.doe@example.com"
}{
"first_name": "Jane",
"last_name": "Doe",
"email": "jane.doe@example.com"
}{
"data": {
"id": "88213",
"type": "form_submission",
"attributes": {
"data": {
"first_name": "Jane",
"last_name": "Doe",
"email": "jane.doe@example.com"
},
"user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 14_4) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.4 Safari/605.1.15",
"referer": "https://contests.example.com/summer-sweepstakes",
"locale": "en",
"metadata": {
"utm_source": "newsletter"
},
"remote_ip_city": "Vancouver",
"remote_ip_most_specific_subdivision": "BC",
"remote_ip_country": "CA",
"city": "Vancouver, BC, CA",
"created_at": "2025-03-14T16:42:07.000Z"
},
"relationships": {
"person": {
"data": {
"type": "person",
"id": "65f3a1c2e4b0a91d2c7e8f10"
}
},
"experience": {
"data": {
"type": "experience",
"id": "42"
},
"meta": {
"included": false
}
},
"post": {
"data": {
"type": "post",
"id": "7731902"
},
"meta": {
"included": false
}
},
"terms": {
"meta": {
"included": false
}
},
"files": {
"data": [
{
"type": "upload",
"id": "eyJfcmFpbHMiOnsiZGF0YSI6NDU2NzgsInB1ciI6ImJsb2JfaWQifX0=--1a2b3c4d5e6f70819a2b3c4d5e6f708192a3b4c5"
}
],
"meta": {
"included": false
}
}
}
}
}{
"errors": [
{
"code": "4020002",
"title": "Payment Required",
"status": "402",
"detail": "Form submission limit reached"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"code": "404",
"title": "Not found",
"status": "404"
}
]
}{
"errors": [
{
"title": "Invalid name",
"detail": "Name can't be blank",
"source": {
"pointer": "/data/attributes/name"
}
}
]
}Delete all form submissions
Deletes all of the experience's form submissions. Requires access to the experience.
Parameters
team_idintegerrequiredpathThe ID of the team.
experience_idintegerrequiredpathThe ID of the experience.
Response
No Content. The request succeeded and there is no response body.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Not Found.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: form_submissions:write
curl -X DELETE 'https://api.tintup.com/v2/teams/{team_id}/experiences/{experience_id}/form_submissions'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/experiences/{experience_id}/form_submissions', {
method: 'DELETE',
});
const data = await response.json();import requests
response = requests.delete('https://api.tintup.com/v2/teams/{team_id}/experiences/{experience_id}/form_submissions')
data = response.json(){
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"code": "404",
"title": "Not found",
"status": "404"
}
]
}Delete a form submission
Deletes the form submission.
Parameters
team_idintegerrequiredpathThe ID of the team.
experience_idintegerrequiredpathThe ID of the experience.
form_submission_idintegerrequiredpathThe ID of the form submission.
Response
No Content. The request succeeded and there is no response body.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Not Found.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: form_submissions:write
curl -X DELETE 'https://api.tintup.com/v2/teams/{team_id}/experiences/{experience_id}/form_submissions/{form_submission_id}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/experiences/{experience_id}/form_submissions/{form_submission_id}', {
method: 'DELETE',
});
const data = await response.json();import requests
response = requests.delete('https://api.tintup.com/v2/teams/{team_id}/experiences/{experience_id}/form_submissions/{form_submission_id}')
data = response.json(){
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"code": "404",
"title": "Not found",
"status": "404"
}
]
}Retrieve form submission metrics
Returns form submission counts grouped by the group parameter. The request's Referer must be allowed for the experience. When called without an Authorization header, this endpoint is public.
Parameters
team_idintegerrequiredpathThe ID of the team.
experience_idintegerrequiredpathThe ID of the experience.
groupstringcreated_atcreated_at.minutecreated_at.hourcreated_at.daycreated_at.weekcreated_at.monthcreated_at.quartercreated_at.yearcreated_at.decadecreated_at.centurycreated_at.millenniumpost_idremote_ipdatadata.keyscreated_at.millenniumqueryHow to group the submissions. created_at.{unit} groups by the beginning of each interval (created_at alone is the same as created_at.millennium, which returns a single total). post_id sums the votes per post of a poll experience. remote_ip groups by the submitter's IP address. data (or data.keys) sums the integer values of each data key.
filterobjectqueryFilters the form submissions that are counted.
includeArray<string>postqueryA comma-separated list of related resources to include in the response. post only applies when grouping by post_id for a poll experience.
pageobjectqueryOffset pagination. Use page[size] to set the number of items per page and page[number] to select a page. The response's links object contains ready-to-use URLs for the next and previous pages.
Response
A list of form submission metrics, sorted by group value in descending order.
Bad Request. The group query parameter is invalid.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Not Found.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
curl -X GET 'https://api.tintup.com/v2/teams/{team_id}/experiences/{experience_id}/form_submissions/metrics'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/experiences/{experience_id}/form_submissions/metrics', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.tintup.com/v2/teams/{team_id}/experiences/{experience_id}/form_submissions/metrics')
data = response.json(){
"data": [
{
"id": "2025-03-01T00:00:00.000Z",
"type": "form_submission_metric",
"attributes": {
"count": 128,
"created_at": "2025-03-01T00:00:00.000Z",
"key": "vote",
"post_id": "7731902"
},
"relationships": {
"post": {
"data": {
"type": "post",
"id": "7731902"
},
"meta": {
"included": false
}
}
}
}
],
"links": {
"self": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=2",
"first": "https://api.tintup.com/v2/teams/1/tints",
"next": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=3",
"prev": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=1"
}
}{
"errors": [
{
"code": "400",
"title": "Bad request",
"status": "400"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"code": "404",
"title": "Not found",
"status": "404"
}
]
}Create a form submission export request
Form submissions are exported asynchronously. Once complete, a websocket message of type form_submissions_export_request containing the status and URL is delivered to the user's private channel (private-user- followed by the user's ID), and the exported webhook event is sent. You may also poll the export request until it completes.
Body
The experience and the submissions to export.
dataNewFormSubmissionExportRequestrequiredParameters
team_idintegerrequiredpathThe ID of the team.
experience_idintegerrequiredpathThe ID of the experience.
includeArray<string>experienceformuserqueryA comma-separated list of related resources to include in the response.
Response
The form submission export request.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Not Found.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: form_submissions:read
curl -X POST 'https://api.tintup.com/v2/teams/{team_id}/experiences/{experience_id}/form_submissions/export/requests' \
-H 'Content-Type: application/vnd.api+json' \
-d '{
"data": {
"type": "form_submission_export_request",
"attributes": {
"experience_id": 42,
"filters": {
"created_at": {
"$gte": "2025-03-01T00:00:00.000Z",
"$lte": "2025-03-31T23:59:59.000Z"
}
},
"include_files": true
}
}
}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/experiences/{experience_id}/form_submissions/export/requests', {
method: 'POST',
headers: {
'Content-Type': 'application/vnd.api+json',
},
body: JSON.stringify({
"data": {
"type": "form_submission_export_request",
"attributes": {
"experience_id": 42,
"filters": {
"created_at": {
"$gte": "2025-03-01T00:00:00.000Z",
"$lte": "2025-03-31T23:59:59.000Z"
}
},
"include_files": true
}
}
}),
});
const data = await response.json();import requests
payload = {
"data": {
"type": "form_submission_export_request",
"attributes": {
"experience_id": 42,
"filters": {
"created_at": {
"$gte": "2025-03-01T00:00:00.000Z",
"$lte": "2025-03-31T23:59:59.000Z"
}
},
"include_files": True
}
}
}
response = requests.post('https://api.tintup.com/v2/teams/{team_id}/experiences/{experience_id}/form_submissions/export/requests', json=payload)
data = response.json(){
"data": {
"type": "form_submission_export_request",
"attributes": {
"experience_id": 42,
"filters": {
"created_at": {
"$gte": "2025-03-01T00:00:00.000Z",
"$lte": "2025-03-31T23:59:59.000Z"
}
},
"include_files": true
}
}
}{
"data": {
"id": "OxZZQtuh5sXIKA",
"type": "form_submission_export_request",
"attributes": {
"status": "pending",
"url": null
},
"relationships": {
"experience": {
"data": {
"type": "experience",
"id": "42"
},
"meta": {
"included": false
}
},
"form": {
"data": {
"type": "experience",
"id": "42"
},
"meta": {
"included": false
}
},
"user": {
"data": {
"type": "user",
"id": "7"
},
"meta": {
"included": false
}
}
},
"links": {
"self": "https://api.tintup.com/v2/teams/1/experiences/42/form_submissions/export/requests/OxZZQtuh5sXIKA"
}
}
}{
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"code": "404",
"title": "Not found",
"status": "404"
}
]
}Retrieve a form submission export request
Use this endpoint to check the status of an asynchronous form submission export request. Requires access to the exported experience.
Parameters
team_idintegerrequiredpathThe ID of the team.
experience_idintegerrequiredpathThe ID of the experience.
form_submission_export_request_idstringrequiredpathThe ID of the export request.
includeArray<string>experienceformuserqueryA comma-separated list of related resources to include in the response.
Response
The form submission export request.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Not Found.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: form_submissions:read
curl -X GET 'https://api.tintup.com/v2/teams/{team_id}/experiences/{experience_id}/form_submissions/export/requests/{form_submission_export_request_id}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/experiences/{experience_id}/form_submissions/export/requests/{form_submission_export_request_id}', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.tintup.com/v2/teams/{team_id}/experiences/{experience_id}/form_submissions/export/requests/{form_submission_export_request_id}')
data = response.json(){
"data": {
"id": "OxZZQtuh5sXIKA",
"type": "form_submission_export_request",
"attributes": {
"status": "pending",
"url": null
},
"relationships": {
"experience": {
"data": {
"type": "experience",
"id": "42"
},
"meta": {
"included": false
}
},
"form": {
"data": {
"type": "experience",
"id": "42"
},
"meta": {
"included": false
}
},
"user": {
"data": {
"type": "user",
"id": "7"
},
"meta": {
"included": false
}
}
},
"links": {
"self": "https://api.tintup.com/v2/teams/1/experiences/42/form_submissions/export/requests/OxZZQtuh5sXIKA"
}
}
}{
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"code": "404",
"title": "Not found",
"status": "404"
}
]
}E-commerce
group_ecommerceProduct Accounts
product_accountsRetrieve a list of product accounts
Parameters
team_idintegerrequiredpathThe ID of the team.
filterobjectqueryFilters. List filters take comma-separated values and match any of them.
includeArray<string>catalogsproduct_feedsqueryA comma-separated list of related resources to include in the response.
pageobjectqueryOffset pagination. Use page[size] to set the number of items per page and page[number] to select a page. The response's links object contains ready-to-use URLs for the next and previous pages.
Response
A list of product accounts.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: product_accounts:read
curl -X GET 'https://api.tintup.com/v2/teams/{team_id}/product_accounts'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/product_accounts', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.tintup.com/v2/teams/{team_id}/product_accounts')
data = response.json(){
"data": [
{
"id": "1",
"type": "product_account",
"attributes": {
"type": "shopify",
"external_id": "acme.myshopify.com",
"name": "acme",
"username": null,
"image_url": null,
"site": "https://acme.myshopify.com/",
"status": "ok",
"expires_at": null,
"created_at": "2025-03-14T16:42:07.000Z",
"updated_at": "2025-03-14T16:42:07.000Z"
},
"relationships": {
"catalogs": {
"data": [
{
"type": "catalog",
"id": "1098765432101234"
}
],
"meta": {
"included": false
}
},
"product_feeds": {
"data": [
{
"type": "product_feed",
"id": "12"
}
],
"meta": {
"count": 1
}
}
}
}
],
"links": {
"self": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=2",
"first": "https://api.tintup.com/v2/teams/1/tints",
"next": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=3",
"prev": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=1"
}
}{
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}Create a product account
Connects a product integration using credentials, without going through the authorization flow. Which attributes are required depends on type. The account profile is fetched from the source before the response is returned.
Body
The product account to create.
dataNewProductAccountrequiredParameters
team_idintegerrequiredpathThe ID of the team.
Response
The product account.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Unprocessable Entity. The request is missing required parameters or the resource is invalid.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: product_accounts:write
curl -X POST 'https://api.tintup.com/v2/teams/{team_id}/product_accounts' \
-H 'Content-Type: application/vnd.api+json' \
-d '{
"data": {
"type": "product_account",
"attributes": {
"site": "https://shop.example.com",
"access_token": "ck_4f7e2a9c1b3d5e6f",
"secret": "cs_9a8b7c6d5e4f3a2b",
"external_id": "acme-product-exports",
"type": "woocommerce"
}
}
}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/product_accounts', {
method: 'POST',
headers: {
'Content-Type': 'application/vnd.api+json',
},
body: JSON.stringify({
"data": {
"type": "product_account",
"attributes": {
"site": "https://shop.example.com",
"access_token": "ck_4f7e2a9c1b3d5e6f",
"secret": "cs_9a8b7c6d5e4f3a2b",
"external_id": "acme-product-exports",
"type": "woocommerce"
}
}
}),
});
const data = await response.json();import requests
payload = {
"data": {
"type": "product_account",
"attributes": {
"site": "https://shop.example.com",
"access_token": "ck_4f7e2a9c1b3d5e6f",
"secret": "cs_9a8b7c6d5e4f3a2b",
"external_id": "acme-product-exports",
"type": "woocommerce"
}
}
}
response = requests.post('https://api.tintup.com/v2/teams/{team_id}/product_accounts', json=payload)
data = response.json(){
"data": {
"type": "product_account",
"attributes": {
"type": "woocommerce",
"site": "https://shop.example.com",
"access_token": "ck_4f7e2a9c1b3d5e6f",
"secret": "cs_9a8b7c6d5e4f3a2b"
}
}
}{
"data": {
"type": "product_account",
"attributes": {
"type": "s3",
"site": "us-east-1",
"external_id": "acme-product-exports"
}
}
}{
"data": {
"id": "1",
"type": "product_account",
"attributes": {
"type": "shopify",
"external_id": "acme.myshopify.com",
"name": "acme",
"username": null,
"image_url": null,
"site": "https://acme.myshopify.com/",
"status": "ok",
"expires_at": null,
"created_at": "2025-03-14T16:42:07.000Z",
"updated_at": "2025-03-14T16:42:07.000Z"
},
"relationships": {
"catalogs": {
"data": [
{
"type": "catalog",
"id": "1098765432101234"
}
],
"meta": {
"included": false
}
},
"product_feeds": {
"data": [
{
"type": "product_feed",
"id": "12"
}
],
"meta": {
"count": 1
}
}
}
}
}{
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"title": "Invalid name",
"detail": "Name can't be blank",
"source": {
"pointer": "/data/attributes/name"
}
}
]
}Retrieve a product account
Parameters
team_idintegerrequiredpathThe ID of the team.
product_account_idintegerrequiredpathThe ID of the product account.
includeArray<string>catalogsproduct_feedsqueryA comma-separated list of related resources to include in the response.
Response
The product account.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Not Found.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: product_accounts:read
curl -X GET 'https://api.tintup.com/v2/teams/{team_id}/product_accounts/{product_account_id}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/product_accounts/{product_account_id}', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.tintup.com/v2/teams/{team_id}/product_accounts/{product_account_id}')
data = response.json(){
"data": {
"id": "1",
"type": "product_account",
"attributes": {
"type": "shopify",
"external_id": "acme.myshopify.com",
"name": "acme",
"username": null,
"image_url": null,
"site": "https://acme.myshopify.com/",
"status": "ok",
"expires_at": null,
"created_at": "2025-03-14T16:42:07.000Z",
"updated_at": "2025-03-14T16:42:07.000Z"
},
"relationships": {
"catalogs": {
"data": [
{
"type": "catalog",
"id": "1098765432101234"
}
],
"meta": {
"included": false
}
},
"product_feeds": {
"data": [
{
"type": "product_feed",
"id": "12"
}
],
"meta": {
"count": 1
}
}
}
}
}{
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"code": "404",
"title": "Not found",
"status": "404"
}
]
}Delete a product account
Only product accounts without product feeds can be deleted; otherwise the request fails with 403 Forbidden. Delete the product feeds first.
Parameters
team_idintegerrequiredpathThe ID of the team.
product_account_idintegerrequiredpathThe ID of the product account.
Response
No Content. The request succeeded and there is no response body.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Not Found.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: product_accounts:write
curl -X DELETE 'https://api.tintup.com/v2/teams/{team_id}/product_accounts/{product_account_id}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/product_accounts/{product_account_id}', {
method: 'DELETE',
});
const data = await response.json();import requests
response = requests.delete('https://api.tintup.com/v2/teams/{team_id}/product_accounts/{product_account_id}')
data = response.json(){
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"code": "404",
"title": "Not found",
"status": "404"
}
]
}Update a product account
Updates the credentials of a product account. Changing credentials resets status to ok.
Body
The product account credentials to change.
dataProductAccountUpdaterequiredParameters
team_idintegerrequiredpathThe ID of the team.
product_account_idintegerrequiredpathThe ID of the product account.
Response
The product account.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Not Found.
Unprocessable Entity. The request is missing required parameters or the resource is invalid.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: product_accounts:write
curl -X PATCH 'https://api.tintup.com/v2/teams/{team_id}/product_accounts/{product_account_id}' \
-H 'Content-Type: application/vnd.api+json' \
-d '{
"data": {
"id": "7",
"type": "product_account",
"attributes": {
"access_token": "ck_1a2b3c4d5e6f7a8b",
"secret": "cs_8b7a6f5e4d3c2b1a"
}
}
}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/product_accounts/{product_account_id}', {
method: 'PATCH',
headers: {
'Content-Type': 'application/vnd.api+json',
},
body: JSON.stringify({
"data": {
"id": "7",
"type": "product_account",
"attributes": {
"access_token": "ck_1a2b3c4d5e6f7a8b",
"secret": "cs_8b7a6f5e4d3c2b1a"
}
}
}),
});
const data = await response.json();import requests
payload = {
"data": {
"id": "7",
"type": "product_account",
"attributes": {
"access_token": "ck_1a2b3c4d5e6f7a8b",
"secret": "cs_8b7a6f5e4d3c2b1a"
}
}
}
response = requests.patch('https://api.tintup.com/v2/teams/{team_id}/product_accounts/{product_account_id}', json=payload)
data = response.json(){
"data": {
"id": "7",
"type": "product_account",
"attributes": {
"access_token": "ck_1a2b3c4d5e6f7a8b",
"secret": "cs_8b7a6f5e4d3c2b1a"
}
}
}{
"data": {
"id": "1",
"type": "product_account",
"attributes": {
"type": "shopify",
"external_id": "acme.myshopify.com",
"name": "acme",
"username": null,
"image_url": null,
"site": "https://acme.myshopify.com/",
"status": "ok",
"expires_at": null,
"created_at": "2025-03-14T16:42:07.000Z",
"updated_at": "2025-03-14T16:42:07.000Z"
},
"relationships": {
"catalogs": {
"data": [
{
"type": "catalog",
"id": "1098765432101234"
}
],
"meta": {
"included": false
}
},
"product_feeds": {
"data": [
{
"type": "product_feed",
"id": "12"
}
],
"meta": {
"count": 1
}
}
}
}
}{
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"code": "404",
"title": "Not found",
"status": "404"
}
]
}{
"errors": [
{
"title": "Invalid name",
"detail": "Name can't be blank",
"source": {
"pointer": "/data/attributes/name"
}
}
]
}Reauthenticate a product account
Returns the URL of the third-party authorization page for the product account. Open this URL (usually in a popup window) so the user can grant access again. Once the user completes the authorization flow, the product account is updated and the result is delivered using the origin or redirect_uri options.
Parameters
team_idintegerrequiredpathThe ID of the team.
product_account_idintegerrequiredpathThe ID of the product account.
originstringqueryWhen specified, once the user completes the authorization flow, the response body is posted to the window that opened the authorization page using window.postMessage, with this value as the target origin.
redirect_uristring<uri>queryWhen specified, once the user completes the authorization flow, the user is redirected to this URI with a data query parameter containing the response encoded using Base64.
Response
The URL of the third-party authorization page.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Not Found.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: product_accounts:write
curl -X GET 'https://api.tintup.com/v2/teams/{team_id}/product_accounts/{product_account_id}/edit'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/product_accounts/{product_account_id}/edit', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.tintup.com/v2/teams/{team_id}/product_accounts/{product_account_id}/edit')
data = response.json(){
"data": {
"id": "5d41402abc4b2a76b9719d911017c592",
"type": "redirect",
"attributes": {
"url": "https://acme.myshopify.com/admin/oauth/authorize?client_id=3f2a1b&scope=read_products&state=eyJhbGciOiJIUzI1NiJ9"
}
}
}{
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"code": "404",
"title": "Not found",
"status": "404"
}
]
}Authenticate a product account
Returns the URL of the third-party authorization page for the requested product account type. Open this URL (usually in a popup window) so the user can grant access. Once the user completes the authorization flow, the product account is created and the result is delivered using the origin or redirect_uri options.
Parameters
team_idintegerrequiredpathThe ID of the team.
typestringfacebookshopifyrequiredqueryThe type of product account to authenticate. Only types that use an authorization flow are supported.
sitestringqueryThe Shopify store URL. Required when type is shopify; ignored otherwise.
originstringqueryWhen specified, once the user completes the authorization flow, the response body is posted to the window that opened the authorization page using window.postMessage, with this value as the target origin.
redirect_uristring<uri>queryWhen specified, once the user completes the authorization flow, the user is redirected to this URI with a data query parameter containing the response encoded using Base64.
Response
The URL of the third-party authorization page.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: product_accounts:write
curl -X GET 'https://api.tintup.com/v2/teams/{team_id}/product_accounts/new'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/product_accounts/new', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.tintup.com/v2/teams/{team_id}/product_accounts/new')
data = response.json(){
"data": {
"id": "5d41402abc4b2a76b9719d911017c592",
"type": "redirect",
"attributes": {
"url": "https://acme.myshopify.com/admin/oauth/authorize?client_id=3f2a1b&scope=read_products&state=eyJhbGciOiJIUzI1NiJ9"
}
}
}{
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}Product Feeds
product_feedsCreate a product feed refresh request
Asynchronously re-syncs a product feed or, for csv product feeds, imports a new CSV file. All product feeds, with
the exception of manual feeds, can be refreshed.
We regularly update feeds managed through our integration partners, but you may trigger a refresh using this endpoint at any time. This is particularly useful if you have made product changes that you would like reflected in TrueLoyal immediately.
For csv product feeds, you can use this endpoint to upload a new CSV file. The file must be in the prescribed
format.
When the request is invalid, the product feed's status is set to error and error_message describes the
problem.
Body
The product feed to refresh and, for csv feeds, the CSV file to import.
dataNewProductFeedRefreshRequestrequiredParameters
team_idintegerrequiredpathThe ID of the team.
product_feed_idintegerrequiredpathThe ID of the product feed.
Response
The product feed refresh request.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Not Found.
Unprocessable Entity. The request is missing required parameters or the resource is invalid.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: product_feeds:write
curl -X POST 'https://api.tintup.com/v2/teams/{team_id}/product_feeds/{product_feed_id}/product_feed_refresh_requests' \
-H 'Content-Type: application/vnd.api+json' \
-d '{
"data": {
"type": "product_feed_refresh_request",
"attributes": {
"product_feed_id": "12",
"url": "https://files.example.com/exports/products.csv"
}
}
}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/product_feeds/{product_feed_id}/product_feed_refresh_requests', {
method: 'POST',
headers: {
'Content-Type': 'application/vnd.api+json',
},
body: JSON.stringify({
"data": {
"type": "product_feed_refresh_request",
"attributes": {
"product_feed_id": "12",
"url": "https://files.example.com/exports/products.csv"
}
}
}),
});
const data = await response.json();import requests
payload = {
"data": {
"type": "product_feed_refresh_request",
"attributes": {
"product_feed_id": "12",
"url": "https://files.example.com/exports/products.csv"
}
}
}
response = requests.post('https://api.tintup.com/v2/teams/{team_id}/product_feeds/{product_feed_id}/product_feed_refresh_requests', json=payload)
data = response.json(){
"data": {
"type": "product_feed_refresh_request",
"attributes": {
"product_feed_id": "12",
"url": "https://files.example.com/exports/products.csv"
}
}
}{
"data": {
"type": "product_feed_refresh_request",
"attributes": {
"product_feed_id": "12"
}
}
}{
"data": {
"id": "eyJhbGciOiJIUzI1NiJ9.eyJpZCI6InByb2R1Y3RfaW1wb3J0X3JlcXVlc3R8NDIifQ.c2lnbmF0dXJl",
"type": "product_feed_refresh_request",
"attributes": {
"status": "pending"
},
"relationships": {
"product_feed": {
"data": {
"type": "product_feed",
"id": "12"
},
"meta": {
"included": false
}
}
}
}
}{
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"code": "404",
"title": "Not found",
"status": "404"
}
]
}{
"errors": [
{
"title": "Invalid name",
"detail": "Name can't be blank",
"source": {
"pointer": "/data/attributes/name"
}
}
]
}Retrieve a product feed refresh request
Returns the status of a product feed refresh request.
Parameters
team_idintegerrequiredpathThe ID of the team.
product_feed_idintegerrequiredpathThe ID of the product feed.
product_feed_refresh_request_idstringrequiredpathThe ID of the product feed refresh request, as returned when the refresh was requested (an opaque string).
Response
The product feed refresh request.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Not Found.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: product_feeds:write
curl -X GET 'https://api.tintup.com/v2/teams/{team_id}/product_feeds/{product_feed_id}/product_feed_refresh_requests/{product_feed_refresh_request_id}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/product_feeds/{product_feed_id}/product_feed_refresh_requests/{product_feed_refresh_request_id}', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.tintup.com/v2/teams/{team_id}/product_feeds/{product_feed_id}/product_feed_refresh_requests/{product_feed_refresh_request_id}')
data = response.json(){
"data": {
"id": "eyJhbGciOiJIUzI1NiJ9.eyJpZCI6InByb2R1Y3RfaW1wb3J0X3JlcXVlc3R8NDIifQ.c2lnbmF0dXJl",
"type": "product_feed_refresh_request",
"attributes": {
"status": "pending"
},
"relationships": {
"product_feed": {
"data": {
"type": "product_feed",
"id": "12"
},
"meta": {
"included": false
}
}
}
}
}{
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"code": "404",
"title": "Not found",
"status": "404"
}
]
}Retrieve a list of product feeds
Parameters
team_idintegerrequiredpathThe ID of the team.
filterobjectqueryFilters. List filters take comma-separated values and match any of them.
sortstring-idqueryA comma-separated list of attributes to sort by (for example, name, created_at or id). Prefix an attribute with - to sort in descending order.
includeArray<string>catalogproduct_accountproductsqueryA comma-separated list of related resources to include in the response.
pageobjectqueryOffset pagination. Use page[size] to set the number of items per page and page[number] to select a page. The response's links object contains ready-to-use URLs for the next and previous pages.
Response
A list of product feeds.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: product_feeds:read
curl -X GET 'https://api.tintup.com/v2/teams/{team_id}/product_feeds'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/product_feeds', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.tintup.com/v2/teams/{team_id}/product_feeds')
data = response.json(){
"data": [
{
"id": "1",
"type": "product_feed",
"attributes": {
"name": "Acme spring collection",
"source": "shopify",
"status": "active",
"options": {
"delete_files_once_processed": false
},
"last_ingested_at": "2025-03-14T16:42:07.000Z",
"error_message": null
},
"relationships": {
"product_account": {
"data": {
"type": "product_account",
"id": "7"
},
"meta": {
"included": false
}
},
"catalog": {
"data": {
"type": "catalog",
"id": "1098765432101234"
},
"meta": {
"included": false
}
},
"products": {
"data": [
{
"type": "product",
"id": "1234"
}
],
"meta": {
"count": 124
}
}
}
}
],
"links": {
"self": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=2",
"first": "https://api.tintup.com/v2/teams/1/tints",
"next": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=3",
"prev": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=1"
}
}{
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}Create a product feed
Creates a product feed and starts importing its products in the background (except for manual feeds, whose products are created using the API). Which attributes are required depends on source.
Body
The product feed to create.
dataNewProductFeedrequiredParameters
team_idintegerrequiredpathThe ID of the team.
Response
The product feed.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Unprocessable Entity. The request is missing required parameters or the resource is invalid.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: product_feeds:write
curl -X POST 'https://api.tintup.com/v2/teams/{team_id}/product_feeds' \
-H 'Content-Type: application/vnd.api+json' \
-d '{
"data": {
"type": "product_feed",
"attributes": {
"source": "shopify",
"name": "Acme spring collection",
"product_account_id": 7,
"catalog_id": "/exports/products.csv",
"url": "https://files.example.com/exports/products.csv",
"options": {
"delete_files_once_processed": false
}
}
}
}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/product_feeds', {
method: 'POST',
headers: {
'Content-Type': 'application/vnd.api+json',
},
body: JSON.stringify({
"data": {
"type": "product_feed",
"attributes": {
"source": "shopify",
"name": "Acme spring collection",
"product_account_id": 7,
"catalog_id": "/exports/products.csv",
"url": "https://files.example.com/exports/products.csv",
"options": {
"delete_files_once_processed": false
}
}
}
}),
});
const data = await response.json();import requests
payload = {
"data": {
"type": "product_feed",
"attributes": {
"source": "shopify",
"name": "Acme spring collection",
"product_account_id": 7,
"catalog_id": "/exports/products.csv",
"url": "https://files.example.com/exports/products.csv",
"options": {
"delete_files_once_processed": False
}
}
}
}
response = requests.post('https://api.tintup.com/v2/teams/{team_id}/product_feeds', json=payload)
data = response.json(){
"data": {
"type": "product_feed",
"attributes": {
"source": "shopify",
"product_account_id": 7
}
}
}{
"data": {
"type": "product_feed",
"attributes": {
"source": "csv",
"name": "Acme spring collection",
"url": "https://files.example.com/exports/products.csv"
}
}
}{
"data": {
"type": "product_feed",
"attributes": {
"source": "manual",
"name": "Acme spring collection"
}
}
}{
"data": {
"id": "1",
"type": "product_feed",
"attributes": {
"name": "Acme spring collection",
"source": "shopify",
"status": "active",
"options": {
"delete_files_once_processed": false
},
"last_ingested_at": "2025-03-14T16:42:07.000Z",
"error_message": null
},
"relationships": {
"product_account": {
"data": {
"type": "product_account",
"id": "7"
},
"meta": {
"included": false
}
},
"catalog": {
"data": {
"type": "catalog",
"id": "1098765432101234"
},
"meta": {
"included": false
}
},
"products": {
"data": [
{
"type": "product",
"id": "1234"
}
],
"meta": {
"count": 124
}
}
}
}
}{
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"title": "Invalid name",
"detail": "Name can't be blank",
"source": {
"pointer": "/data/attributes/name"
}
}
]
}Retrieve a product feed
Parameters
team_idintegerrequiredpathThe ID of the team.
product_feed_idintegerrequiredpathThe ID of the product feed.
includeArray<string>catalogproduct_accountproductsqueryA comma-separated list of related resources to include in the response.
Response
The product feed.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Not Found.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: product_feeds:read
curl -X GET 'https://api.tintup.com/v2/teams/{team_id}/product_feeds/{product_feed_id}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/product_feeds/{product_feed_id}', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.tintup.com/v2/teams/{team_id}/product_feeds/{product_feed_id}')
data = response.json(){
"data": {
"id": "1",
"type": "product_feed",
"attributes": {
"name": "Acme spring collection",
"source": "shopify",
"status": "active",
"options": {
"delete_files_once_processed": false
},
"last_ingested_at": "2025-03-14T16:42:07.000Z",
"error_message": null
},
"relationships": {
"product_account": {
"data": {
"type": "product_account",
"id": "7"
},
"meta": {
"included": false
}
},
"catalog": {
"data": {
"type": "catalog",
"id": "1098765432101234"
},
"meta": {
"included": false
}
},
"products": {
"data": [
{
"type": "product",
"id": "1234"
}
],
"meta": {
"count": 124
}
}
}
}
}{
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"code": "404",
"title": "Not found",
"status": "404"
}
]
}Delete a product feed
Deletes the product feed and all of its products.
Parameters
team_idintegerrequiredpathThe ID of the team.
product_feed_idintegerrequiredpathThe ID of the product feed.
Response
No Content. The request succeeded and there is no response body.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Not Found.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: product_feeds:write
curl -X DELETE 'https://api.tintup.com/v2/teams/{team_id}/product_feeds/{product_feed_id}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/product_feeds/{product_feed_id}', {
method: 'DELETE',
});
const data = await response.json();import requests
response = requests.delete('https://api.tintup.com/v2/teams/{team_id}/product_feeds/{product_feed_id}')
data = response.json(){
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"code": "404",
"title": "Not found",
"status": "404"
}
]
}Products
productsRetrieve a list of products
Returns the products of the product feeds you have access to. Only active products are returned unless you filter on status. Also available as a CSV file (see the text/csv response).
Parameters
team_idintegerrequiredpathThe ID of the team.
filterobjectqueryFilters. List filters take comma-separated values and match any of them. Only products of the product feeds you have access to are returned.
sortstring-idqueryA comma-separated list of attributes to sort by (for example, name, price, created_at or id). Prefix an attribute with - to sort in descending order.
includeArray<string>product_feedqueryA comma-separated list of related resources to include in the response.
pageobjectqueryOffset pagination. Use page[size] to set the number of items per page and page[number] to select a page. The response's links object contains ready-to-use URLs for the next and previous pages.
Response
A list of products.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Service Unavailable. Product search is temporarily unavailable; retry later.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: products:read
curl -X GET 'https://api.tintup.com/v2/teams/{team_id}/products'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/products', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.tintup.com/v2/teams/{team_id}/products')
data = response.json(){
"data": [
{
"id": "1234",
"type": "product",
"attributes": {
"name": "Acme Runner 2 sneakers",
"description": "Lightweight running sneakers with a breathable mesh upper.",
"sku": "ACME-RUN2-BLK-42",
"brand": "Acme",
"family": "Acme Runner 2",
"categories": [
"Footwear",
"Running"
],
"image_url": "https://cdn.example.com/products/acme-runner-2-black.jpg",
"url": "https://shop.example.com/products/acme-runner-2",
"currency": "USD",
"price": "89.00",
"sale_price": "69.00",
"sale_price_starts_at": "2025-03-14T00:00:00.000Z",
"sale_price_ends_at": "2025-03-31T23:59:59.000Z",
"availability": "in_stock"
},
"relationships": {
"product_feed": {
"data": {
"type": "product_feed",
"id": "12"
},
"meta": {
"included": false
}
}
}
}
],
"links": {
"self": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=2",
"first": "https://api.tintup.com/v2/teams/1/tints",
"next": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=3",
"prev": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=1"
},
"meta": {
"aggregations": {
"brand": {
"Acme": 124,
"Globex": 37
},
"categories": {
"Footwear": 98,
"Running": 42
},
"family": {
"Acme Runner 2": 6,
"Acme Trail": 4
}
}
}
}sku,name,description,image_url,url,currency,categories,availability,price,sale_price,status,sale_price_starts_at,sale_price_ends_at,brand,family
ACME-RUN2-BLK-42,Acme Runner 2 sneakers,Lightweight running sneakers.,https://cdn.example.com/products/acme-runner-2-black.jpg,https://shop.example.com/products/acme-runner-2,USD,"Footwear,Running",in_stock,89.00,69.00,active,2025-03-14 00:00:00 UTC,2025-03-31 23:59:59 UTC,Acme,Acme Runner 2{
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}Create a product
Creates a product in a manual product feed. Products of other product feeds are managed by their source and can't be created using the API.
Body
The product to create.
dataNewProductrequiredParameters
team_idintegerrequiredpathThe ID of the team.
Response
The product.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Not Found.
Unprocessable Entity. The request is missing required parameters or the resource is invalid.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: products:write
curl -X POST 'https://api.tintup.com/v2/teams/{team_id}/products' \
-H 'Content-Type: application/vnd.api+json' \
-d '{
"data": {
"type": "product",
"attributes": {
"product_feed_id": 12,
"name": "Acme Runner 2 sneakers",
"sku": "ACME-RUN2-BLK-42",
"description": "Lightweight running sneakers with a breathable mesh upper.",
"brand": "Acme",
"family": "Acme Runner 2",
"categories": [
"Footwear",
"Running"
],
"image_url": "https://cdn.example.com/products/acme-runner-2-black.jpg",
"url": "https://shop.example.com/products/acme-runner-2",
"currency": "USD",
"price": "89.00",
"availability": "in_stock"
}
}
}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/products', {
method: 'POST',
headers: {
'Content-Type': 'application/vnd.api+json',
},
body: JSON.stringify({
"data": {
"type": "product",
"attributes": {
"product_feed_id": 12,
"name": "Acme Runner 2 sneakers",
"sku": "ACME-RUN2-BLK-42",
"description": "Lightweight running sneakers with a breathable mesh upper.",
"brand": "Acme",
"family": "Acme Runner 2",
"categories": [
"Footwear",
"Running"
],
"image_url": "https://cdn.example.com/products/acme-runner-2-black.jpg",
"url": "https://shop.example.com/products/acme-runner-2",
"currency": "USD",
"price": "89.00",
"availability": "in_stock"
}
}
}),
});
const data = await response.json();import requests
payload = {
"data": {
"type": "product",
"attributes": {
"product_feed_id": 12,
"name": "Acme Runner 2 sneakers",
"sku": "ACME-RUN2-BLK-42",
"description": "Lightweight running sneakers with a breathable mesh upper.",
"brand": "Acme",
"family": "Acme Runner 2",
"categories": [
"Footwear",
"Running"
],
"image_url": "https://cdn.example.com/products/acme-runner-2-black.jpg",
"url": "https://shop.example.com/products/acme-runner-2",
"currency": "USD",
"price": "89.00",
"availability": "in_stock"
}
}
}
response = requests.post('https://api.tintup.com/v2/teams/{team_id}/products', json=payload)
data = response.json(){
"data": {
"type": "product",
"attributes": {
"product_feed_id": 12,
"name": "Acme Runner 2 sneakers",
"sku": "ACME-RUN2-BLK-42",
"description": "Lightweight running sneakers with a breathable mesh upper.",
"brand": "Acme",
"family": "Acme Runner 2",
"categories": [
"Footwear",
"Running"
],
"image_url": "https://cdn.example.com/products/acme-runner-2-black.jpg",
"url": "https://shop.example.com/products/acme-runner-2",
"currency": "USD",
"price": "89.00",
"availability": "in_stock"
}
}
}{
"data": {
"id": "1234",
"type": "product",
"attributes": {
"name": "Acme Runner 2 sneakers",
"description": "Lightweight running sneakers with a breathable mesh upper.",
"sku": "ACME-RUN2-BLK-42",
"brand": "Acme",
"family": "Acme Runner 2",
"categories": [
"Footwear",
"Running"
],
"image_url": "https://cdn.example.com/products/acme-runner-2-black.jpg",
"url": "https://shop.example.com/products/acme-runner-2",
"currency": "USD",
"price": "89.00",
"sale_price": "69.00",
"sale_price_starts_at": "2025-03-14T00:00:00.000Z",
"sale_price_ends_at": "2025-03-31T23:59:59.000Z",
"availability": "in_stock"
},
"relationships": {
"product_feed": {
"data": {
"type": "product_feed",
"id": "12"
},
"meta": {
"included": false
}
}
}
}
}{
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"code": "404",
"title": "Not found",
"status": "404"
}
]
}{
"errors": [
{
"title": "Invalid name",
"detail": "Name can't be blank",
"source": {
"pointer": "/data/attributes/name"
}
}
]
}Retrieve a product
Parameters
team_idintegerrequiredpathThe ID of the team.
product_idintegerrequiredpathThe ID of the product.
includeArray<string>product_feedqueryA comma-separated list of related resources to include in the response.
Response
The product.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Not Found.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: products:read
curl -X GET 'https://api.tintup.com/v2/teams/{team_id}/products/{product_id}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/products/{product_id}', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.tintup.com/v2/teams/{team_id}/products/{product_id}')
data = response.json(){
"data": {
"id": "1234",
"type": "product",
"attributes": {
"name": "Acme Runner 2 sneakers",
"description": "Lightweight running sneakers with a breathable mesh upper.",
"sku": "ACME-RUN2-BLK-42",
"brand": "Acme",
"family": "Acme Runner 2",
"categories": [
"Footwear",
"Running"
],
"image_url": "https://cdn.example.com/products/acme-runner-2-black.jpg",
"url": "https://shop.example.com/products/acme-runner-2",
"currency": "USD",
"price": "89.00",
"sale_price": "69.00",
"sale_price_starts_at": "2025-03-14T00:00:00.000Z",
"sale_price_ends_at": "2025-03-31T23:59:59.000Z",
"availability": "in_stock"
},
"relationships": {
"product_feed": {
"data": {
"type": "product_feed",
"id": "12"
},
"meta": {
"included": false
}
}
}
}
}{
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"code": "404",
"title": "Not found",
"status": "404"
}
]
}Delete a product
Only products of manual product feeds can be deleted; other products return 404 Not Found.
Parameters
team_idintegerrequiredpathThe ID of the team.
product_idintegerrequiredpathThe ID of the product.
Response
No Content. The request succeeded and there is no response body.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Not Found.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: products:write
curl -X DELETE 'https://api.tintup.com/v2/teams/{team_id}/products/{product_id}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/products/{product_id}', {
method: 'DELETE',
});
const data = await response.json();import requests
response = requests.delete('https://api.tintup.com/v2/teams/{team_id}/products/{product_id}')
data = response.json(){
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"code": "404",
"title": "Not found",
"status": "404"
}
]
}Update a product
Products of manual product feeds can be fully updated. Products of other product feeds are kept in sync with their source, so only their status can be changed (for example, to archive a product).
Body
The product attributes to change.
dataProductUpdaterequiredParameters
team_idintegerrequiredpathThe ID of the team.
product_idintegerrequiredpathThe ID of the product.
Response
The product.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Not Found.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: products:write
curl -X PATCH 'https://api.tintup.com/v2/teams/{team_id}/products/{product_id}' \
-H 'Content-Type: application/vnd.api+json' \
-d '{
"data": {
"id": "1234",
"type": "product",
"attributes": {
"sale_price": "69.00",
"sale_price_starts_at": "2025-03-14T00:00:00.000Z",
"sale_price_ends_at": "2025-03-31T23:59:59.000Z"
}
}
}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/products/{product_id}', {
method: 'PATCH',
headers: {
'Content-Type': 'application/vnd.api+json',
},
body: JSON.stringify({
"data": {
"id": "1234",
"type": "product",
"attributes": {
"sale_price": "69.00",
"sale_price_starts_at": "2025-03-14T00:00:00.000Z",
"sale_price_ends_at": "2025-03-31T23:59:59.000Z"
}
}
}),
});
const data = await response.json();import requests
payload = {
"data": {
"id": "1234",
"type": "product",
"attributes": {
"sale_price": "69.00",
"sale_price_starts_at": "2025-03-14T00:00:00.000Z",
"sale_price_ends_at": "2025-03-31T23:59:59.000Z"
}
}
}
response = requests.patch('https://api.tintup.com/v2/teams/{team_id}/products/{product_id}', json=payload)
data = response.json(){
"data": {
"id": "1234",
"type": "product",
"attributes": {
"sale_price": "69.00",
"sale_price_starts_at": "2025-03-14T00:00:00.000Z",
"sale_price_ends_at": "2025-03-31T23:59:59.000Z"
}
}
}{
"data": {
"id": "1234",
"type": "product",
"attributes": {
"name": "Acme Runner 2 sneakers",
"description": "Lightweight running sneakers with a breathable mesh upper.",
"sku": "ACME-RUN2-BLK-42",
"brand": "Acme",
"family": "Acme Runner 2",
"categories": [
"Footwear",
"Running"
],
"image_url": "https://cdn.example.com/products/acme-runner-2-black.jpg",
"url": "https://shop.example.com/products/acme-runner-2",
"currency": "USD",
"price": "89.00",
"sale_price": "69.00",
"sale_price_starts_at": "2025-03-14T00:00:00.000Z",
"sale_price_ends_at": "2025-03-31T23:59:59.000Z",
"availability": "in_stock"
},
"relationships": {
"product_feed": {
"data": {
"type": "product_feed",
"id": "12"
},
"meta": {
"included": false
}
}
}
}
}{
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"code": "404",
"title": "Not found",
"status": "404"
}
]
}Rights Management
group_rights_managementRight Request Templates
right_request_templatesRetrieve a list of right request templates
Returns the team's right request templates. When the team doesn't have any yet, a default set of templates is created for it first.
Parameters
team_idintegerrequiredpathThe ID of the team.
includeArray<string>tintqueryA comma-separated list of related resources to include in the response. tint is only available when the access token has the tints:read scope.
pageobjectqueryOffset pagination. Use page[size] to set the number of items per page and page[number] to select a page. The response's links object contains ready-to-use URLs for the next and previous pages.
sortArray<string>id-idcreated_at-created_atupdated_at-updated_at-idqueryA comma-separated list of fields to sort by. Prefix a field with - to sort in descending order. Defaults to -id (newest first).
filterobjectqueryFilters the right request templates.
Response
A list of right request templates.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: right_request_templates:read
curl -X GET 'https://api.tintup.com/v2/teams/{team_id}/right_requests/templates'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/right_requests/templates', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.tintup.com/v2/teams/{team_id}/right_requests/templates')
data = response.json(){
"data": [
{
"id": "34",
"type": "right_request_template",
"attributes": {
"name": "Instagram repost",
"hashtag": "AcmeYes",
"template": "Such a great shot! We would love to share this picture on our Instagram page. {{username}} if you agree, please reply {{approval_keyword}} and review our terms at {{terms.url}}",
"created_at": "2025-02-20T14:05:12.000Z",
"updated_at": "2025-03-10T08:30:45.000Z"
},
"relationships": {
"tint": {
"data": null
}
}
}
],
"included": [
{}
],
"links": {
"self": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=2",
"first": "https://api.tintup.com/v2/teams/1/tints",
"next": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=3",
"prev": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=1"
}
}{
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}Create a right request template
Creates a right request template.
Body
The right request template to create.
dataNewRightRequestTemplaterequiredParameters
team_idintegerrequiredpathThe ID of the team.
includeArray<string>tintqueryA comma-separated list of related resources to include in the response. tint is only available when the access token has the tints:read scope.
Response
The right request template.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Unprocessable Entity. The request is missing required parameters or the resource is invalid.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: right_request_templates:write
curl -X POST 'https://api.tintup.com/v2/teams/{team_id}/right_requests/templates' \
-H 'Content-Type: application/vnd.api+json' \
-d '{
"data": {
"type": "right_request_template",
"attributes": {
"name": "Instagram repost",
"hashtag": "AcmeYes",
"template": "Such a great shot! We would love to share this picture on our Instagram page. {{username}} if you agree, please reply {{approval_keyword}} and review our terms at {{terms.url}}"
}
}
}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/right_requests/templates', {
method: 'POST',
headers: {
'Content-Type': 'application/vnd.api+json',
},
body: JSON.stringify({
"data": {
"type": "right_request_template",
"attributes": {
"name": "Instagram repost",
"hashtag": "AcmeYes",
"template": "Such a great shot! We would love to share this picture on our Instagram page. {{username}} if you agree, please reply {{approval_keyword}} and review our terms at {{terms.url}}"
}
}
}),
});
const data = await response.json();import requests
payload = {
"data": {
"type": "right_request_template",
"attributes": {
"name": "Instagram repost",
"hashtag": "AcmeYes",
"template": "Such a great shot! We would love to share this picture on our Instagram page. {{username}} if you agree, please reply {{approval_keyword}} and review our terms at {{terms.url}}"
}
}
}
response = requests.post('https://api.tintup.com/v2/teams/{team_id}/right_requests/templates', json=payload)
data = response.json(){
"data": {
"type": "right_request_template",
"attributes": {
"name": "Instagram repost",
"hashtag": "AcmeYes",
"template": "Such a great shot! We would love to share this picture on our Instagram page. {{username}} if you agree, please reply {{approval_keyword}} and review our terms at {{terms.url}}"
}
}
}{
"data": {
"id": "34",
"type": "right_request_template",
"attributes": {
"name": "Instagram repost",
"hashtag": "AcmeYes",
"template": "Such a great shot! We would love to share this picture on our Instagram page. {{username}} if you agree, please reply {{approval_keyword}} and review our terms at {{terms.url}}",
"created_at": "2025-02-20T14:05:12.000Z",
"updated_at": "2025-03-10T08:30:45.000Z"
},
"relationships": {
"tint": {
"data": null
}
}
},
"included": [
{}
]
}{
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"title": "Invalid name",
"detail": "Name can't be blank",
"source": {
"pointer": "/data/attributes/name"
}
}
]
}Retrieve a list of right request templates for a board
Returns the team's right request templates. The list isn't currently narrowed down to templates limited to the board. When the team doesn't have any templates yet, a default set is created for it first.
Parameters
team_idintegerrequiredpathThe ID of the team.
tint_idintegerrequiredpathThe ID of the board.
includeArray<string>tintqueryA comma-separated list of related resources to include in the response. tint is only available when the access token has the tints:read scope.
pageobjectqueryOffset pagination. Use page[size] to set the number of items per page and page[number] to select a page. The response's links object contains ready-to-use URLs for the next and previous pages.
sortArray<string>id-idcreated_at-created_atupdated_at-updated_at-idqueryA comma-separated list of fields to sort by. Prefix a field with - to sort in descending order. Defaults to -id (newest first).
filterobjectqueryFilters the right request templates.
Response
A list of right request templates.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: right_request_templates:read
curl -X GET 'https://api.tintup.com/v2/teams/{team_id}/tints/{tint_id}/right_requests/templates'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/tints/{tint_id}/right_requests/templates', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.tintup.com/v2/teams/{team_id}/tints/{tint_id}/right_requests/templates')
data = response.json(){
"data": [
{
"id": "34",
"type": "right_request_template",
"attributes": {
"name": "Instagram repost",
"hashtag": "AcmeYes",
"template": "Such a great shot! We would love to share this picture on our Instagram page. {{username}} if you agree, please reply {{approval_keyword}} and review our terms at {{terms.url}}",
"created_at": "2025-02-20T14:05:12.000Z",
"updated_at": "2025-03-10T08:30:45.000Z"
},
"relationships": {
"tint": {
"data": null
}
}
}
],
"included": [
{}
],
"links": {
"self": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=2",
"first": "https://api.tintup.com/v2/teams/1/tints",
"next": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=3",
"prev": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=1"
}
}{
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}Delete a right request template
Permanently deletes the template.
Parameters
team_idintegerrequiredpathThe ID of the team.
right_request_template_idintegerrequiredpathThe ID of the right request template.
Response
No Content. The request succeeded and there is no response body.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Not Found.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: right_request_templates:write
curl -X DELETE 'https://api.tintup.com/v2/teams/{team_id}/right_requests/templates/{right_request_template_id}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/right_requests/templates/{right_request_template_id}', {
method: 'DELETE',
});
const data = await response.json();import requests
response = requests.delete('https://api.tintup.com/v2/teams/{team_id}/right_requests/templates/{right_request_template_id}')
data = response.json(){
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"code": "404",
"title": "Not found",
"status": "404"
}
]
}Update a right request template
Updates a right request template.
Body
The right request template changes.
dataRightRequestTemplateUpdaterequiredParameters
team_idintegerrequiredpathThe ID of the team.
right_request_template_idintegerrequiredpathThe ID of the right request template.
includeArray<string>tintqueryA comma-separated list of related resources to include in the response. tint is only available when the access token has the tints:read scope.
Response
The right request template.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Not Found.
Unprocessable Entity. The request is missing required parameters or the resource is invalid.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: right_request_templates:write
curl -X PATCH 'https://api.tintup.com/v2/teams/{team_id}/right_requests/templates/{right_request_template_id}' \
-H 'Content-Type: application/vnd.api+json' \
-d '{
"data": {
"id": "34",
"type": "right_request_template",
"attributes": {
"hashtag": "AcmeSaysYes"
}
}
}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/right_requests/templates/{right_request_template_id}', {
method: 'PATCH',
headers: {
'Content-Type': 'application/vnd.api+json',
},
body: JSON.stringify({
"data": {
"id": "34",
"type": "right_request_template",
"attributes": {
"hashtag": "AcmeSaysYes"
}
}
}),
});
const data = await response.json();import requests
payload = {
"data": {
"id": "34",
"type": "right_request_template",
"attributes": {
"hashtag": "AcmeSaysYes"
}
}
}
response = requests.patch('https://api.tintup.com/v2/teams/{team_id}/right_requests/templates/{right_request_template_id}', json=payload)
data = response.json(){
"data": {
"id": "34",
"type": "right_request_template",
"attributes": {
"hashtag": "AcmeSaysYes"
}
}
}{
"data": {
"id": "34",
"type": "right_request_template",
"attributes": {
"name": "Instagram repost",
"hashtag": "AcmeYes",
"template": "Such a great shot! We would love to share this picture on our Instagram page. {{username}} if you agree, please reply {{approval_keyword}} and review our terms at {{terms.url}}",
"created_at": "2025-02-20T14:05:12.000Z",
"updated_at": "2025-03-10T08:30:45.000Z"
},
"relationships": {
"tint": {
"data": null
}
}
},
"included": [
{}
]
}{
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"code": "404",
"title": "Not found",
"status": "404"
}
]
}{
"errors": [
{
"title": "Invalid name",
"detail": "Name can't be blank",
"source": {
"pointer": "/data/attributes/name"
}
}
]
}Right Request Terms
right_request_termsRetrieve a list of right request terms
Returns the team's published right request terms. Archived (deleted) terms are not included.
Parameters
team_idintegerrequiredpathThe ID of the team.
includeArray<string>tintqueryA comma-separated list of related resources to include in the response. tint is only available when the access token has the tints:read scope.
pageobjectqueryOffset pagination. Use page[size] to set the number of items per page and page[number] to select a page. The response's links object contains ready-to-use URLs for the next and previous pages.
sortArray<string>id-idname-namecreated_at-created_at-idqueryA comma-separated list of fields to sort by. Prefix a field with - to sort in descending order. Defaults to -id (newest first).
filterobjectqueryFilters the right request terms.
Response
A list of published right request terms.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: right_request_terms:read
curl -X GET 'https://api.tintup.com/v2/teams/{team_id}/right_requests/terms'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/right_requests/terms', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.tintup.com/v2/teams/{team_id}/right_requests/terms')
data = response.json(){
"data": [
{
"id": "12",
"type": "right_request_term",
"attributes": {
"name": "Standard content license",
"title": "Acme Inc. Content License Agreement",
"text": "# Content License Agreement\n\nBy replying with the approval hashtag, you grant Acme Inc. a non-exclusive, royalty-free, worldwide license to\nuse, reproduce, and display your post and its content on its websites, social media accounts, and marketing\nmaterials. You confirm that you own the content and that it doesn't infringe on anyone's rights.",
"logo_url": "https://cdn.example.com/acme/logo.png",
"url": "https://example.com/terms/12",
"status": "published",
"created_at": "2025-03-01T10:15:30.000Z"
},
"relationships": {
"tint": {
"data": null
}
}
}
],
"included": [
{}
],
"links": {
"self": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=2",
"first": "https://api.tintup.com/v2/teams/1/tints",
"next": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=3",
"prev": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=1"
}
}{
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}Create a right request term
Creates a right request term.
Body
The right request term to create.
dataNewRightRequestTermrequiredParameters
team_idintegerrequiredpathThe ID of the team.
includeArray<string>tintqueryA comma-separated list of related resources to include in the response. tint is only available when the access token has the tints:read scope.
Response
The right request term.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Unprocessable Entity. The request is missing required parameters or the resource is invalid.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: right_request_terms:write
curl -X POST 'https://api.tintup.com/v2/teams/{team_id}/right_requests/terms' \
-H 'Content-Type: application/vnd.api+json' \
-d '{
"data": {
"type": "right_request_term",
"attributes": {
"name": "Standard content license",
"title": "Acme Inc. Content License Agreement",
"text": "# Content License Agreement\n\nBy replying with the approval hashtag, you grant Acme Inc. a non-exclusive, royalty-free, worldwide license\nto use, reproduce, and display your post and its content on its websites, social media accounts, and\nmarketing materials. You confirm that you own the content and that it doesn'\''t infringe on anyone'\''s rights.",
"logo_url": "https://cdn.example.com/acme/logo.png",
"document": "eyJfcmFpbHMiOnsiZGF0YSI6NDIsInB1ciI6ImJsb2JfaWQifX0=--9f8e7d6c5b4a39281706f5e4d3c2b1a098765432"
}
}
}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/right_requests/terms', {
method: 'POST',
headers: {
'Content-Type': 'application/vnd.api+json',
},
body: JSON.stringify({
"data": {
"type": "right_request_term",
"attributes": {
"name": "Standard content license",
"title": "Acme Inc. Content License Agreement",
"text": "# Content License Agreement\n\nBy replying with the approval hashtag, you grant Acme Inc. a non-exclusive, royalty-free, worldwide license\nto use, reproduce, and display your post and its content on its websites, social media accounts, and\nmarketing materials. You confirm that you own the content and that it doesn't infringe on anyone's rights.",
"logo_url": "https://cdn.example.com/acme/logo.png",
"document": "eyJfcmFpbHMiOnsiZGF0YSI6NDIsInB1ciI6ImJsb2JfaWQifX0=--9f8e7d6c5b4a39281706f5e4d3c2b1a098765432"
}
}
}),
});
const data = await response.json();import requests
payload = {
"data": {
"type": "right_request_term",
"attributes": {
"name": "Standard content license",
"title": "Acme Inc. Content License Agreement",
"text": "# Content License Agreement\n\nBy replying with the approval hashtag, you grant Acme Inc. a non-exclusive, royalty-free, worldwide license\nto use, reproduce, and display your post and its content on its websites, social media accounts, and\nmarketing materials. You confirm that you own the content and that it doesn't infringe on anyone's rights.",
"logo_url": "https://cdn.example.com/acme/logo.png",
"document": "eyJfcmFpbHMiOnsiZGF0YSI6NDIsInB1ciI6ImJsb2JfaWQifX0=--9f8e7d6c5b4a39281706f5e4d3c2b1a098765432"
}
}
}
response = requests.post('https://api.tintup.com/v2/teams/{team_id}/right_requests/terms', json=payload)
data = response.json(){
"data": {
"type": "right_request_term",
"attributes": {
"name": "Standard content license",
"title": "Acme Inc. Content License Agreement",
"logo_url": "https://cdn.example.com/acme/logo.png",
"text": "# Content License Agreement\n\nBy replying with the approval hashtag, you grant Acme Inc. a non-exclusive, royalty-free, worldwide\nlicense to use, reproduce, and display your post and its content on its websites, social media\naccounts, and marketing materials. You confirm that you own the content and that it doesn't infringe\non anyone's rights."
}
}
}{
"data": {
"type": "right_request_term",
"attributes": {
"name": "Legal-approved license (PDF)",
"document": "eyJfcmFpbHMiOnsiZGF0YSI6NDIsInB1ciI6ImJsb2JfaWQifX0=--9f8e7d6c5b4a39281706f5e4d3c2b1a098765432"
}
}
}{
"data": {
"id": "12",
"type": "right_request_term",
"attributes": {
"name": "Standard content license",
"title": "Acme Inc. Content License Agreement",
"text": "# Content License Agreement\n\nBy replying with the approval hashtag, you grant Acme Inc. a non-exclusive, royalty-free, worldwide license to\nuse, reproduce, and display your post and its content on its websites, social media accounts, and marketing\nmaterials. You confirm that you own the content and that it doesn't infringe on anyone's rights.",
"logo_url": "https://cdn.example.com/acme/logo.png",
"url": "https://example.com/terms/12",
"status": "published",
"created_at": "2025-03-01T10:15:30.000Z"
},
"relationships": {
"tint": {
"data": null
}
}
},
"included": [
{}
]
}{
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"title": "Invalid name",
"detail": "Name can't be blank",
"source": {
"pointer": "/data/attributes/name"
}
}
]
}Retrieve a list of right request terms for a board
Returns the team's published right request terms. The board must belong to the team (otherwise a 404 is returned), but the list isn't currently narrowed down to terms limited to that board.
Parameters
team_idintegerrequiredpathThe ID of the team.
tint_idintegerrequiredpathThe ID of the board.
includeArray<string>tintqueryA comma-separated list of related resources to include in the response. tint is only available when the access token has the tints:read scope.
pageobjectqueryOffset pagination. Use page[size] to set the number of items per page and page[number] to select a page. The response's links object contains ready-to-use URLs for the next and previous pages.
sortArray<string>id-idname-namecreated_at-created_at-idqueryA comma-separated list of fields to sort by. Prefix a field with - to sort in descending order. Defaults to -id (newest first).
filterobjectqueryFilters the right request terms.
Response
A list of published right request terms.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Not Found.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: right_request_terms:read
curl -X GET 'https://api.tintup.com/v2/teams/{team_id}/tints/{tint_id}/right_requests/terms'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/tints/{tint_id}/right_requests/terms', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.tintup.com/v2/teams/{team_id}/tints/{tint_id}/right_requests/terms')
data = response.json(){
"data": [
{
"id": "12",
"type": "right_request_term",
"attributes": {
"name": "Standard content license",
"title": "Acme Inc. Content License Agreement",
"text": "# Content License Agreement\n\nBy replying with the approval hashtag, you grant Acme Inc. a non-exclusive, royalty-free, worldwide license to\nuse, reproduce, and display your post and its content on its websites, social media accounts, and marketing\nmaterials. You confirm that you own the content and that it doesn't infringe on anyone's rights.",
"logo_url": "https://cdn.example.com/acme/logo.png",
"url": "https://example.com/terms/12",
"status": "published",
"created_at": "2025-03-01T10:15:30.000Z"
},
"relationships": {
"tint": {
"data": null
}
}
}
],
"included": [
{}
],
"links": {
"self": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=2",
"first": "https://api.tintup.com/v2/teams/1/tints",
"next": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=3",
"prev": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=1"
}
}{
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"code": "404",
"title": "Not found",
"status": "404"
}
]
}Retrieve a right request term
Unlike the other right request term endpoints, this one also returns archived terms, so they can be displayed to authors who want to review the terms they were asked to accept. It requires an access token for a member of the team (a 403 is returned otherwise, including when no access token is given), but no specific scope. The tint relationship is only returned when the access token has the tints:read scope.
Parameters
team_idintegerrequiredpathThe ID of the team.
right_request_term_idintegerrequiredpathThe ID of the right request term.
includeArray<string>tintqueryA comma-separated list of related resources to include in the response. tint is only available when the access token has the tints:read scope.
Response
The right request term.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Not Found.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
curl -X GET 'https://api.tintup.com/v2/teams/{team_id}/right_requests/terms/{right_request_term_id}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/right_requests/terms/{right_request_term_id}', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.tintup.com/v2/teams/{team_id}/right_requests/terms/{right_request_term_id}')
data = response.json(){
"data": {
"id": "12",
"type": "right_request_term",
"attributes": {
"name": "Standard content license",
"title": "Acme Inc. Content License Agreement",
"text": "# Content License Agreement\n\nBy replying with the approval hashtag, you grant Acme Inc. a non-exclusive, royalty-free, worldwide license to\nuse, reproduce, and display your post and its content on its websites, social media accounts, and marketing\nmaterials. You confirm that you own the content and that it doesn't infringe on anyone's rights.",
"logo_url": "https://cdn.example.com/acme/logo.png",
"url": "https://example.com/terms/12",
"status": "published",
"created_at": "2025-03-01T10:15:30.000Z"
},
"relationships": {
"tint": {
"data": null
}
}
},
"included": [
{}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"code": "404",
"title": "Not found",
"status": "404"
}
]
}Delete a right request term
Archives the terms rather than permanently deleting them, so existing right requests keep pointing to them. Archived terms can't be deleted again (404).
Parameters
team_idintegerrequiredpathThe ID of the team.
right_request_term_idintegerrequiredpathThe ID of the right request term.
Response
No Content. The request succeeded and there is no response body.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Not Found.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: right_request_terms:write
curl -X DELETE 'https://api.tintup.com/v2/teams/{team_id}/right_requests/terms/{right_request_term_id}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/right_requests/terms/{right_request_term_id}', {
method: 'DELETE',
});
const data = await response.json();import requests
response = requests.delete('https://api.tintup.com/v2/teams/{team_id}/right_requests/terms/{right_request_term_id}')
data = response.json(){
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"code": "404",
"title": "Not found",
"status": "404"
}
]
}Right Requests
right_requestsRetrieve a list of right requests
Returns the team's right requests for posts in the team's boards, as well as requests for Instagram posts requested by URL.
Parameters
team_idintegerrequiredpathThe ID of the team.
includeArray<string>assetspoststemplatequeryA comma-separated list of related resources to include in the response. Each relationship is only available when the access token has the matching read scope (posts:read, assets:read, or right_request_templates:read).
pageobjectqueryOffset pagination. Use page[size] to set the number of items per page and page[number] to select a page. The response's links object contains ready-to-use URLs for the next and previous pages.
sortArray<string>id-idcreated_at-created_atupdated_at-updated_atapproved_at-approved_atstatus-status-idqueryA comma-separated list of fields to sort by. Prefix a field with - to sort in descending order. Defaults to -id (newest first).
filterobjectqueryFilters the right requests. List filters accept a comma-separated list of values and match any of them; time range filters accept one or more operators.
Response
A list of right requests.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: right_requests:read
curl -X GET 'https://api.tintup.com/v2/teams/{team_id}/right_requests'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/right_requests', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.tintup.com/v2/teams/{team_id}/right_requests')
data = response.json(){
"data": [
{
"id": "1234",
"type": "right_request",
"attributes": {
"hashtag": "AcmeYes",
"created_at": "2025-03-14T16:42:07.000Z",
"updated_at": "2025-03-15T09:12:44.000Z",
"approved_at": "2025-03-15T09:12:44.000Z",
"status": "approved",
"status_expires_at": null,
"text": "Such a great shot! We would love to share this picture on our Instagram page. @janedoe if you agree, please reply #AcmeYes and review our terms at https://example.com/terms/12",
"source": "instagram_business",
"external_id": "17895695668004550"
},
"relationships": {
"posts": {
"meta": {
"included": false
}
},
"assets": {
"meta": {
"included": false
}
},
"template": {
"meta": {
"included": false
}
}
}
}
],
"included": [
{}
],
"links": {
"self": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=2",
"first": "https://api.tintup.com/v2/teams/1/tints",
"next": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=3",
"prev": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=1"
}
}{
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}Create a right request
Asks the author of a post for the rights to reuse it. The message is generated from the template and sent from the given account; for X (Twitter), it is sent a few seconds later, so the right request starts as pending. For the other sources, it starts as requested.
Body
The right request to send.
dataNewRightRequestrequiredParameters
team_idintegerrequiredpathThe ID of the team.
includeArray<string>assetspoststemplatequeryA comma-separated list of related resources to include in the response. Each relationship is only available when the access token has the matching read scope (posts:read, assets:read, or right_request_templates:read).
Response
The right request.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Unprocessable Entity. The request is missing required parameters or the resource is invalid.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: right_requests:write
curl -X POST 'https://api.tintup.com/v2/teams/{team_id}/right_requests' \
-H 'Content-Type: application/vnd.api+json' \
-d '{
"data": {
"type": "right_request",
"attributes": {
"source": "instagram_business",
"external_id": "17895695668004550",
"account_id": 56,
"subaccount_id": "464297566935356|17841401839964064",
"hashtag": "AcmeYes",
"right_request_term_id": 12,
"template_id": 34,
"template": "Such a great shot! We would love to share this picture on our Instagram page. @{{posts.first.author.username}} if you agree, please reply {{approval_keyword}} and review our terms at {{terms.url}}",
"tint_id": 42
}
}
}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/right_requests', {
method: 'POST',
headers: {
'Content-Type': 'application/vnd.api+json',
},
body: JSON.stringify({
"data": {
"type": "right_request",
"attributes": {
"source": "instagram_business",
"external_id": "17895695668004550",
"account_id": 56,
"subaccount_id": "464297566935356|17841401839964064",
"hashtag": "AcmeYes",
"right_request_term_id": 12,
"template_id": 34,
"template": "Such a great shot! We would love to share this picture on our Instagram page. @{{posts.first.author.username}} if you agree, please reply {{approval_keyword}} and review our terms at {{terms.url}}",
"tint_id": 42
}
}
}),
});
const data = await response.json();import requests
payload = {
"data": {
"type": "right_request",
"attributes": {
"source": "instagram_business",
"external_id": "17895695668004550",
"account_id": 56,
"subaccount_id": "464297566935356|17841401839964064",
"hashtag": "AcmeYes",
"right_request_term_id": 12,
"template_id": 34,
"template": "Such a great shot! We would love to share this picture on our Instagram page. @{{posts.first.author.username}} if you agree, please reply {{approval_keyword}} and review our terms at {{terms.url}}",
"tint_id": 42
}
}
}
response = requests.post('https://api.tintup.com/v2/teams/{team_id}/right_requests', json=payload)
data = response.json(){
"data": {
"type": "right_request",
"attributes": {
"source": "instagram_business",
"external_id": "17895695668004550",
"account_id": 56,
"subaccount_id": "464297566935356|17841401839964064",
"hashtag": "AcmeYes",
"right_request_term_id": 12,
"template_id": 34
}
}
}{
"data": {
"type": "right_request",
"attributes": {
"source": "externally_sourced_posts",
"external_id": "https://www.instagram.com/p/C4xYz12AbCd/",
"account_id": 56,
"subaccount_id": "464297566935356|17841401839964064",
"hashtag": "AcmeYes",
"right_request_term_id": 12,
"tint_id": 42,
"template": "We love this post! If you agree to let Acme Inc. share it, reply {{approval_keyword}}. Terms: {{terms.url}}"
}
}
}{
"data": {
"id": "1234",
"type": "right_request",
"attributes": {
"hashtag": "AcmeYes",
"created_at": "2025-03-14T16:42:07.000Z",
"updated_at": "2025-03-15T09:12:44.000Z",
"approved_at": "2025-03-15T09:12:44.000Z",
"status": "approved",
"status_expires_at": null,
"text": "Such a great shot! We would love to share this picture on our Instagram page. @janedoe if you agree, please reply #AcmeYes and review our terms at https://example.com/terms/12",
"source": "instagram_business",
"external_id": "17895695668004550"
},
"relationships": {
"posts": {
"meta": {
"included": false
}
},
"assets": {
"meta": {
"included": false
}
},
"template": {
"meta": {
"included": false
}
}
}
},
"included": [
{}
]
}{
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"title": "Invalid name",
"detail": "Name can't be blank",
"source": {
"pointer": "/data/attributes/name"
}
}
]
}Retrieve a right request
Retrieves a right request.
Parameters
team_idintegerrequiredpathThe ID of the team.
right_request_idintegerrequiredpathThe ID of the right request.
includeArray<string>assetspoststemplatequeryA comma-separated list of related resources to include in the response. Each relationship is only available when the access token has the matching read scope (posts:read, assets:read, or right_request_templates:read).
Response
The right request.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Not Found.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: right_requests:read
curl -X GET 'https://api.tintup.com/v2/teams/{team_id}/right_requests/{right_request_id}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/right_requests/{right_request_id}', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.tintup.com/v2/teams/{team_id}/right_requests/{right_request_id}')
data = response.json(){
"data": {
"id": "1234",
"type": "right_request",
"attributes": {
"hashtag": "AcmeYes",
"created_at": "2025-03-14T16:42:07.000Z",
"updated_at": "2025-03-15T09:12:44.000Z",
"approved_at": "2025-03-15T09:12:44.000Z",
"status": "approved",
"status_expires_at": null,
"text": "Such a great shot! We would love to share this picture on our Instagram page. @janedoe if you agree, please reply #AcmeYes and review our terms at https://example.com/terms/12",
"source": "instagram_business",
"external_id": "17895695668004550"
},
"relationships": {
"posts": {
"meta": {
"included": false
}
},
"assets": {
"meta": {
"included": false
}
},
"template": {
"meta": {
"included": false
}
}
}
},
"included": [
{}
]
}{
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"code": "404",
"title": "Not found",
"status": "404"
}
]
}Retrieve right request metrics
Counts the right requests created or approved over time, optionally grouped by one or more dimensions. Only right requests sent from accounts connected by the current user are counted.
Parameters
team_idintegerrequiredpathThe ID of the team.
measure_namestringcreatedapprovedrequiredpathThe event to count, either right requests created or right requests approved.
filterobjectqueryFilters the metrics. List filters accept a comma-separated list of values and match any of them. Only right requests sent from accounts connected by the current user are counted.
groupArray<string>timetime.minutetime.hourtime.daytime.weektime.monthtime.quartertime.yeartime.day_of_weektime.hour_of_daysourceuser_idaccount_idsubaccount_idqueryA comma-separated list of dimensions to group the metrics by. time groups by day. Time buckets are returned newest first.
Response
A list of right request metrics, one row per combination of the grouping dimensions, or a single row when the group query parameter isn't used. The list is not paginated.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: right_requests:read
curl -X GET 'https://api.tintup.com/v2/teams/{team_id}/right_requests/metrics/{measure_name}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/right_requests/metrics/{measure_name}', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.tintup.com/v2/teams/{team_id}/right_requests/metrics/{measure_name}')
data = response.json(){
"data": [
{
"id": "f42c2ba98b72afee69976d52875fe313",
"type": "right_requests_metric",
"attributes": {
"count": 41,
"dimensions": {
"source": "instagram_business",
"time": "2025-03-14 00:00:00.000000000"
}
}
},
{
"id": "0b9e4c7d2a8f41e3b5c6d7e8f9a0b1c2",
"type": "right_requests_metric",
"attributes": {
"count": 17,
"dimensions": {
"source": "tiktok_business",
"time": "2025-03-14 00:00:00.000000000"
}
}
}
]
}{
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}Boards
group_boardsBoards
tintsRetrieve a list of boards
Returns the boards you have access to.
Parameters
team_idintegerrequiredpathThe ID of the team.
pageobjectqueryOffset pagination. Use page[size] to set the number of items per page and page[number] to select a page. The response's links object contains ready-to-use URLs for the next and previous pages.
includeArray<string>default_personalizationpersonalizationspostsrecently_active_embed_locationsrights_termssaved_filterssocial_feedsqueryA comma-separated list of related resources to include in the response.
filterobjectqueryFilters the boards.
sortArray<string>id-idname-nameslug-slugcreated_at-created_atlast_moderated_at-last_moderated_at-idqueryA comma-separated list of fields to sort by. Prefix a field with - to sort in descending order. Defaults to -id (newest first).
Response
A list of boards.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: tints:read
curl -X GET 'https://api.tintup.com/v2/teams/{team_id}/tints'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/tints', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.tintup.com/v2/teams/{team_id}/tints')
data = response.json(){
"data": [
{
"id": "42",
"type": "tint",
"attributes": {
"name": "Acme Summer Campaign",
"slug": "acme-summer-campaign",
"public_channel": null,
"status": "active",
"private": false,
"tags": [
"featured",
"follow up"
],
"auto_moderation_rules": [
{
"conditions": {
"text": [
"spam"
]
},
"changes": {
"status": "private"
}
}
],
"last_moderated_at": "2025-03-14T16:42:07.000Z",
"created_at": "2025-01-06T09:15:00.000Z"
},
"relationships": {
"personalizations": {
"data": [],
"meta": {
"included": false
}
},
"default_personalization": {
"data": {
"type": "personalization",
"id": "7"
}
},
"social_feeds": {
"data": [
{
"type": "social_feed",
"id": "311"
}
],
"meta": {
"included": false,
"total": 3,
"count": 3,
"access_error_count": 0
}
},
"posts": {
"data": [
{
"type": "post",
"id": "9001"
}
],
"links": {
"first": "https://api.tintup.com/v2/tints/42/posts",
"next": "https://api.tintup.com/v2/tints/42/posts?page%5Bbefore%5D=MTc0MTk3MDUyN3w5MDAxfDA%3D",
"previous": "https://api.tintup.com/v2/tints/42/posts?page%5Bafter%5D=MTc0MTk3MDUyN3w5MDAxfDA%3D"
},
"meta": {
"included": false
}
},
"saved_filters": {
"data": [
{
"type": "saved_filter",
"id": "15"
}
],
"meta": {
"included": false
}
},
"recently_active_embed_locations": {
"data": [
{
"type": "recently_active_embed_location",
"id": "https://example.com/summer"
}
],
"meta": {
"included": false
}
},
"rights_terms": {
"data": [
{
"type": "right_request_term",
"id": "5"
}
],
"meta": {
"included": false
}
}
},
"links": {
"self": "https://api.tintup.com/v2/teams/1/tints/42",
"public_post_terms": "https://app.tintup.com/public_post_terms/acme-summer-campaign",
"websocket": null
}
}
],
"links": {
"self": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=2",
"first": "https://api.tintup.com/v2/teams/1/tints",
"next": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=3",
"prev": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=1"
}
}Create a board
Fails with 402 when the team has reached its plan's board limit.
Body
The board to create.
dataNewTintrequiredThe board to create.
Parameters
team_idintegerrequiredpathThe ID of the team.
includeArray<string>default_personalizationpersonalizationspostsrecently_active_embed_locationsrights_termssaved_filterssocial_feedsqueryA comma-separated list of related resources to include in the response.
Response
The board.
Payment Required. The team already has as many active boards as its plan allows.
Unprocessable Entity. The request is missing required parameters or the resource is invalid.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: tints:write
curl -X POST 'https://api.tintup.com/v2/teams/{team_id}/tints' \
-H 'Content-Type: application/vnd.api+json' \
-d '{
"data": {
"type": "tint",
"attributes": {
"name": "Acme Summer Campaign",
"private": false,
"tags": [
"featured",
"follow up"
],
"auto_moderation_rules": [
{
"conditions": {
"text": [
"spam"
]
},
"changes": {
"status": "private"
}
}
]
}
}
}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/tints', {
method: 'POST',
headers: {
'Content-Type': 'application/vnd.api+json',
},
body: JSON.stringify({
"data": {
"type": "tint",
"attributes": {
"name": "Acme Summer Campaign",
"private": false,
"tags": [
"featured",
"follow up"
],
"auto_moderation_rules": [
{
"conditions": {
"text": [
"spam"
]
},
"changes": {
"status": "private"
}
}
]
}
}
}),
});
const data = await response.json();import requests
payload = {
"data": {
"type": "tint",
"attributes": {
"name": "Acme Summer Campaign",
"private": False,
"tags": [
"featured",
"follow up"
],
"auto_moderation_rules": [
{
"conditions": {
"text": [
"spam"
]
},
"changes": {
"status": "private"
}
}
]
}
}
}
response = requests.post('https://api.tintup.com/v2/teams/{team_id}/tints', json=payload)
data = response.json(){
"data": {
"type": "tint",
"attributes": {
"name": "Acme Summer Campaign",
"private": false,
"tags": [
"featured",
"follow up"
],
"auto_moderation_rules": [
{
"conditions": {
"text": [
"spam"
]
},
"changes": {
"status": "private"
}
}
]
}
}
}{
"data": {
"id": "42",
"type": "tint",
"attributes": {
"name": "Acme Summer Campaign",
"slug": "acme-summer-campaign",
"public_channel": null,
"status": "active",
"private": false,
"tags": [
"featured",
"follow up"
],
"auto_moderation_rules": [
{
"conditions": {
"text": [
"spam"
]
},
"changes": {
"status": "private"
}
}
],
"last_moderated_at": "2025-03-14T16:42:07.000Z",
"created_at": "2025-01-06T09:15:00.000Z"
},
"relationships": {
"personalizations": {
"data": [],
"meta": {
"included": false
}
},
"default_personalization": {
"data": {
"type": "personalization",
"id": "7"
}
},
"social_feeds": {
"data": [
{
"type": "social_feed",
"id": "311"
}
],
"meta": {
"included": false,
"total": 3,
"count": 3,
"access_error_count": 0
}
},
"posts": {
"data": [
{
"type": "post",
"id": "9001"
}
],
"links": {
"first": "https://api.tintup.com/v2/tints/42/posts",
"next": "https://api.tintup.com/v2/tints/42/posts?page%5Bbefore%5D=MTc0MTk3MDUyN3w5MDAxfDA%3D",
"previous": "https://api.tintup.com/v2/tints/42/posts?page%5Bafter%5D=MTc0MTk3MDUyN3w5MDAxfDA%3D"
},
"meta": {
"included": false
}
},
"saved_filters": {
"data": [
{
"type": "saved_filter",
"id": "15"
}
],
"meta": {
"included": false
}
},
"recently_active_embed_locations": {
"data": [
{
"type": "recently_active_embed_location",
"id": "https://example.com/summer"
}
],
"meta": {
"included": false
}
},
"rights_terms": {
"data": [
{
"type": "right_request_term",
"id": "5"
}
],
"meta": {
"included": false
}
}
},
"links": {
"self": "https://api.tintup.com/v2/teams/1/tints/42",
"public_post_terms": "https://app.tintup.com/public_post_terms/acme-summer-campaign",
"websocket": null
}
}
}{
"errors": [
{
"code": "402",
"title": "Plan limit exceeded",
"status": "402"
}
]
}{
"errors": [
{
"title": "Invalid name",
"detail": "Name can't be blank",
"source": {
"pointer": "/data/attributes/name"
}
}
]
}Delete multiple boards
Deletes several boards at once.
Body
The boards to delete, each identified by its id. Boards you don't have access to are ignored.
dataArray<TintBulkDelete>requiredParameters
team_idintegerrequiredpathThe ID of the team.
Response
No Content. The request succeeded and there is no response body.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: tints:write
curl -X DELETE 'https://api.tintup.com/v2/teams/{team_id}/tints' \
-H 'Content-Type: application/vnd.api+json; ext=bulk' \
-d '{
"data": [
{
"id": "42",
"type": "tint"
},
{
"id": "43",
"type": "tint"
}
]
}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/tints', {
method: 'DELETE',
headers: {
'Content-Type': 'application/vnd.api+json; ext=bulk',
},
body: JSON.stringify({
"data": [
{
"id": "42",
"type": "tint"
},
{
"id": "43",
"type": "tint"
}
]
}),
});
const data = await response.json();import requests
payload = {
"data": [
{
"id": "42",
"type": "tint"
},
{
"id": "43",
"type": "tint"
}
]
}
response = requests.delete('https://api.tintup.com/v2/teams/{team_id}/tints', json=payload)
data = response.json(){
"data": [
{
"id": "42",
"type": "tint"
},
{
"id": "43",
"type": "tint"
}
]
}Update multiple boards
The request is validated as a whole: if any board is invalid, none are updated.
Body
The boards to update, each identified by its id.
dataArray<TintBulkUpdate>requiredParameters
team_idintegerrequiredpathThe ID of the team.
Response
The updated boards.
Unprocessable Entity. The request is missing required parameters or the resource is invalid.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: tints:write
curl -X PATCH 'https://api.tintup.com/v2/teams/{team_id}/tints' \
-H 'Content-Type: application/vnd.api+json; ext=bulk' \
-d '{
"data": [
{
"id": "42",
"type": "tint",
"attributes": {
"status": "inactive"
}
},
{
"id": "43",
"type": "tint",
"attributes": {
"private": true
}
}
]
}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/tints', {
method: 'PATCH',
headers: {
'Content-Type': 'application/vnd.api+json; ext=bulk',
},
body: JSON.stringify({
"data": [
{
"id": "42",
"type": "tint",
"attributes": {
"status": "inactive"
}
},
{
"id": "43",
"type": "tint",
"attributes": {
"private": true
}
}
]
}),
});
const data = await response.json();import requests
payload = {
"data": [
{
"id": "42",
"type": "tint",
"attributes": {
"status": "inactive"
}
},
{
"id": "43",
"type": "tint",
"attributes": {
"private": True
}
}
]
}
response = requests.patch('https://api.tintup.com/v2/teams/{team_id}/tints', json=payload)
data = response.json(){
"data": [
{
"id": "42",
"type": "tint",
"attributes": {
"status": "inactive"
}
},
{
"id": "43",
"type": "tint",
"attributes": {
"private": true
}
}
]
}{
"data": [
{
"id": "42",
"type": "tint",
"attributes": {
"name": "Acme Summer Campaign",
"slug": "acme-summer-campaign",
"public_channel": null,
"status": "active",
"private": false,
"tags": [
"featured",
"follow up"
],
"auto_moderation_rules": [
{
"conditions": {
"text": [
"spam"
]
},
"changes": {
"status": "private"
}
}
],
"last_moderated_at": "2025-03-14T16:42:07.000Z",
"created_at": "2025-01-06T09:15:00.000Z"
},
"relationships": {
"personalizations": {
"data": [],
"meta": {
"included": false
}
},
"default_personalization": {
"data": {
"type": "personalization",
"id": "7"
}
},
"social_feeds": {
"data": [
{
"type": "social_feed",
"id": "311"
}
],
"meta": {
"included": false,
"total": 3,
"count": 3,
"access_error_count": 0
}
},
"posts": {
"data": [
{
"type": "post",
"id": "9001"
}
],
"links": {
"first": "https://api.tintup.com/v2/tints/42/posts",
"next": "https://api.tintup.com/v2/tints/42/posts?page%5Bbefore%5D=MTc0MTk3MDUyN3w5MDAxfDA%3D",
"previous": "https://api.tintup.com/v2/tints/42/posts?page%5Bafter%5D=MTc0MTk3MDUyN3w5MDAxfDA%3D"
},
"meta": {
"included": false
}
},
"saved_filters": {
"data": [
{
"type": "saved_filter",
"id": "15"
}
],
"meta": {
"included": false
}
},
"recently_active_embed_locations": {
"data": [
{
"type": "recently_active_embed_location",
"id": "https://example.com/summer"
}
],
"meta": {
"included": false
}
},
"rights_terms": {
"data": [
{
"type": "right_request_term",
"id": "5"
}
],
"meta": {
"included": false
}
}
},
"links": {
"self": "https://api.tintup.com/v2/teams/1/tints/42",
"public_post_terms": "https://app.tintup.com/public_post_terms/acme-summer-campaign",
"websocket": null
}
}
]
}{
"errors": [
{
"title": "Invalid name",
"detail": "Name can't be blank",
"source": {
"pointer": "/data/attributes/name"
}
}
]
}Retrieve aggregated board engagement metrics
Counts the engagement events of the team's boards, optionally grouped by one or more dimensions.
Parameters
team_idintegerrequiredpathThe ID of the team.
embed_engagement_typestringembed_post_modal_openedembed_post_external_link_openedembed_post_cta_clickedembed_post_sharedembed_post_modal_navigate_rightembed_post_modal_navigate_leftembed_paginatedembed_post_author_clickedembed_post_product_clickedembed_loadedembed_viewedrequiredpathThe board engagement event type to count. Multiple types can be combined in a single path segment, separated by a pipe (|), for example embed_loaded|embed_viewed. Unknown types are ignored.
filterobjectqueryFilters the engagement events that are counted.
groupArray<string>time.hourtime.daytime.weektime.monthtime.quartertime.yeartime.day_of_weektime.hour_of_daytint_idpost_idpersonalization_typethemedevice_categorymedia_typeembed_urlremote_ip_countryqueryA comma-separated list of dimensions to group the metrics by. Time dimensions (time.*) return a time dimension truncated to the unit (time.day_of_week and time.hour_of_day return the day or hour number instead).
aggregationstringcountcount_uniquecountqueryHow to count events: count sums all events, count_unique counts unique visitors (approximately).
Response
A list of board engagement metrics.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: tints:read
curl -X GET 'https://api.tintup.com/v2/teams/{team_id}/tints/metrics/engagements/{embed_engagement_type}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/tints/metrics/engagements/{embed_engagement_type}', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.tintup.com/v2/teams/{team_id}/tints/metrics/engagements/{embed_engagement_type}')
data = response.json(){
"data": [
{
"id": "f42c2ba98b72afee69976d52875fe313",
"type": "embed_engagement_metric",
"attributes": {
"count": 1284,
"dimensions": {
"tint_id": "42",
"time": "2025-03-14T00:00:00.000-04:00",
"created_at": "2025-03-14T00:00:00.000-04:00"
}
},
"relationships": {
"tint": {
"data": {
"type": "tint",
"id": "42"
}
},
"post": {
"data": {
"type": "post",
"id": "9001"
}
}
}
}
]
}Retrieve a board
Parameters
team_idintegerrequiredpathThe ID of the team.
tint_idintegerrequiredpathThe ID of the board.
includeArray<string>default_personalizationpersonalizationspostsrecently_active_embed_locationsrights_termssaved_filterssocial_feedsqueryA comma-separated list of related resources to include in the response.
Response
The board.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: tints:read
curl -X GET 'https://api.tintup.com/v2/teams/{team_id}/tints/{tint_id}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/tints/{tint_id}', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.tintup.com/v2/teams/{team_id}/tints/{tint_id}')
data = response.json(){
"data": {
"id": "42",
"type": "tint",
"attributes": {
"name": "Acme Summer Campaign",
"slug": "acme-summer-campaign",
"public_channel": null,
"status": "active",
"private": false,
"tags": [
"featured",
"follow up"
],
"auto_moderation_rules": [
{
"conditions": {
"text": [
"spam"
]
},
"changes": {
"status": "private"
}
}
],
"last_moderated_at": "2025-03-14T16:42:07.000Z",
"created_at": "2025-01-06T09:15:00.000Z"
},
"relationships": {
"personalizations": {
"data": [],
"meta": {
"included": false
}
},
"default_personalization": {
"data": {
"type": "personalization",
"id": "7"
}
},
"social_feeds": {
"data": [
{
"type": "social_feed",
"id": "311"
}
],
"meta": {
"included": false,
"total": 3,
"count": 3,
"access_error_count": 0
}
},
"posts": {
"data": [
{
"type": "post",
"id": "9001"
}
],
"links": {
"first": "https://api.tintup.com/v2/tints/42/posts",
"next": "https://api.tintup.com/v2/tints/42/posts?page%5Bbefore%5D=MTc0MTk3MDUyN3w5MDAxfDA%3D",
"previous": "https://api.tintup.com/v2/tints/42/posts?page%5Bafter%5D=MTc0MTk3MDUyN3w5MDAxfDA%3D"
},
"meta": {
"included": false
}
},
"saved_filters": {
"data": [
{
"type": "saved_filter",
"id": "15"
}
],
"meta": {
"included": false
}
},
"recently_active_embed_locations": {
"data": [
{
"type": "recently_active_embed_location",
"id": "https://example.com/summer"
}
],
"meta": {
"included": false
}
},
"rights_terms": {
"data": [
{
"type": "right_request_term",
"id": "5"
}
],
"meta": {
"included": false
}
}
},
"links": {
"self": "https://api.tintup.com/v2/teams/1/tints/42",
"public_post_terms": "https://app.tintup.com/public_post_terms/acme-summer-campaign",
"websocket": null
}
}
}Delete a board
Deletes the board.
Parameters
team_idintegerrequiredpathThe ID of the team.
tint_idintegerrequiredpathThe ID of the board.
Response
No Content. The request succeeded and there is no response body.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: tints:write
curl -X DELETE 'https://api.tintup.com/v2/teams/{team_id}/tints/{tint_id}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/tints/{tint_id}', {
method: 'DELETE',
});
const data = await response.json();import requests
response = requests.delete('https://api.tintup.com/v2/teams/{team_id}/tints/{tint_id}')
data = response.json()Update a board
Updates the board.
Body
The board changes.
dataTintUpdaterequiredThe board changes. Only the attributes sent are changed. The id is optional; the board is identified by the URL.
Parameters
team_idintegerrequiredpathThe ID of the team.
tint_idintegerrequiredpathThe ID of the board.
includeArray<string>default_personalizationpersonalizationspostsrecently_active_embed_locationsrights_termssaved_filterssocial_feedsqueryA comma-separated list of related resources to include in the response.
Response
The board.
Unprocessable Entity. The request is missing required parameters or the resource is invalid.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: tints:write
curl -X PATCH 'https://api.tintup.com/v2/teams/{team_id}/tints/{tint_id}' \
-H 'Content-Type: application/vnd.api+json' \
-d '{
"data": {
"id": "42",
"type": "tint",
"attributes": {
"name": "Acme Summer Campaign 2025",
"status": "active"
}
}
}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/tints/{tint_id}', {
method: 'PATCH',
headers: {
'Content-Type': 'application/vnd.api+json',
},
body: JSON.stringify({
"data": {
"id": "42",
"type": "tint",
"attributes": {
"name": "Acme Summer Campaign 2025",
"status": "active"
}
}
}),
});
const data = await response.json();import requests
payload = {
"data": {
"id": "42",
"type": "tint",
"attributes": {
"name": "Acme Summer Campaign 2025",
"status": "active"
}
}
}
response = requests.patch('https://api.tintup.com/v2/teams/{team_id}/tints/{tint_id}', json=payload)
data = response.json(){
"data": {
"id": "42",
"type": "tint",
"attributes": {
"name": "Acme Summer Campaign 2025",
"status": "active"
}
}
}{
"data": {
"id": "42",
"type": "tint",
"attributes": {
"name": "Acme Summer Campaign",
"slug": "acme-summer-campaign",
"public_channel": null,
"status": "active",
"private": false,
"tags": [
"featured",
"follow up"
],
"auto_moderation_rules": [
{
"conditions": {
"text": [
"spam"
]
},
"changes": {
"status": "private"
}
}
],
"last_moderated_at": "2025-03-14T16:42:07.000Z",
"created_at": "2025-01-06T09:15:00.000Z"
},
"relationships": {
"personalizations": {
"data": [],
"meta": {
"included": false
}
},
"default_personalization": {
"data": {
"type": "personalization",
"id": "7"
}
},
"social_feeds": {
"data": [
{
"type": "social_feed",
"id": "311"
}
],
"meta": {
"included": false,
"total": 3,
"count": 3,
"access_error_count": 0
}
},
"posts": {
"data": [
{
"type": "post",
"id": "9001"
}
],
"links": {
"first": "https://api.tintup.com/v2/tints/42/posts",
"next": "https://api.tintup.com/v2/tints/42/posts?page%5Bbefore%5D=MTc0MTk3MDUyN3w5MDAxfDA%3D",
"previous": "https://api.tintup.com/v2/tints/42/posts?page%5Bafter%5D=MTc0MTk3MDUyN3w5MDAxfDA%3D"
},
"meta": {
"included": false
}
},
"saved_filters": {
"data": [
{
"type": "saved_filter",
"id": "15"
}
],
"meta": {
"included": false
}
},
"recently_active_embed_locations": {
"data": [
{
"type": "recently_active_embed_location",
"id": "https://example.com/summer"
}
],
"meta": {
"included": false
}
},
"rights_terms": {
"data": [
{
"type": "right_request_term",
"id": "5"
}
],
"meta": {
"included": false
}
}
},
"links": {
"self": "https://api.tintup.com/v2/teams/1/tints/42",
"public_post_terms": "https://app.tintup.com/public_post_terms/acme-summer-campaign",
"websocket": null
}
}
}{
"errors": [
{
"title": "Invalid name",
"detail": "Name can't be blank",
"source": {
"pointer": "/data/attributes/name"
}
}
]
}Retrieve a public board
Returns a public board by its slug. No authentication is required; if an Authorization header is sent, the access token must have the tints:read scope.
Parameters
tint_slugstringrequiredpathThe slug of the board, the unique part of its public URL.
Response
The board. Without an access token, the public representation is returned; with one, the full representation (see "Retrieve a board") is returned.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: tints:read
curl -X GET 'https://api.tintup.com/v2/tints/{tint_slug}'const response = await fetch('https://api.tintup.com/v2/tints/{tint_slug}', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.tintup.com/v2/tints/{tint_slug}')
data = response.json(){
"data": {
"id": "42",
"type": "tint",
"attributes": {
"name": "Acme Summer Campaign",
"slug": "acme-summer-campaign",
"public_channel": null
},
"relationships": {
"personalizations": {
"data": [],
"meta": {
"included": false
}
},
"default_personalization": {
"data": {
"type": "personalization",
"id": "7"
}
},
"social_feeds": {
"data": [
{
"type": "social_feed",
"id": "311"
}
],
"meta": {
"included": false,
"total": 3,
"count": 3,
"access_error_count": 0
}
},
"posts": {
"data": [
{
"type": "post",
"id": "9001"
}
],
"links": {
"first": "https://api.tintup.com/v2/tints/42/posts",
"next": "https://api.tintup.com/v2/tints/42/posts?page%5Bbefore%5D=MTc0MTk3MDUyN3w5MDAxfDA%3D",
"previous": "https://api.tintup.com/v2/tints/42/posts?page%5Bafter%5D=MTc0MTk3MDUyN3w5MDAxfDA%3D"
},
"meta": {
"included": false
}
}
},
"links": {
"self": "https://api.tintup.com/v2/teams/1/tints/42",
"public_post_terms": "https://app.tintup.com/public_post_terms/acme-summer-campaign",
"websocket": null
}
}
}CTAs
ctasRetrieve a list of CTAs
Returns the CTAs of the board.
Parameters
team_idintegerrequiredpathThe ID of the team.
tint_idintegerrequiredpathThe ID of the board.
pageobjectqueryOffset pagination. Use page[size] to set the number of items per page and page[number] to select a page. The response's links object contains ready-to-use URLs for the next and previous pages.
includeArray<string>tintqueryA comma-separated list of related resources to include in the response.
sortArray<string>id-idname-namecreated_at-created_atupdated_at-updated_atposts_count-posts_countsaved_filters_count-saved_filters_count-idqueryA comma-separated list of fields to sort by. Prefix a field with - to sort in descending order.
Response
A list of CTAs.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Not Found.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: ctas:read
curl -X GET 'https://api.tintup.com/v2/teams/{team_id}/tints/{tint_id}/ctas'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/tints/{tint_id}/ctas', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.tintup.com/v2/teams/{team_id}/tints/{tint_id}/ctas')
data = response.json(){
"data": [
{
"id": "731",
"type": "cta",
"attributes": {
"name": "Spring sale booking",
"text": "Book now",
"url": "https://example.com/spring-sale?utm_source=board"
},
"relationships": {
"tint": {
"data": {
"type": "tint",
"id": "96"
},
"meta": {
"included": false
}
}
}
}
],
"links": {
"self": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=2",
"first": "https://api.tintup.com/v2/teams/1/tints",
"next": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=3",
"prev": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=1"
}
}{
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"code": "404",
"title": "Not found",
"status": "404"
}
]
}Create a CTA
Creates a CTA on the board.
Body
The CTA to create.
dataNewCtarequiredParameters
team_idintegerrequiredpathThe ID of the team.
tint_idintegerrequiredpathThe ID of the board.
includeArray<string>tintqueryA comma-separated list of related resources to include in the response.
Response
The CTA.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Not Found.
Unprocessable Entity. The request is missing required parameters or the resource is invalid.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: ctas:write
curl -X POST 'https://api.tintup.com/v2/teams/{team_id}/tints/{tint_id}/ctas' \
-H 'Content-Type: application/vnd.api+json' \
-d '{
"data": {
"type": "cta",
"attributes": {
"name": "Spring sale booking",
"text": "Book now",
"url": "https://example.com/spring-sale?utm_source=board"
}
}
}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/tints/{tint_id}/ctas', {
method: 'POST',
headers: {
'Content-Type': 'application/vnd.api+json',
},
body: JSON.stringify({
"data": {
"type": "cta",
"attributes": {
"name": "Spring sale booking",
"text": "Book now",
"url": "https://example.com/spring-sale?utm_source=board"
}
}
}),
});
const data = await response.json();import requests
payload = {
"data": {
"type": "cta",
"attributes": {
"name": "Spring sale booking",
"text": "Book now",
"url": "https://example.com/spring-sale?utm_source=board"
}
}
}
response = requests.post('https://api.tintup.com/v2/teams/{team_id}/tints/{tint_id}/ctas', json=payload)
data = response.json(){
"data": {
"type": "cta",
"attributes": {
"name": "Spring sale booking",
"text": "Book now",
"url": "https://example.com/spring-sale?utm_source=board"
}
}
}{
"data": {
"id": "731",
"type": "cta",
"attributes": {
"name": "Spring sale booking",
"text": "Book now",
"url": "https://example.com/spring-sale?utm_source=board"
},
"relationships": {
"tint": {
"data": {
"type": "tint",
"id": "96"
},
"meta": {
"included": false
}
}
}
}
}{
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"code": "404",
"title": "Not found",
"status": "404"
}
]
}{
"errors": [
{
"title": "Invalid name",
"detail": "Name can't be blank",
"source": {
"pointer": "/data/attributes/name"
}
}
]
}Retrieve a CTA
Retrieves one of the board's CTAs.
Parameters
team_idintegerrequiredpathThe ID of the team.
tint_idintegerrequiredpathThe ID of the board.
cta_idintegerrequiredpathThe ID of the CTA.
includeArray<string>tintqueryA comma-separated list of related resources to include in the response.
Response
The CTA.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Not Found.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: ctas:read
curl -X GET 'https://api.tintup.com/v2/teams/{team_id}/tints/{tint_id}/ctas/{cta_id}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/tints/{tint_id}/ctas/{cta_id}', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.tintup.com/v2/teams/{team_id}/tints/{tint_id}/ctas/{cta_id}')
data = response.json(){
"data": {
"id": "731",
"type": "cta",
"attributes": {
"name": "Spring sale booking",
"text": "Book now",
"url": "https://example.com/spring-sale?utm_source=board"
},
"relationships": {
"tint": {
"data": {
"type": "tint",
"id": "96"
},
"meta": {
"included": false
}
}
}
}
}{
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"code": "404",
"title": "Not found",
"status": "404"
}
]
}Delete a CTA
Deletes the CTA and removes it from every post and saved filter it was applied to.
Parameters
team_idintegerrequiredpathThe ID of the team.
tint_idintegerrequiredpathThe ID of the board.
cta_idintegerrequiredpathThe ID of the CTA.
Response
No Content. The request succeeded and there is no response body.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Not Found.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: ctas:write
curl -X DELETE 'https://api.tintup.com/v2/teams/{team_id}/tints/{tint_id}/ctas/{cta_id}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/tints/{tint_id}/ctas/{cta_id}', {
method: 'DELETE',
});
const data = await response.json();import requests
response = requests.delete('https://api.tintup.com/v2/teams/{team_id}/tints/{tint_id}/ctas/{cta_id}')
data = response.json(){
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"code": "404",
"title": "Not found",
"status": "404"
}
]
}Update a CTA
Updates the CTA.
Body
The attributes to change.
dataCtaUpdaterequiredOnly the attributes that are sent are changed. Sent attributes can't be blank.
Parameters
team_idintegerrequiredpathThe ID of the team.
tint_idintegerrequiredpathThe ID of the board.
cta_idintegerrequiredpathThe ID of the CTA.
includeArray<string>tintqueryA comma-separated list of related resources to include in the response.
Response
The CTA.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Not Found.
Unprocessable Entity. The request is missing required parameters or the resource is invalid.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: ctas:write
curl -X PATCH 'https://api.tintup.com/v2/teams/{team_id}/tints/{tint_id}/ctas/{cta_id}' \
-H 'Content-Type: application/vnd.api+json' \
-d '{
"data": {
"id": "731",
"type": "cta",
"attributes": {
"name": "Spring sale booking",
"text": "Book now",
"url": "https://example.com/spring-sale?utm_source=board"
}
}
}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/tints/{tint_id}/ctas/{cta_id}', {
method: 'PATCH',
headers: {
'Content-Type': 'application/vnd.api+json',
},
body: JSON.stringify({
"data": {
"id": "731",
"type": "cta",
"attributes": {
"name": "Spring sale booking",
"text": "Book now",
"url": "https://example.com/spring-sale?utm_source=board"
}
}
}),
});
const data = await response.json();import requests
payload = {
"data": {
"id": "731",
"type": "cta",
"attributes": {
"name": "Spring sale booking",
"text": "Book now",
"url": "https://example.com/spring-sale?utm_source=board"
}
}
}
response = requests.patch('https://api.tintup.com/v2/teams/{team_id}/tints/{tint_id}/ctas/{cta_id}', json=payload)
data = response.json(){
"data": {
"id": "731",
"type": "cta",
"attributes": {
"name": "Spring sale booking",
"text": "Book now",
"url": "https://example.com/spring-sale?utm_source=board"
}
}
}{
"data": {
"id": "731",
"type": "cta",
"attributes": {
"name": "Spring sale booking",
"text": "Book now",
"url": "https://example.com/spring-sale?utm_source=board"
},
"relationships": {
"tint": {
"data": {
"type": "tint",
"id": "96"
},
"meta": {
"included": false
}
}
}
}
}{
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"code": "404",
"title": "Not found",
"status": "404"
}
]
}{
"errors": [
{
"title": "Invalid name",
"detail": "Name can't be blank",
"source": {
"pointer": "/data/attributes/name"
}
}
]
}Create a CTA association
Applies a CTA to a post or a saved filter of the board. A token with either the posts:write or the saved_filters:write scope is accepted.
Body
The CTA to apply and the post or saved filter to apply it to.
dataNewCtaAssociationrequiredParameters
team_idintegerrequiredpathThe ID of the team.
tint_idintegerrequiredpathThe ID of the board.
includeArray<string>ctapostsaved_filterqueryA comma-separated list of related resources to include in the response.
Response
The CTA association.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Not Found.
Unprocessable Entity. The request is missing required parameters or the resource is invalid.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: posts:write
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: saved_filters:write
curl -X POST 'https://api.tintup.com/v2/teams/{team_id}/tints/{tint_id}/cta_associations' \
-H 'Content-Type: application/vnd.api+json' \
-d '{
"data": {
"type": "cta_association",
"attributes": {
"cta_id": 731,
"post_id": 902314,
"saved_filter_id": 3317
}
}
}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/tints/{tint_id}/cta_associations', {
method: 'POST',
headers: {
'Content-Type': 'application/vnd.api+json',
},
body: JSON.stringify({
"data": {
"type": "cta_association",
"attributes": {
"cta_id": 731,
"post_id": 902314,
"saved_filter_id": 3317
}
}
}),
});
const data = await response.json();import requests
payload = {
"data": {
"type": "cta_association",
"attributes": {
"cta_id": 731,
"post_id": 902314,
"saved_filter_id": 3317
}
}
}
response = requests.post('https://api.tintup.com/v2/teams/{team_id}/tints/{tint_id}/cta_associations', json=payload)
data = response.json(){
"data": {
"type": "cta_association",
"attributes": {
"cta_id": 731,
"post_id": 902314,
"saved_filter_id": 3317
}
}
}{
"data": {
"id": "5120",
"type": "cta_association",
"attributes": {
"type": "post"
},
"relationships": {
"cta": {
"data": {
"type": "cta",
"id": "731"
},
"meta": {
"included": false
}
},
"post": {
"data": {
"type": "post",
"id": "902314"
},
"meta": {
"included": false
}
},
"saved_filter": {
"data": null,
"meta": {
"included": false
}
}
}
}
}{
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"code": "404",
"title": "Not found",
"status": "404"
}
]
}{
"errors": [
{
"title": "Invalid name",
"detail": "Name can't be blank",
"source": {
"pointer": "/data/attributes/name"
}
}
]
}Delete a CTA association
Removes a CTA from a post or a saved filter of the board. A token with either the posts:write or the saved_filters:write scope is accepted.
Parameters
team_idintegerrequiredpathThe ID of the team.
tint_idintegerrequiredpathThe ID of the board.
cta_association_idintegerrequiredpathThe ID of the CTA association.
Response
No Content. The request succeeded and there is no response body.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Not Found.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: posts:write
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: saved_filters:write
curl -X DELETE 'https://api.tintup.com/v2/teams/{team_id}/tints/{tint_id}/cta_associations/{cta_association_id}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/tints/{tint_id}/cta_associations/{cta_association_id}', {
method: 'DELETE',
});
const data = await response.json();import requests
response = requests.delete('https://api.tintup.com/v2/teams/{team_id}/tints/{tint_id}/cta_associations/{cta_association_id}')
data = response.json(){
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"code": "404",
"title": "Not found",
"status": "404"
}
]
}Personalizations
personalizationsRetrieve a list of personalizations
Returns the personalizations the user has access to.
Parameters
team_idintegerrequiredpathThe ID of the team.
filterobjectqueryFilters the list of personalizations.
sortstring-idqueryA comma-separated list of attributes to sort by. Prefix an attribute with - to sort in descending order.
pageobjectqueryOffset pagination. Use page[size] to set the number of items per page and page[number] to select a page. The response's links object contains ready-to-use URLs for the next and previous pages.
Response
A list of personalizations.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: personalizations:read
curl -X GET 'https://api.tintup.com/v2/teams/{team_id}/personalizations'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/personalizations', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.tintup.com/v2/teams/{team_id}/personalizations')
data = response.json(){
"data": [
{
"id": "301",
"type": "personalization",
"attributes": {
"type": "embed",
"theme": "classic_v3",
"data": {
"draft": {
"custom_css": ".tint-post { border-radius: 8px; }",
"popup_custom_css": ".tint-popup { background: #fff; }"
},
"published": {
"custom_css": ".tint-post { border-radius: 8px; }",
"popup_custom_css": ".tint-popup { background: #fff; }"
}
},
"name": "Homepage wall",
"tags": [
"website",
"spring"
],
"created_at": "2025-03-14T16:42:07.000Z",
"updated_at": "2025-03-18T09:12:44.000Z"
}
}
],
"links": {
"self": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=2",
"first": "https://api.tintup.com/v2/teams/1/tints",
"next": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=3",
"prev": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=1"
},
"meta": {
"aggregations": {
"tags": {
"spring": 3,
"website": 5
}
}
}
}{
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}Create a personalization
Creates a personalization and grants access to it to the user's role and to the roles that have access to new personalizations.
Body
The personalization to create.
dataNewPersonalizationrequiredParameters
team_idintegerrequiredpathThe ID of the team.
Response
The personalization.
Unauthorized. The access token is missing, invalid, expired or revoked.
Payment Required. The team reached its plan's limit of personalizations.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Unprocessable Entity. The request is missing required parameters or the resource is invalid.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: personalizations:write
curl -X POST 'https://api.tintup.com/v2/teams/{team_id}/personalizations' \
-H 'Content-Type: application/vnd.api+json' \
-d '{
"data": {
"type": "personalization",
"attributes": {
"name": "Homepage wall",
"theme": "classic_v3",
"type": "embed",
"tags": [
"website"
]
}
}
}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/personalizations', {
method: 'POST',
headers: {
'Content-Type': 'application/vnd.api+json',
},
body: JSON.stringify({
"data": {
"type": "personalization",
"attributes": {
"name": "Homepage wall",
"theme": "classic_v3",
"type": "embed",
"tags": [
"website"
]
}
}
}),
});
const data = await response.json();import requests
payload = {
"data": {
"type": "personalization",
"attributes": {
"name": "Homepage wall",
"theme": "classic_v3",
"type": "embed",
"tags": [
"website"
]
}
}
}
response = requests.post('https://api.tintup.com/v2/teams/{team_id}/personalizations', json=payload)
data = response.json(){
"data": {
"type": "personalization",
"attributes": {
"name": "Homepage wall",
"theme": "classic_v3",
"type": "embed",
"tags": [
"website"
]
}
}
}{
"data": {
"id": "301",
"type": "personalization",
"attributes": {
"type": "embed",
"theme": "classic_v3",
"data": {
"draft": {
"custom_css": ".tint-post { border-radius: 8px; }",
"popup_custom_css": ".tint-popup { background: #fff; }"
},
"published": {
"custom_css": ".tint-post { border-radius: 8px; }",
"popup_custom_css": ".tint-popup { background: #fff; }"
}
},
"name": "Homepage wall",
"tags": [
"website",
"spring"
],
"created_at": "2025-03-14T16:42:07.000Z",
"updated_at": "2025-03-18T09:12:44.000Z"
}
}
}{
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4020001",
"title": "Payment Required",
"status": "402",
"detail": "You have exceeded your plan's limit of 10"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"title": "Invalid name",
"detail": "Name can't be blank",
"source": {
"pointer": "/data/attributes/name"
}
}
]
}Delete multiple personalizations
Deletes several personalizations at once.
Body
The personalizations to delete. IDs the user can't access are ignored.
dataArray<PersonalizationIdentifier>requiredParameters
team_idintegerrequiredpathThe ID of the team.
Response
No Content. The request succeeded and there is no response body.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Unprocessable Entity. The request is missing required parameters or the resource is invalid.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: personalizations:write
curl -X DELETE 'https://api.tintup.com/v2/teams/{team_id}/personalizations' \
-H 'Content-Type: application/vnd.api+json; ext=bulk' \
-d '{
"data": [
{
"id": "301",
"type": "personalization"
},
{
"id": "302",
"type": "personalization"
}
]
}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/personalizations', {
method: 'DELETE',
headers: {
'Content-Type': 'application/vnd.api+json; ext=bulk',
},
body: JSON.stringify({
"data": [
{
"id": "301",
"type": "personalization"
},
{
"id": "302",
"type": "personalization"
}
]
}),
});
const data = await response.json();import requests
payload = {
"data": [
{
"id": "301",
"type": "personalization"
},
{
"id": "302",
"type": "personalization"
}
]
}
response = requests.delete('https://api.tintup.com/v2/teams/{team_id}/personalizations', json=payload)
data = response.json(){
"data": [
{
"id": "301",
"type": "personalization"
},
{
"id": "302",
"type": "personalization"
}
]
}{
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"title": "Invalid name",
"detail": "Name can't be blank",
"source": {
"pointer": "/data/attributes/name"
}
}
]
}Update multiple personalizations
Only name, theme, tags and status are saved. PUT is accepted as an alias of PATCH.
Body
The personalizations to update. If any personalization is invalid, none are updated.
dataArray<PersonalizationBulkUpdate>requiredParameters
team_idintegerrequiredpathThe ID of the team.
Response
A list of personalizations.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Unprocessable Entity. The request is missing required parameters or the resource is invalid.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: personalizations:write
curl -X PATCH 'https://api.tintup.com/v2/teams/{team_id}/personalizations' \
-H 'Content-Type: application/vnd.api+json; ext=bulk' \
-d '{
"data": [
{
"id": "301",
"type": "personalization",
"attributes": {
"status": "archived"
}
},
{
"id": "302",
"type": "personalization",
"attributes": {
"status": "archived"
}
}
]
}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/personalizations', {
method: 'PATCH',
headers: {
'Content-Type': 'application/vnd.api+json; ext=bulk',
},
body: JSON.stringify({
"data": [
{
"id": "301",
"type": "personalization",
"attributes": {
"status": "archived"
}
},
{
"id": "302",
"type": "personalization",
"attributes": {
"status": "archived"
}
}
]
}),
});
const data = await response.json();import requests
payload = {
"data": [
{
"id": "301",
"type": "personalization",
"attributes": {
"status": "archived"
}
},
{
"id": "302",
"type": "personalization",
"attributes": {
"status": "archived"
}
}
]
}
response = requests.patch('https://api.tintup.com/v2/teams/{team_id}/personalizations', json=payload)
data = response.json(){
"data": [
{
"id": "301",
"type": "personalization",
"attributes": {
"status": "archived"
}
},
{
"id": "302",
"type": "personalization",
"attributes": {
"status": "archived"
}
}
]
}{
"data": [
{
"id": "301",
"type": "personalization",
"attributes": {
"type": "embed",
"theme": "classic_v3",
"data": {
"draft": {
"custom_css": ".tint-post { border-radius: 8px; }",
"popup_custom_css": ".tint-popup { background: #fff; }"
},
"published": {
"custom_css": ".tint-post { border-radius: 8px; }",
"popup_custom_css": ".tint-popup { background: #fff; }"
}
},
"name": "Homepage wall",
"tags": [
"website",
"spring"
],
"created_at": "2025-03-14T16:42:07.000Z",
"updated_at": "2025-03-18T09:12:44.000Z"
}
}
],
"links": {
"self": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=2",
"first": "https://api.tintup.com/v2/teams/1/tints",
"next": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=3",
"prev": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=1"
}
}{
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"title": "Invalid name",
"detail": "Name can't be blank",
"source": {
"pointer": "/data/attributes/name"
}
}
]
}Retrieve a personalization
With an access token, retrieves one of the personalizations the user has access to. Without an Authorization header, retrieves any active personalization with a reduced set of attributes and only the published settings.
Parameters
team_idintegerrequiredpathThe ID of the team.
personalization_idintegerrequiredpathThe ID of the personalization.
Response
The personalization.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Not Found.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: personalizations:read
curl -X GET 'https://api.tintup.com/v2/teams/{team_id}/personalizations/{personalization_id}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/personalizations/{personalization_id}', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.tintup.com/v2/teams/{team_id}/personalizations/{personalization_id}')
data = response.json(){
"data": {
"id": "301",
"type": "personalization",
"attributes": {
"type": "embed",
"theme": "classic_v3",
"data": {
"draft": {
"custom_css": ".tint-post { border-radius: 8px; }",
"popup_custom_css": ".tint-popup { background: #fff; }"
},
"published": {
"custom_css": ".tint-post { border-radius: 8px; }",
"popup_custom_css": ".tint-popup { background: #fff; }"
}
},
"name": "Homepage wall",
"tags": [
"website",
"spring"
],
"created_at": "2025-03-14T16:42:07.000Z",
"updated_at": "2025-03-18T09:12:44.000Z"
}
}
}{
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"code": "404",
"title": "Not found",
"status": "404"
}
]
}Delete a personalization
Deletes the personalization.
Parameters
team_idintegerrequiredpathThe ID of the team.
personalization_idintegerrequiredpathThe ID of the personalization.
Response
No Content. The request succeeded and there is no response body.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Not Found.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: personalizations:write
curl -X DELETE 'https://api.tintup.com/v2/teams/{team_id}/personalizations/{personalization_id}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/personalizations/{personalization_id}', {
method: 'DELETE',
});
const data = await response.json();import requests
response = requests.delete('https://api.tintup.com/v2/teams/{team_id}/personalizations/{personalization_id}')
data = response.json(){
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"code": "404",
"title": "Not found",
"status": "404"
}
]
}Update a personalization
PUT is accepted as an alias of PATCH.
Body
The attributes to change.
dataPersonalizationUpdaterequiredParameters
team_idintegerrequiredpathThe ID of the team.
personalization_idintegerrequiredpathThe ID of the personalization.
Response
The personalization.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Not Found.
Unprocessable Entity. The request is missing required parameters or the resource is invalid.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: personalizations:write
curl -X PATCH 'https://api.tintup.com/v2/teams/{team_id}/personalizations/{personalization_id}' \
-H 'Content-Type: application/vnd.api+json' \
-d '{
"data": {
"type": "personalization",
"attributes": {
"name": "Homepage wall",
"data": {
"draft": {
"custom_css": ".tint-post { border-radius: 8px; }"
},
"published": {
"custom_css": ".tint-post { border-radius: 8px; }"
}
}
}
}
}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/personalizations/{personalization_id}', {
method: 'PATCH',
headers: {
'Content-Type': 'application/vnd.api+json',
},
body: JSON.stringify({
"data": {
"type": "personalization",
"attributes": {
"name": "Homepage wall",
"data": {
"draft": {
"custom_css": ".tint-post { border-radius: 8px; }"
},
"published": {
"custom_css": ".tint-post { border-radius: 8px; }"
}
}
}
}
}),
});
const data = await response.json();import requests
payload = {
"data": {
"type": "personalization",
"attributes": {
"name": "Homepage wall",
"data": {
"draft": {
"custom_css": ".tint-post { border-radius: 8px; }"
},
"published": {
"custom_css": ".tint-post { border-radius: 8px; }"
}
}
}
}
}
response = requests.patch('https://api.tintup.com/v2/teams/{team_id}/personalizations/{personalization_id}', json=payload)
data = response.json(){
"data": {
"type": "personalization",
"attributes": {
"name": "Homepage wall",
"data": {
"draft": {
"custom_css": ".tint-post { border-radius: 8px; }"
},
"published": {
"custom_css": ".tint-post { border-radius: 8px; }"
}
}
}
}
}{
"data": {
"id": "301",
"type": "personalization",
"attributes": {
"type": "embed",
"theme": "classic_v3",
"data": {
"draft": {
"custom_css": ".tint-post { border-radius: 8px; }",
"popup_custom_css": ".tint-popup { background: #fff; }"
},
"published": {
"custom_css": ".tint-post { border-radius: 8px; }",
"popup_custom_css": ".tint-popup { background: #fff; }"
}
},
"name": "Homepage wall",
"tags": [
"website",
"spring"
],
"created_at": "2025-03-14T16:42:07.000Z",
"updated_at": "2025-03-18T09:12:44.000Z"
}
}
}{
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"code": "404",
"title": "Not found",
"status": "404"
}
]
}{
"errors": [
{
"title": "Invalid name",
"detail": "Name can't be blank",
"source": {
"pointer": "/data/attributes/name"
}
}
]
}Post Summaries
posts_summariesGenerate or retrieve a posts summary
Generates or retrieves a summary of the posts of the specified board. No authentication is required; if an
Authorization header is sent, the access token must have the posts:read scope.
If the summary already exists and is up to date, the request returns 200 OK with the summary, or
204 No Content if the summary is empty. If the summary needs to be generated, the request returns
202 Accepted and the summary will be available shortly.
Body
The posts to summarize.
The posts to summarize. These parameters can also be sent in the query string. Different parameters produce a different summary.
filterobjectThe filters applied to the posts included in the summary. The same filters as "Retrieve a list of public posts for a board" are supported.
sortstringThe sort order applied to the posts included in the summary.
Parameters
tint_slugstringrequiredpathThe slug of the board, the unique part of its public URL.
includeArray<string>teamqueryA comma-separated list of related resources to include in the response.
Response
The posts summary for the given filters.
The posts summary generation has been queued. Repeat the same request later to fetch the completed summary.
No Content. The request succeeded and there is no response body.
Not Found.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: posts:read
curl -X POST 'https://api.tintup.com/v2/tints/{tint_slug}/posts/summaries' \
-H 'Content-Type: application/vnd.api+json' \
-d '{
"filter": {
"rating": {
"$gte": 60
},
"tag": "sku:ACME-SNK-001"
},
"sort": "-published_at"
}'const response = await fetch('https://api.tintup.com/v2/tints/{tint_slug}/posts/summaries', {
method: 'POST',
headers: {
'Content-Type': 'application/vnd.api+json',
},
body: JSON.stringify({
"filter": {
"rating": {
"$gte": 60
},
"tag": "sku:ACME-SNK-001"
},
"sort": "-published_at"
}),
});
const data = await response.json();import requests
payload = {
"filter": {
"rating": {
"$gte": 60
},
"tag": "sku:ACME-SNK-001"
},
"sort": "-published_at"
}
response = requests.post('https://api.tintup.com/v2/tints/{tint_slug}/posts/summaries', json=payload)
data = response.json(){
"filter": {
"rating": {
"$gte": 60
},
"tag": "sku:ACME-SNK-001"
},
"sort": "-published_at"
}{
"data": {
"id": "3b6d5c3e9a09a2b47a2d87b6d4a2c65a3b6d5c3e9a09a2b47a2d87b6d4a2c65a",
"type": "posts_summary",
"attributes": {
"status": "ready",
"fresh": true,
"summary": "Customers love the comfort and design of the sneakers, but some mention sizing runs small.",
"key_insights": [
"Very comfortable for all-day wear",
"Sizing runs half a size small"
],
"created_at": "2025-03-14T16:42:07Z",
"updated_at": "2025-03-14T16:42:31Z",
"expires_at": "2025-03-15T16:42:07Z"
},
"relationships": {
"team": {
"data": {
"type": "team",
"id": "1"
}
}
}
}
}{
"data": {
"id": "3b6d5c3e9a09a2b47a2d87b6d4a2c65a3b6d5c3e9a09a2b47a2d87b6d4a2c65a",
"type": "posts_summary",
"attributes": {
"status": "ready",
"fresh": true,
"summary": "Customers love the comfort and design of the sneakers, but some mention sizing runs small.",
"key_insights": [
"Very comfortable for all-day wear",
"Sizing runs half a size small"
],
"created_at": "2025-03-14T16:42:07Z",
"updated_at": "2025-03-14T16:42:31Z",
"expires_at": "2025-03-15T16:42:07Z"
},
"relationships": {
"team": {
"data": {
"type": "team",
"id": "1"
}
}
}
}
}{
"errors": [
{
"code": "404",
"title": "Not found",
"status": "404"
}
]
}Posts
postsRetrieve a list of posts
Returns the posts of the boards you have access to, newest pinned posts first by default. Returns 503 while search is temporarily unavailable.
Parameters
team_idintegerrequiredpathThe ID of the team.
filterobjectqueryFilters the posts. Unless noted, list filters take a comma-separated list of values and match any of them.
sortArray<string>pinned-pinnedpublished_at-published_atlast_moderated_at-last_moderated_atrating-ratingscore-score-pinnedqueryA comma-separated list of fields to sort by. Prefix a field with - to sort in descending order. Ties are broken by publication time and ID. score sorts by relevance to filter[q].
includeArray<string>assetauthorcta_associationscta_associations.ctaproduct_tagsproductsproducts.productrepliesright_requestssocial_feedtintqueryA comma-separated list of related resources to include in the response.
collapsestringsource,external_idqueryUse source,external_id to return a single post for posts ingested in several boards from the same source post. The other copies are returned in the siblings relationship, and the response uses offset pagination (page[offset], starting at 0) instead of cursors.
objectqueryCursor pagination. Use page[size] to set the number of items per page. Cursors are opaque; don't build them yourself, follow the links.next and links.prev URLs from the previous response instead.
Response
A list of posts.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: posts:read
curl -X GET 'https://api.tintup.com/v2/teams/{team_id}/posts'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/posts', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.tintup.com/v2/teams/{team_id}/posts')
data = response.json(){
"data": [
{
"id": "9001",
"type": "post",
"attributes": {
"external_id": "17912345678901234",
"url": "https://www.instagram.com/p/C4xYz12AbCd/",
"title": null,
"text": "Loving my new Acme sneakers!",
"alternative_text": "A pair of white Acme sneakers on a beach.",
"published_at": "2025-03-14T16:42:07.000Z",
"highlighted": false,
"pinned": false,
"tags": [
"featured"
],
"carousel": false,
"media_type": "image",
"image_url": "https://cdn.example.com/posts/9001/media.jpg",
"video_url": null,
"attachment_id": "aHR0cHM6Ly9jZG4uZXhhbXBsZS5jb20vcG9zdHMvOTAwMS9tZWRpYS5qcGc=",
"author": {
"name": "Jane Doe",
"username": "janedoe",
"url": "https://example.com/janedoe",
"image_url": "https://cdn.example.com/avatars/janedoe.jpg",
"external_id": "17841400008460056",
"email": "jane.doe@example.com",
"phone": "+15555550123",
"remote_ip": "203.0.113.0"
},
"metadata": {
"language": "en",
"sentiment": "positive",
"image_nsfw": 0.02,
"image_phash": "d1c4f0e0b0a09080",
"image_sentiments": [
"happy"
],
"image_objects": [
"shoe",
"beach"
],
"image_objects_rekognition": [
"shoe",
"beach"
]
},
"language": "en",
"rating": 80,
"verified": null,
"incentivized": null,
"status_reasons": null,
"last_moderated_at": "2025-03-15T09:03:11.000Z",
"custom_field": null,
"sentiment": "positive",
"image_nsfw": 0.02,
"image_phash": null,
"image_sentiments": null,
"image_objects": [
"shoe",
"beach"
],
"hue_probability": null
},
"relationships": {
"social_feed": {
"data": {
"type": "social_feed",
"id": "311"
}
},
"tint": {
"data": {
"type": "tint",
"id": "42"
},
"links": {
"self": "https://api.tintup.com/v2/teams/1/tints/42"
}
},
"author": {
"data": {
"type": "author",
"id": "9001"
},
"meta": {
"included": false
}
},
"replies": {
"data": [
{
"type": "reply",
"id": "88"
}
],
"meta": {
"included": false
}
},
"products": {
"data": [
{
"type": "product_tag",
"id": "501"
}
],
"meta": {
"included": false
}
},
"product_tags": {
"data": [
{
"type": "product_tag",
"id": "501"
}
],
"meta": {
"included": false
}
},
"cta_associations": {
"data": [
{
"type": "cta_association",
"id": "64"
}
],
"meta": {
"included": false
}
},
"asset": {
"data": {
"type": "asset",
"id": "7300"
},
"meta": {
"included": false
}
},
"right_requests": {
"data": [
{
"type": "right_request",
"id": "210"
}
],
"meta": {
"included": false,
"status": "approved",
"status_expires_at": null
}
},
"siblings": {
"data": [
{
"type": "post",
"id": "9002"
}
]
}
}
}
],
"links": {
"self": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=2",
"first": "https://api.tintup.com/v2/teams/1/tints",
"next": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=3",
"prev": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=1"
}
}Delete multiple posts
Deletes several posts of the board at once.
Body
The posts to delete, each identified by its id.
dataArray<PostDelete>requiredParameters
team_idintegerrequiredpathThe ID of the team.
Response
No Content. The request succeeded and there is no response body.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: posts:write
curl -X DELETE 'https://api.tintup.com/v2/teams/{team_id}/posts' \
-H 'Content-Type: application/vnd.api+json; ext=bulk' \
-d '{
"data": [
{
"id": "9001",
"type": "post"
},
{
"id": "9002",
"type": "post"
}
]
}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/posts', {
method: 'DELETE',
headers: {
'Content-Type': 'application/vnd.api+json; ext=bulk',
},
body: JSON.stringify({
"data": [
{
"id": "9001",
"type": "post"
},
{
"id": "9002",
"type": "post"
}
]
}),
});
const data = await response.json();import requests
payload = {
"data": [
{
"id": "9001",
"type": "post"
},
{
"id": "9002",
"type": "post"
}
]
}
response = requests.delete('https://api.tintup.com/v2/teams/{team_id}/posts', json=payload)
data = response.json(){
"data": [
{
"id": "9001",
"type": "post"
},
{
"id": "9002",
"type": "post"
}
]
}Update multiple posts
The request is validated as a whole: if any post is invalid, none are updated.
Body
The posts to update, each identified by its id.
dataArray<PostBulkUpdate>requiredParameters
team_idintegerrequiredpathThe ID of the team.
Response
The updated posts.
Unprocessable Entity. The request is missing required parameters or the resource is invalid.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: posts:write
curl -X PATCH 'https://api.tintup.com/v2/teams/{team_id}/posts' \
-H 'Content-Type: application/vnd.api+json; ext=bulk' \
-d '{
"data": [
{
"id": "9001",
"type": "post",
"attributes": {
"status": "public"
}
},
{
"id": "9002",
"type": "post",
"attributes": {
"status": "private",
"status_reasons": [
"off_topic"
]
}
}
]
}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/posts', {
method: 'PATCH',
headers: {
'Content-Type': 'application/vnd.api+json; ext=bulk',
},
body: JSON.stringify({
"data": [
{
"id": "9001",
"type": "post",
"attributes": {
"status": "public"
}
},
{
"id": "9002",
"type": "post",
"attributes": {
"status": "private",
"status_reasons": [
"off_topic"
]
}
}
]
}),
});
const data = await response.json();import requests
payload = {
"data": [
{
"id": "9001",
"type": "post",
"attributes": {
"status": "public"
}
},
{
"id": "9002",
"type": "post",
"attributes": {
"status": "private",
"status_reasons": [
"off_topic"
]
}
}
]
}
response = requests.patch('https://api.tintup.com/v2/teams/{team_id}/posts', json=payload)
data = response.json(){
"data": [
{
"id": "9001",
"type": "post",
"attributes": {
"status": "public"
}
},
{
"id": "9002",
"type": "post",
"attributes": {
"status": "private",
"status_reasons": [
"off_topic"
]
}
}
]
}{
"data": [
{
"id": "9001",
"type": "post",
"attributes": {
"external_id": "17912345678901234",
"url": "https://www.instagram.com/p/C4xYz12AbCd/",
"title": null,
"text": "Loving my new Acme sneakers!",
"alternative_text": "A pair of white Acme sneakers on a beach.",
"published_at": "2025-03-14T16:42:07.000Z",
"highlighted": false,
"pinned": false,
"tags": [
"featured"
],
"carousel": false,
"media_type": "image",
"image_url": "https://cdn.example.com/posts/9001/media.jpg",
"video_url": null,
"attachment_id": "aHR0cHM6Ly9jZG4uZXhhbXBsZS5jb20vcG9zdHMvOTAwMS9tZWRpYS5qcGc=",
"author": {
"name": "Jane Doe",
"username": "janedoe",
"url": "https://example.com/janedoe",
"image_url": "https://cdn.example.com/avatars/janedoe.jpg",
"external_id": "17841400008460056",
"email": "jane.doe@example.com",
"phone": "+15555550123",
"remote_ip": "203.0.113.0"
},
"metadata": {
"language": "en",
"sentiment": "positive",
"image_nsfw": 0.02,
"image_phash": "d1c4f0e0b0a09080",
"image_sentiments": [
"happy"
],
"image_objects": [
"shoe",
"beach"
],
"image_objects_rekognition": [
"shoe",
"beach"
]
},
"language": "en",
"rating": 80,
"verified": null,
"incentivized": null,
"status_reasons": null,
"last_moderated_at": "2025-03-15T09:03:11.000Z",
"custom_field": null,
"sentiment": "positive",
"image_nsfw": 0.02,
"image_phash": null,
"image_sentiments": null,
"image_objects": [
"shoe",
"beach"
],
"hue_probability": null
},
"relationships": {
"social_feed": {
"data": {
"type": "social_feed",
"id": "311"
}
},
"tint": {
"data": {
"type": "tint",
"id": "42"
},
"links": {
"self": "https://api.tintup.com/v2/teams/1/tints/42"
}
},
"author": {
"data": {
"type": "author",
"id": "9001"
},
"meta": {
"included": false
}
},
"replies": {
"data": [
{
"type": "reply",
"id": "88"
}
],
"meta": {
"included": false
}
},
"products": {
"data": [
{
"type": "product_tag",
"id": "501"
}
],
"meta": {
"included": false
}
},
"product_tags": {
"data": [
{
"type": "product_tag",
"id": "501"
}
],
"meta": {
"included": false
}
},
"cta_associations": {
"data": [
{
"type": "cta_association",
"id": "64"
}
],
"meta": {
"included": false
}
},
"asset": {
"data": {
"type": "asset",
"id": "7300"
},
"meta": {
"included": false
}
},
"right_requests": {
"data": [
{
"type": "right_request",
"id": "210"
}
],
"meta": {
"included": false,
"status": "approved",
"status_expires_at": null
}
},
"siblings": {
"data": [
{
"type": "post",
"id": "9002"
}
]
}
}
}
]
}{
"errors": [
{
"title": "Invalid name",
"detail": "Name can't be blank",
"source": {
"pointer": "/data/attributes/name"
}
}
]
}Retrieve aggregated post moderation metrics
Parameters
team_idintegerrequiredpathThe ID of the team.
filterobjectqueryFilters the moderation events that are counted.
groupArray<string>time.hourtime.daytime.weektime.monthtime.quartertime.yeartime.day_of_weektime.hour_of_dayuser_idtint_idstatussourcequeryA comma-separated list of dimensions to group the metrics by.
Response
A list of moderated post metrics.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: posts:read
curl -X GET 'https://api.tintup.com/v2/teams/{team_id}/posts/metrics/moderated'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/posts/metrics/moderated', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.tintup.com/v2/teams/{team_id}/posts/metrics/moderated')
data = response.json(){
"data": [
{
"id": "f42c2ba98b72afee69976d52875fe313",
"type": "posts_metric",
"attributes": {
"count": 1284,
"dimensions": {
"tint_id": "42",
"status": "public"
}
},
"relationships": {
"tint": {
"data": {
"type": "tint",
"id": "42"
}
},
"user": {
"data": {
"type": "user",
"id": "16891"
}
}
}
}
]
}Retrieve aggregated post engagement metrics
Parameters
team_idintegerrequiredpathThe ID of the team.
post_engagement_typestringembed_post_modal_openedembed_post_external_link_openedembed_post_cta_clickedembed_post_sharedembed_post_modal_navigate_rightembed_post_modal_navigate_leftembed_paginatedembed_post_author_clickedembed_post_product_clickedrequiredpathThe post engagement event type to count.
filterobjectqueryFilters the engagement events that are counted.
groupArray<string>time.hourtime.daytime.weektime.monthtime.quartertime.yeartime.day_of_weektime.hour_of_daytint_idpost_idpersonalization_typethemedevice_categorymedia_typequeryA comma-separated list of dimensions to group the metrics by.
Response
A list of post engagement metrics.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: posts:read
curl -X GET 'https://api.tintup.com/v2/teams/{team_id}/posts/metrics/engagements/{post_engagement_type}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/posts/metrics/engagements/{post_engagement_type}', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.tintup.com/v2/teams/{team_id}/posts/metrics/engagements/{post_engagement_type}')
data = response.json(){
"data": [
{
"id": "f42c2ba98b72afee69976d52875fe313",
"type": "embed_engagement_metric",
"attributes": {
"count": 1284,
"dimensions": {
"tint_id": "42",
"time": "2025-03-14T00:00:00.000-04:00",
"created_at": "2025-03-14T00:00:00.000-04:00"
}
},
"relationships": {
"tint": {
"data": {
"type": "tint",
"id": "42"
}
},
"post": {
"data": {
"type": "post",
"id": "9001"
}
}
}
}
]
}Retrieve aggregated post ingestion metrics
Provides up to 12 months of ingestion metrics. Authentication isn't required when filter[social_feed_id] or filter[tint_id] is specified; otherwise, the access token must have the posts:read scope.
Parameters
team_idintegerrequiredpathThe ID of the team.
filterobjectqueryFilters the ingested posts that are counted.
groupArray<string>time.hourtime.daytime.weektime.monthtime.quartertime.yeartime.day_of_weektime.hour_of_daysocial_feed_idsocial_feed_sourcetint_idaccount_idqueryA comma-separated list of dimensions to group the metrics by.
Response
A list of ingested post metrics.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: posts:read
curl -X GET 'https://api.tintup.com/v2/teams/{team_id}/posts/metrics/ingested'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/posts/metrics/ingested', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.tintup.com/v2/teams/{team_id}/posts/metrics/ingested')
data = response.json(){
"data": [
{
"id": "f42c2ba98b72afee69976d52875fe313",
"type": "posts_ingested_metric",
"attributes": {
"count": 1284,
"dimensions": {
"social_feed_source": "instagram_business",
"time": "2025-03-14T00:00:00.000Z",
"created_at": "2025-03-14T00:00:00.000Z"
}
},
"relationships": {
"social_feed": {
"data": {
"type": "social_feed",
"id": "311"
}
},
"tint": {
"data": {
"type": "tint",
"id": "42"
}
},
"account": {
"data": {
"type": "account",
"id": "77"
}
}
}
}
]
}Delete a post
Deletes the post.
Parameters
team_idintegerrequiredpathThe ID of the team.
post_idintegerrequiredpathThe ID of the post.
Response
No Content. The request succeeded and there is no response body.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: posts:write
curl -X DELETE 'https://api.tintup.com/v2/teams/{team_id}/posts/{post_id}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/posts/{post_id}', {
method: 'DELETE',
});
const data = await response.json();import requests
response = requests.delete('https://api.tintup.com/v2/teams/{team_id}/posts/{post_id}')
data = response.json()Update a post
Updates the post.
Body
The post changes.
dataPostUpdaterequiredThe post changes. The id is optional; the post is identified by the URL.
Parameters
team_idintegerrequiredpathThe ID of the team.
post_idintegerrequiredpathThe ID of the post.
Response
The post.
Unprocessable Entity. The request is missing required parameters or the resource is invalid.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: posts:write
curl -X PATCH 'https://api.tintup.com/v2/teams/{team_id}/posts/{post_id}' \
-H 'Content-Type: application/vnd.api+json' \
-d '{
"data": {
"id": "9001",
"type": "post",
"attributes": {
"status": "public",
"highlighted": true,
"tags": [
"featured",
"follow up"
]
}
}
}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/posts/{post_id}', {
method: 'PATCH',
headers: {
'Content-Type': 'application/vnd.api+json',
},
body: JSON.stringify({
"data": {
"id": "9001",
"type": "post",
"attributes": {
"status": "public",
"highlighted": true,
"tags": [
"featured",
"follow up"
]
}
}
}),
});
const data = await response.json();import requests
payload = {
"data": {
"id": "9001",
"type": "post",
"attributes": {
"status": "public",
"highlighted": True,
"tags": [
"featured",
"follow up"
]
}
}
}
response = requests.patch('https://api.tintup.com/v2/teams/{team_id}/posts/{post_id}', json=payload)
data = response.json(){
"data": {
"id": "9001",
"type": "post",
"attributes": {
"status": "public",
"highlighted": true,
"tags": [
"featured",
"follow up"
]
}
}
}{
"data": {
"id": "9001",
"type": "post",
"attributes": {
"external_id": "17912345678901234",
"url": "https://www.instagram.com/p/C4xYz12AbCd/",
"title": null,
"text": "Loving my new Acme sneakers!",
"alternative_text": "A pair of white Acme sneakers on a beach.",
"published_at": "2025-03-14T16:42:07.000Z",
"highlighted": false,
"pinned": false,
"tags": [
"featured"
],
"carousel": false,
"media_type": "image",
"image_url": "https://cdn.example.com/posts/9001/media.jpg",
"video_url": null,
"attachment_id": "aHR0cHM6Ly9jZG4uZXhhbXBsZS5jb20vcG9zdHMvOTAwMS9tZWRpYS5qcGc=",
"author": {
"name": "Jane Doe",
"username": "janedoe",
"url": "https://example.com/janedoe",
"image_url": "https://cdn.example.com/avatars/janedoe.jpg",
"external_id": "17841400008460056",
"email": "jane.doe@example.com",
"phone": "+15555550123",
"remote_ip": "203.0.113.0"
},
"metadata": {
"language": "en",
"sentiment": "positive",
"image_nsfw": 0.02,
"image_phash": "d1c4f0e0b0a09080",
"image_sentiments": [
"happy"
],
"image_objects": [
"shoe",
"beach"
],
"image_objects_rekognition": [
"shoe",
"beach"
]
},
"language": "en",
"rating": 80,
"verified": null,
"incentivized": null,
"status_reasons": null,
"last_moderated_at": "2025-03-15T09:03:11.000Z",
"custom_field": null,
"sentiment": "positive",
"image_nsfw": 0.02,
"image_phash": null,
"image_sentiments": null,
"image_objects": [
"shoe",
"beach"
],
"hue_probability": null
},
"relationships": {
"social_feed": {
"data": {
"type": "social_feed",
"id": "311"
}
},
"tint": {
"data": {
"type": "tint",
"id": "42"
},
"links": {
"self": "https://api.tintup.com/v2/teams/1/tints/42"
}
},
"author": {
"data": {
"type": "author",
"id": "9001"
},
"meta": {
"included": false
}
},
"replies": {
"data": [
{
"type": "reply",
"id": "88"
}
],
"meta": {
"included": false
}
},
"products": {
"data": [
{
"type": "product_tag",
"id": "501"
}
],
"meta": {
"included": false
}
},
"product_tags": {
"data": [
{
"type": "product_tag",
"id": "501"
}
],
"meta": {
"included": false
}
},
"cta_associations": {
"data": [
{
"type": "cta_association",
"id": "64"
}
],
"meta": {
"included": false
}
},
"asset": {
"data": {
"type": "asset",
"id": "7300"
},
"meta": {
"included": false
}
},
"right_requests": {
"data": [
{
"type": "right_request",
"id": "210"
}
],
"meta": {
"included": false,
"status": "approved",
"status_expires_at": null
}
},
"siblings": {
"data": [
{
"type": "post",
"id": "9002"
}
]
}
}
}
}{
"errors": [
{
"title": "Invalid name",
"detail": "Name can't be blank",
"source": {
"pointer": "/data/attributes/name"
}
}
]
}Retrieve a list of posts for a board
deprecatedThis endpoint is deprecated. Use GET /v2/teams/{team_id}/posts?filter[tint_id]={tint_id} instead, which accepts the same parameters.
Parameters
team_idintegerrequiredpathThe ID of the team.
tint_idintegerrequiredpathThe ID of the board.
filterobjectqueryFilters the posts. Unless noted, list filters take a comma-separated list of values and match any of them.
sortArray<string>pinned-pinnedpublished_at-published_atlast_moderated_at-last_moderated_atrating-ratingscore-score-pinnedqueryA comma-separated list of fields to sort by. Prefix a field with - to sort in descending order. Ties are broken by publication time and ID. score sorts by relevance to filter[q].
includeArray<string>assetauthorcta_associationscta_associations.ctaproduct_tagsproductsproducts.productrepliesright_requestssocial_feedtintqueryA comma-separated list of related resources to include in the response.
collapsestringsource,external_idqueryUse source,external_id to return a single post for posts ingested in several boards from the same source post. The other copies are returned in the siblings relationship, and the response uses offset pagination (page[offset], starting at 0) instead of cursors.
objectqueryCursor pagination. Use page[size] to set the number of items per page. Cursors are opaque; don't build them yourself, follow the links.next and links.prev URLs from the previous response instead.
Response
A list of posts.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: posts:read
curl -X GET 'https://api.tintup.com/v2/teams/{team_id}/tints/{tint_id}/posts'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/tints/{tint_id}/posts', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.tintup.com/v2/teams/{team_id}/tints/{tint_id}/posts')
data = response.json(){
"data": [
{
"id": "9001",
"type": "post",
"attributes": {
"external_id": "17912345678901234",
"url": "https://www.instagram.com/p/C4xYz12AbCd/",
"title": null,
"text": "Loving my new Acme sneakers!",
"alternative_text": "A pair of white Acme sneakers on a beach.",
"published_at": "2025-03-14T16:42:07.000Z",
"highlighted": false,
"pinned": false,
"tags": [
"featured"
],
"carousel": false,
"media_type": "image",
"image_url": "https://cdn.example.com/posts/9001/media.jpg",
"video_url": null,
"attachment_id": "aHR0cHM6Ly9jZG4uZXhhbXBsZS5jb20vcG9zdHMvOTAwMS9tZWRpYS5qcGc=",
"author": {
"name": "Jane Doe",
"username": "janedoe",
"url": "https://example.com/janedoe",
"image_url": "https://cdn.example.com/avatars/janedoe.jpg",
"external_id": "17841400008460056",
"email": "jane.doe@example.com",
"phone": "+15555550123",
"remote_ip": "203.0.113.0"
},
"metadata": {
"language": "en",
"sentiment": "positive",
"image_nsfw": 0.02,
"image_phash": "d1c4f0e0b0a09080",
"image_sentiments": [
"happy"
],
"image_objects": [
"shoe",
"beach"
],
"image_objects_rekognition": [
"shoe",
"beach"
]
},
"language": "en",
"rating": 80,
"verified": null,
"incentivized": null,
"status_reasons": null,
"last_moderated_at": "2025-03-15T09:03:11.000Z",
"custom_field": null,
"sentiment": "positive",
"image_nsfw": 0.02,
"image_phash": null,
"image_sentiments": null,
"image_objects": [
"shoe",
"beach"
],
"hue_probability": null
},
"relationships": {
"social_feed": {
"data": {
"type": "social_feed",
"id": "311"
}
},
"tint": {
"data": {
"type": "tint",
"id": "42"
},
"links": {
"self": "https://api.tintup.com/v2/teams/1/tints/42"
}
},
"author": {
"data": {
"type": "author",
"id": "9001"
},
"meta": {
"included": false
}
},
"replies": {
"data": [
{
"type": "reply",
"id": "88"
}
],
"meta": {
"included": false
}
},
"products": {
"data": [
{
"type": "product_tag",
"id": "501"
}
],
"meta": {
"included": false
}
},
"product_tags": {
"data": [
{
"type": "product_tag",
"id": "501"
}
],
"meta": {
"included": false
}
},
"cta_associations": {
"data": [
{
"type": "cta_association",
"id": "64"
}
],
"meta": {
"included": false
}
},
"asset": {
"data": {
"type": "asset",
"id": "7300"
},
"meta": {
"included": false
}
},
"right_requests": {
"data": [
{
"type": "right_request",
"id": "210"
}
],
"meta": {
"included": false,
"status": "approved",
"status_expires_at": null
}
},
"siblings": {
"data": [
{
"type": "post",
"id": "9002"
}
]
}
}
}
],
"links": {
"self": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=2",
"first": "https://api.tintup.com/v2/teams/1/tints",
"next": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=3",
"prev": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=1"
}
}Create a custom post
Asynchronously creates a post in the board's custom social feed (the feed is created if it doesn't exist). The response is a post create request; the post itself is created shortly after.
Body
The custom post to create.
dataNewPostrequiredThe custom post to create. The post's status, external ID and publication time are set by the server. Each file in media creates a separate post; when several are sent, the posts are grouped as a carousel.
Parameters
team_idintegerrequiredpathThe ID of the team.
tint_idintegerrequiredpathThe ID of the board.
Response
The post create request.
Unprocessable Entity. The request is missing required parameters or the resource is invalid.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: posts:write
curl -X POST 'https://api.tintup.com/v2/teams/{team_id}/tints/{tint_id}/posts' \
-H 'Content-Type: application/vnd.api+json' \
-d '{
"data": {
"type": "post",
"attributes": {
"text": "Our summer collection just dropped!",
"url": "https://example.com/summer",
"alternative_text": "A pair of white Acme sneakers on a beach.",
"pinned": true,
"tags": [
"featured"
],
"media": [
"eyJfcmFpbHMiOnsiZGF0YSI6MTIzNDUsInB1ciI6ImJsb2JfaWQifX0=--0f1e2d3c4b5a69788796a5b4c3d2e1f0a9b8c7d6"
],
"author": {
"name": "Acme Inc.",
"username": "acme",
"url": "https://example.com"
}
}
}
}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/tints/{tint_id}/posts', {
method: 'POST',
headers: {
'Content-Type': 'application/vnd.api+json',
},
body: JSON.stringify({
"data": {
"type": "post",
"attributes": {
"text": "Our summer collection just dropped!",
"url": "https://example.com/summer",
"alternative_text": "A pair of white Acme sneakers on a beach.",
"pinned": true,
"tags": [
"featured"
],
"media": [
"eyJfcmFpbHMiOnsiZGF0YSI6MTIzNDUsInB1ciI6ImJsb2JfaWQifX0=--0f1e2d3c4b5a69788796a5b4c3d2e1f0a9b8c7d6"
],
"author": {
"name": "Acme Inc.",
"username": "acme",
"url": "https://example.com"
}
}
}
}),
});
const data = await response.json();import requests
payload = {
"data": {
"type": "post",
"attributes": {
"text": "Our summer collection just dropped!",
"url": "https://example.com/summer",
"alternative_text": "A pair of white Acme sneakers on a beach.",
"pinned": True,
"tags": [
"featured"
],
"media": [
"eyJfcmFpbHMiOnsiZGF0YSI6MTIzNDUsInB1ciI6ImJsb2JfaWQifX0=--0f1e2d3c4b5a69788796a5b4c3d2e1f0a9b8c7d6"
],
"author": {
"name": "Acme Inc.",
"username": "acme",
"url": "https://example.com"
}
}
}
}
response = requests.post('https://api.tintup.com/v2/teams/{team_id}/tints/{tint_id}/posts', json=payload)
data = response.json(){
"data": {
"type": "post",
"attributes": {
"text": "Our summer collection just dropped!",
"url": "https://example.com/summer",
"alternative_text": "A pair of white Acme sneakers on a beach.",
"pinned": true,
"tags": [
"featured"
],
"media": [
"eyJfcmFpbHMiOnsiZGF0YSI6MTIzNDUsInB1ciI6ImJsb2JfaWQifX0=--0f1e2d3c4b5a69788796a5b4c3d2e1f0a9b8c7d6"
],
"author": {
"name": "Acme Inc.",
"username": "acme",
"url": "https://example.com"
}
}
}
}{
"data": {
"id": "OxZZQtuh5sXIKA",
"type": "post_create_request",
"attributes": {
"status": "pending"
}
}
}{
"errors": [
{
"title": "Invalid name",
"detail": "Name can't be blank",
"source": {
"pointer": "/data/attributes/name"
}
}
]
}Retrieve a list of public posts for a board
Returns the public posts of a public board. No authentication is required; if an Authorization header is sent, the access token must have the posts:read scope.
Parameters
tint_slugstringrequiredpathThe slug of the board, the unique part of its public URL.
filterobjectqueryFilters the posts. Only public posts are returned. Unless noted, list filters take a comma-separated list of values and match any of them.
sortArray<string>pinned-pinnedpublished_at-published_atlast_moderated_at-last_moderated_atrating-ratingscore-score-pinnedqueryA comma-separated list of fields to sort by. Prefix a field with - to sort in descending order. Ties are broken by publication time and ID. score sorts by relevance to filter[q].
includeArray<string>authorcta_associationscta_associations.ctaproduct_tagsproductsproducts.productrepliessocial_feedqueryA comma-separated list of related resources to include in the response.
objectqueryCursor pagination. Use page[size] to set the number of items per page. Cursors are opaque; don't build them yourself, follow the links.next and links.prev URLs from the previous response instead.
Response
A list of public posts. Without an access token, the public representation of posts is returned; with one, the authenticated representation is returned.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: posts:read
curl -X GET 'https://api.tintup.com/v2/tints/{tint_slug}/posts'const response = await fetch('https://api.tintup.com/v2/tints/{tint_slug}/posts', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.tintup.com/v2/tints/{tint_slug}/posts')
data = response.json(){
"data": [
{
"id": "9001",
"type": "post",
"attributes": {
"external_id": "17912345678901234",
"url": "https://www.instagram.com/p/C4xYz12AbCd/",
"title": null,
"text": "Loving my new Acme sneakers!",
"alternative_text": "A pair of white Acme sneakers on a beach.",
"published_at": "2025-03-14T16:42:07.000Z",
"highlighted": false,
"pinned": false,
"tags": [
"featured"
],
"carousel": false,
"media_type": "image",
"image_url": "https://cdn.example.com/posts/9001/media.jpg",
"video_url": null,
"attachment_id": "aHR0cHM6Ly9jZG4uZXhhbXBsZS5jb20vcG9zdHMvOTAwMS9tZWRpYS5qcGc=",
"author": {
"name": "Jane Doe",
"username": "janedoe",
"url": "https://example.com/janedoe",
"image_url": "https://cdn.example.com/avatars/janedoe.jpg",
"external_id": "17841400008460056",
"email": "jane.doe@example.com",
"phone": "+15555550123",
"remote_ip": "203.0.113.0"
},
"metadata": {
"language": "en",
"sentiment": "positive",
"image_nsfw": 0.02,
"image_phash": "d1c4f0e0b0a09080",
"image_sentiments": [
"happy"
],
"image_objects": [
"shoe",
"beach"
],
"image_objects_rekognition": [
"shoe",
"beach"
]
},
"language": "en",
"rating": 80,
"verified": null,
"incentivized": null,
"status_reasons": null,
"last_moderated_at": "2025-03-15T09:03:11.000Z",
"custom_field": null,
"sentiment": "positive",
"image_nsfw": 0.02,
"image_phash": null,
"image_sentiments": null,
"image_objects": [
"shoe",
"beach"
],
"hue_probability": null
},
"relationships": {
"social_feed": {
"data": {
"type": "social_feed",
"id": "311"
}
},
"tint": {
"data": {
"type": "tint",
"id": "42"
},
"links": {
"self": "https://api.tintup.com/v2/teams/1/tints/42"
}
},
"author": {
"data": {
"type": "author",
"id": "9001"
},
"meta": {
"included": false
}
},
"replies": {
"data": [
{
"type": "reply",
"id": "88"
}
],
"meta": {
"included": false
}
},
"products": {
"data": [
{
"type": "product_tag",
"id": "501"
}
],
"meta": {
"included": false
}
},
"product_tags": {
"data": [
{
"type": "product_tag",
"id": "501"
}
],
"meta": {
"included": false
}
},
"cta_associations": {
"data": [
{
"type": "cta_association",
"id": "64"
}
],
"meta": {
"included": false
}
},
"asset": {
"data": {
"type": "asset",
"id": "7300"
},
"meta": {
"included": false
}
},
"right_requests": {
"data": [
{
"type": "right_request",
"id": "210"
}
],
"meta": {
"included": false,
"status": "approved",
"status_expires_at": null
}
},
"siblings": {
"data": [
{
"type": "post",
"id": "9002"
}
]
}
}
}
],
"links": {
"self": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=2",
"first": "https://api.tintup.com/v2/teams/1/tints",
"next": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=3",
"prev": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=1"
}
}Create a public post
Asynchronously creates a post in the board's public post social feed. No authentication is required; if an Authorization header is sent, the access token must have the posts:write scope. The response is a post create request whose status can be checked using GET /v2/tints/{tint_slug}/posts/requests/{post_request_id}.
Body
The public post or review to create.
dataNewPublicPostrequiredThe public post or review to create. The validation rules depend on the settings of the board's public post or Ratings & Reviews social feed. Each URL in media_url creates a separate post; when several are sent, the posts are grouped as a carousel.
Parameters
tint_slugstringrequiredpathThe slug of the board, the unique part of its public URL.
Response
The post create request.
Unprocessable Entity. The request is missing required parameters or the resource is invalid.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: posts:write
curl -X POST 'https://api.tintup.com/v2/tints/{tint_slug}/posts' \
-H 'Content-Type: application/vnd.api+json' \
-d '{
"data": {
"type": "post",
"attributes": {
"type": "reviews",
"title": "Great everyday sneakers",
"text": "Super comfortable and true to size. Would buy again!",
"rating": 80,
"media_url": [
"https://cdn.example.com/uploads/sneakers.jpg"
],
"tags": [
"sku:ACME-SNK-001"
],
"author": {
"name": "Jane Doe",
"email": "jane.doe@example.com"
}
}
}
}'const response = await fetch('https://api.tintup.com/v2/tints/{tint_slug}/posts', {
method: 'POST',
headers: {
'Content-Type': 'application/vnd.api+json',
},
body: JSON.stringify({
"data": {
"type": "post",
"attributes": {
"type": "reviews",
"title": "Great everyday sneakers",
"text": "Super comfortable and true to size. Would buy again!",
"rating": 80,
"media_url": [
"https://cdn.example.com/uploads/sneakers.jpg"
],
"tags": [
"sku:ACME-SNK-001"
],
"author": {
"name": "Jane Doe",
"email": "jane.doe@example.com"
}
}
}
}),
});
const data = await response.json();import requests
payload = {
"data": {
"type": "post",
"attributes": {
"type": "reviews",
"title": "Great everyday sneakers",
"text": "Super comfortable and true to size. Would buy again!",
"rating": 80,
"media_url": [
"https://cdn.example.com/uploads/sneakers.jpg"
],
"tags": [
"sku:ACME-SNK-001"
],
"author": {
"name": "Jane Doe",
"email": "jane.doe@example.com"
}
}
}
}
response = requests.post('https://api.tintup.com/v2/tints/{tint_slug}/posts', json=payload)
data = response.json(){
"data": {
"type": "post",
"attributes": {
"type": "reviews",
"title": "Great everyday sneakers",
"text": "Super comfortable and true to size. Would buy again!",
"rating": 80,
"media_url": [
"https://cdn.example.com/uploads/sneakers.jpg"
],
"tags": [
"sku:ACME-SNK-001"
],
"author": {
"name": "Jane Doe",
"email": "jane.doe@example.com"
}
}
}
}{
"data": {
"id": "OxZZQtuh5sXIKA",
"type": "post_create_request",
"attributes": {
"status": "pending"
}
}
}{
"errors": [
{
"title": "Invalid name",
"detail": "Name can't be blank",
"source": {
"pointer": "/data/attributes/name"
}
}
]
}Check the status of a post create request
Returns the status of an asynchronous request created by POST /v2/tints/{tint_slug}/posts. No authentication is required; if an Authorization header is sent, the access token must have the posts:read scope.
Parameters
tint_slugstringrequiredpathThe slug of the board, the unique part of its public URL.
post_request_idstringrequiredpathThe ID of the post create request, returned when the post was submitted.
Response
The post create request.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: posts:read
curl -X GET 'https://api.tintup.com/v2/tints/{tint_slug}/posts/requests/{post_request_id}'const response = await fetch('https://api.tintup.com/v2/tints/{tint_slug}/posts/requests/{post_request_id}', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.tintup.com/v2/tints/{tint_slug}/posts/requests/{post_request_id}')
data = response.json(){
"data": {
"id": "OxZZQtuh5sXIKA",
"type": "post_create_request",
"attributes": {
"status": "pending"
}
}
}Create a post export request
Asynchronously exports posts. Once complete, a websocket message of type post_export_request containing the response is delivered to the user's private channel (private-user- followed by the user's ID). You may also poll the status of the request using the endpoint below.
Body
The export to request.
dataNewPostExportRequestrequiredThe export to request.
Parameters
team_idintegerrequiredpathThe ID of the team.
Response
The post export request.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: posts:read
curl -X POST 'https://api.tintup.com/v2/teams/{team_id}/posts/export/requests' \
-H 'Content-Type: application/vnd.api+json' \
-d '{
"data": {
"type": "post_export_request",
"attributes": {
"tint_id": 42
}
}
}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/posts/export/requests', {
method: 'POST',
headers: {
'Content-Type': 'application/vnd.api+json',
},
body: JSON.stringify({
"data": {
"type": "post_export_request",
"attributes": {
"tint_id": 42
}
}
}),
});
const data = await response.json();import requests
payload = {
"data": {
"type": "post_export_request",
"attributes": {
"tint_id": 42
}
}
}
response = requests.post('https://api.tintup.com/v2/teams/{team_id}/posts/export/requests', json=payload)
data = response.json(){
"data": {
"type": "post_export_request",
"attributes": {
"tint_id": 42
}
}
}{
"data": {
"id": "OxZZQtuh5sXIKA",
"type": "post_export_request",
"attributes": {
"status": "pending",
"url": null
},
"relationships": {
"tint": {
"data": {
"type": "tint",
"id": "42"
},
"meta": {
"included": false
}
},
"user": {
"data": {
"type": "user",
"id": "16891"
},
"meta": {
"included": false
}
}
},
"links": {
"self": "https://api.tintup.com/v2/teams/1/posts/export/requests/OxZZQtuh5sXIKA"
}
}
}Check the status of a post export request
Parameters
team_idintegerrequiredpathThe ID of the team.
post_export_request_idstringrequiredpathThe ID of the post export request.
Response
The post export request.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: posts:read
curl -X GET 'https://api.tintup.com/v2/teams/{team_id}/posts/export/requests/{post_export_request_id}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/posts/export/requests/{post_export_request_id}', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.tintup.com/v2/teams/{team_id}/posts/export/requests/{post_export_request_id}')
data = response.json(){
"data": {
"id": "OxZZQtuh5sXIKA",
"type": "post_export_request",
"attributes": {
"status": "pending",
"url": null
},
"relationships": {
"tint": {
"data": {
"type": "tint",
"id": "42"
},
"meta": {
"included": false
}
},
"user": {
"data": {
"type": "user",
"id": "16891"
},
"meta": {
"included": false
}
}
},
"links": {
"self": "https://api.tintup.com/v2/teams/1/posts/export/requests/OxZZQtuh5sXIKA"
}
}
}Replies
posts_repliesCreate a reply
Replies to a post. When the post's author has an email address and the social feed has an email template, the reply is also emailed to the author.
Body
The reply to create.
dataNewReplyrequiredThe reply to create.
Parameters
team_idintegerrequiredpathThe ID of the team.
includeArray<string>userqueryA comma-separated list of related resources to include in the response.
Response
The reply.
Unprocessable Entity. The request is missing required parameters or the resource is invalid.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: replies:write
curl -X POST 'https://api.tintup.com/v2/teams/{team_id}/replies' \
-H 'Content-Type: application/vnd.api+json' \
-d '{
"data": {
"type": "reply",
"attributes": {
"text": "Thank you for the kind review, Jane!",
"source": "public_post",
"external_id": "custom_public_1741970527000_4f3a2b1c9d8e",
"visibility": "active"
}
}
}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/replies', {
method: 'POST',
headers: {
'Content-Type': 'application/vnd.api+json',
},
body: JSON.stringify({
"data": {
"type": "reply",
"attributes": {
"text": "Thank you for the kind review, Jane!",
"source": "public_post",
"external_id": "custom_public_1741970527000_4f3a2b1c9d8e",
"visibility": "active"
}
}
}),
});
const data = await response.json();import requests
payload = {
"data": {
"type": "reply",
"attributes": {
"text": "Thank you for the kind review, Jane!",
"source": "public_post",
"external_id": "custom_public_1741970527000_4f3a2b1c9d8e",
"visibility": "active"
}
}
}
response = requests.post('https://api.tintup.com/v2/teams/{team_id}/replies', json=payload)
data = response.json(){
"data": {
"type": "reply",
"attributes": {
"text": "Thank you for the kind review, Jane!",
"source": "public_post",
"external_id": "custom_public_1741970527000_4f3a2b1c9d8e",
"visibility": "active"
}
}
}{
"data": {
"id": "88",
"type": "reply",
"attributes": {
"text": "Thank you for the kind review, Jane!",
"external_id": "custom_public_1741970527000_4f3a2b1c9d8e",
"visibility": "active",
"created_at": "2025-03-15T10:12:45.000Z",
"updated_at": "2025-03-15T10:12:45.000Z"
},
"relationships": {
"user": {
"data": {
"type": "user",
"id": "16891"
},
"meta": {
"included": false
}
}
}
}
}{
"errors": [
{
"title": "Invalid name",
"detail": "Name can't be blank",
"source": {
"pointer": "/data/attributes/name"
}
}
]
}Delete a reply
Deletes the reply.
Parameters
team_idintegerrequiredpathThe ID of the team.
reply_idintegerrequiredpathThe ID of the reply.
Response
No Content. The request succeeded and there is no response body.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: replies:write
curl -X DELETE 'https://api.tintup.com/v2/teams/{team_id}/replies/{reply_id}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/replies/{reply_id}', {
method: 'DELETE',
});
const data = await response.json();import requests
response = requests.delete('https://api.tintup.com/v2/teams/{team_id}/replies/{reply_id}')
data = response.json()Update a reply
Updates the reply.
Body
The reply changes.
dataReplyUpdaterequiredThe reply changes. Only text and visibility can be changed.
Parameters
team_idintegerrequiredpathThe ID of the team.
reply_idintegerrequiredpathThe ID of the reply.
Response
The reply.
Unprocessable Entity. The request is missing required parameters or the resource is invalid.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: replies:write
curl -X PATCH 'https://api.tintup.com/v2/teams/{team_id}/replies/{reply_id}' \
-H 'Content-Type: application/vnd.api+json' \
-d '{
"data": {
"id": "88",
"type": "reply",
"attributes": {
"visibility": "inactive"
}
}
}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/replies/{reply_id}', {
method: 'PATCH',
headers: {
'Content-Type': 'application/vnd.api+json',
},
body: JSON.stringify({
"data": {
"id": "88",
"type": "reply",
"attributes": {
"visibility": "inactive"
}
}
}),
});
const data = await response.json();import requests
payload = {
"data": {
"id": "88",
"type": "reply",
"attributes": {
"visibility": "inactive"
}
}
}
response = requests.patch('https://api.tintup.com/v2/teams/{team_id}/replies/{reply_id}', json=payload)
data = response.json(){
"data": {
"id": "88",
"type": "reply",
"attributes": {
"visibility": "inactive"
}
}
}{
"data": {
"id": "88",
"type": "reply",
"attributes": {
"text": "Thank you for the kind review, Jane!",
"external_id": "custom_public_1741970527000_4f3a2b1c9d8e",
"visibility": "active",
"created_at": "2025-03-15T10:12:45.000Z",
"updated_at": "2025-03-15T10:12:45.000Z"
},
"relationships": {
"user": {
"data": {
"type": "user",
"id": "16891"
},
"meta": {
"included": false
}
}
}
}
}{
"errors": [
{
"title": "Invalid name",
"detail": "Name can't be blank",
"source": {
"pointer": "/data/attributes/name"
}
}
]
}Saved Filters
saved_filtersRetrieve a list of saved filters
Parameters
team_idintegerrequiredpathThe ID of the team.
tint_idintegerrequiredpathThe ID of the board.
includeArray<string>cta_associationscta_associations.ctatintqueryA comma-separated list of related resources to include in the response.
Response
A list of the board's saved filters. The list isn't paginated.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: saved_filters:read
curl -X GET 'https://api.tintup.com/v2/teams/{team_id}/tints/{tint_id}/saved_filters'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/tints/{tint_id}/saved_filters', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.tintup.com/v2/teams/{team_id}/tints/{tint_id}/saved_filters')
data = response.json(){
"data": [
{
"id": "15",
"type": "saved_filter",
"attributes": {
"name": "Summer favorites",
"filter": {
"q": "sneakers",
"status": [
"public",
"recurring"
],
"published_at": {
"$gte": "2025-06-01T00:00:00.000Z",
"$lte": "2025-08-31T23:59:59.000Z"
},
"type": [
"instagram_business",
"tiktok"
],
"social_feed_id": [
"311",
"312"
],
"media_type": [
"image",
"video"
],
"language": [
"en",
"es"
],
"sentiment": [
"positive"
],
"image_object": [
"shoe",
"beach"
],
"tag": [
"featured"
],
"product_id": [
"501"
],
"right_request_status": [
"approved"
],
"right_request_status_expires_at": "+2592000",
"rating": {
"$gte": 60,
"$lte": 100,
"$range": "80-100"
},
"highlighted": true,
"pinned": false,
"incentivized": false
},
"created_at": "2025-03-14T16:42:07.000Z",
"updated_at": "2025-03-14T16:42:07.000Z"
},
"relationships": {
"tint": {
"data": {
"type": "tint",
"id": "42"
},
"meta": {
"included": false
}
},
"cta_associations": {
"data": [
{
"type": "cta_association",
"id": "64"
}
],
"meta": {
"included": false
}
}
}
}
]
}Create a saved filter
Body
The saved filter to create.
dataNewSavedFilterrequiredThe saved filter to create.
Parameters
team_idintegerrequiredpathThe ID of the team.
tint_idintegerrequiredpathThe ID of the board.
includeArray<string>cta_associationscta_associations.ctatintqueryA comma-separated list of related resources to include in the response.
Response
The saved filter.
Unprocessable Entity. The request is missing required parameters or the resource is invalid.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: saved_filters:write
curl -X POST 'https://api.tintup.com/v2/teams/{team_id}/tints/{tint_id}/saved_filters' \
-H 'Content-Type: application/vnd.api+json' \
-d '{
"data": {
"type": "saved_filter",
"attributes": {
"name": "Summer favorites",
"filter": {
"q": "sneakers",
"status": [
"public",
"recurring"
],
"type": [
"instagram_business",
"tiktok"
],
"media_type": [
"image"
],
"published_at": {
"$gte": "2025-06-01T00:00:00.000Z",
"$lte": "2025-08-31T23:59:59.000Z"
}
}
}
}
}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/tints/{tint_id}/saved_filters', {
method: 'POST',
headers: {
'Content-Type': 'application/vnd.api+json',
},
body: JSON.stringify({
"data": {
"type": "saved_filter",
"attributes": {
"name": "Summer favorites",
"filter": {
"q": "sneakers",
"status": [
"public",
"recurring"
],
"type": [
"instagram_business",
"tiktok"
],
"media_type": [
"image"
],
"published_at": {
"$gte": "2025-06-01T00:00:00.000Z",
"$lte": "2025-08-31T23:59:59.000Z"
}
}
}
}
}),
});
const data = await response.json();import requests
payload = {
"data": {
"type": "saved_filter",
"attributes": {
"name": "Summer favorites",
"filter": {
"q": "sneakers",
"status": [
"public",
"recurring"
],
"type": [
"instagram_business",
"tiktok"
],
"media_type": [
"image"
],
"published_at": {
"$gte": "2025-06-01T00:00:00.000Z",
"$lte": "2025-08-31T23:59:59.000Z"
}
}
}
}
}
response = requests.post('https://api.tintup.com/v2/teams/{team_id}/tints/{tint_id}/saved_filters', json=payload)
data = response.json(){
"data": {
"type": "saved_filter",
"attributes": {
"name": "Summer favorites",
"filter": {
"q": "sneakers",
"status": [
"public",
"recurring"
],
"type": [
"instagram_business",
"tiktok"
],
"media_type": [
"image"
],
"published_at": {
"$gte": "2025-06-01T00:00:00.000Z",
"$lte": "2025-08-31T23:59:59.000Z"
}
}
}
}
}{
"data": {
"id": "15",
"type": "saved_filter",
"attributes": {
"name": "Summer favorites",
"filter": {
"q": "sneakers",
"status": [
"public",
"recurring"
],
"published_at": {
"$gte": "2025-06-01T00:00:00.000Z",
"$lte": "2025-08-31T23:59:59.000Z"
},
"type": [
"instagram_business",
"tiktok"
],
"social_feed_id": [
"311",
"312"
],
"media_type": [
"image",
"video"
],
"language": [
"en",
"es"
],
"sentiment": [
"positive"
],
"image_object": [
"shoe",
"beach"
],
"tag": [
"featured"
],
"product_id": [
"501"
],
"right_request_status": [
"approved"
],
"right_request_status_expires_at": "+2592000",
"rating": {
"$gte": 60,
"$lte": 100,
"$range": "80-100"
},
"highlighted": true,
"pinned": false,
"incentivized": false
},
"created_at": "2025-03-14T16:42:07.000Z",
"updated_at": "2025-03-14T16:42:07.000Z"
},
"relationships": {
"tint": {
"data": {
"type": "tint",
"id": "42"
},
"meta": {
"included": false
}
},
"cta_associations": {
"data": [
{
"type": "cta_association",
"id": "64"
}
],
"meta": {
"included": false
}
}
}
}
}{
"errors": [
{
"title": "Invalid name",
"detail": "Name can't be blank",
"source": {
"pointer": "/data/attributes/name"
}
}
]
}Retrieve a saved filter
Parameters
team_idintegerrequiredpathThe ID of the team.
tint_idintegerrequiredpathThe ID of the board.
saved_filter_idintegerrequiredpathThe ID of the saved filter.
includeArray<string>cta_associationscta_associations.ctatintqueryA comma-separated list of related resources to include in the response.
Response
The saved filter.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: saved_filters:read
curl -X GET 'https://api.tintup.com/v2/teams/{team_id}/tints/{tint_id}/saved_filters/{saved_filter_id}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/tints/{tint_id}/saved_filters/{saved_filter_id}', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.tintup.com/v2/teams/{team_id}/tints/{tint_id}/saved_filters/{saved_filter_id}')
data = response.json(){
"data": {
"id": "15",
"type": "saved_filter",
"attributes": {
"name": "Summer favorites",
"filter": {
"q": "sneakers",
"status": [
"public",
"recurring"
],
"published_at": {
"$gte": "2025-06-01T00:00:00.000Z",
"$lte": "2025-08-31T23:59:59.000Z"
},
"type": [
"instagram_business",
"tiktok"
],
"social_feed_id": [
"311",
"312"
],
"media_type": [
"image",
"video"
],
"language": [
"en",
"es"
],
"sentiment": [
"positive"
],
"image_object": [
"shoe",
"beach"
],
"tag": [
"featured"
],
"product_id": [
"501"
],
"right_request_status": [
"approved"
],
"right_request_status_expires_at": "+2592000",
"rating": {
"$gte": 60,
"$lte": 100,
"$range": "80-100"
},
"highlighted": true,
"pinned": false,
"incentivized": false
},
"created_at": "2025-03-14T16:42:07.000Z",
"updated_at": "2025-03-14T16:42:07.000Z"
},
"relationships": {
"tint": {
"data": {
"type": "tint",
"id": "42"
},
"meta": {
"included": false
}
},
"cta_associations": {
"data": [
{
"type": "cta_association",
"id": "64"
}
],
"meta": {
"included": false
}
}
}
}
}Delete a saved filter
Parameters
team_idintegerrequiredpathThe ID of the team.
tint_idintegerrequiredpathThe ID of the board.
saved_filter_idintegerrequiredpathThe ID of the saved filter.
Response
No Content. The request succeeded and there is no response body.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: saved_filters:write
curl -X DELETE 'https://api.tintup.com/v2/teams/{team_id}/tints/{tint_id}/saved_filters/{saved_filter_id}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/tints/{tint_id}/saved_filters/{saved_filter_id}', {
method: 'DELETE',
});
const data = await response.json();import requests
response = requests.delete('https://api.tintup.com/v2/teams/{team_id}/tints/{tint_id}/saved_filters/{saved_filter_id}')
data = response.json()Update a saved filter
Body
The saved filter changes.
dataSavedFilterUpdaterequiredThe saved filter changes. The id is optional; the saved filter is identified by the URL. The filter is always replaced: send the complete criteria, as the update fails if filter is missing or empty.
Parameters
team_idintegerrequiredpathThe ID of the team.
tint_idintegerrequiredpathThe ID of the board.
saved_filter_idintegerrequiredpathThe ID of the saved filter.
Response
The saved filter.
Unprocessable Entity. The request is missing required parameters or the resource is invalid.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: saved_filters:write
curl -X PATCH 'https://api.tintup.com/v2/teams/{team_id}/tints/{tint_id}/saved_filters/{saved_filter_id}' \
-H 'Content-Type: application/vnd.api+json' \
-d '{
"data": {
"id": "15",
"type": "saved_filter",
"attributes": {
"name": "Summer favorites (images)",
"filter": {
"q": "sneakers",
"media_type": [
"image"
]
}
}
}
}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/tints/{tint_id}/saved_filters/{saved_filter_id}', {
method: 'PATCH',
headers: {
'Content-Type': 'application/vnd.api+json',
},
body: JSON.stringify({
"data": {
"id": "15",
"type": "saved_filter",
"attributes": {
"name": "Summer favorites (images)",
"filter": {
"q": "sneakers",
"media_type": [
"image"
]
}
}
}
}),
});
const data = await response.json();import requests
payload = {
"data": {
"id": "15",
"type": "saved_filter",
"attributes": {
"name": "Summer favorites (images)",
"filter": {
"q": "sneakers",
"media_type": [
"image"
]
}
}
}
}
response = requests.patch('https://api.tintup.com/v2/teams/{team_id}/tints/{tint_id}/saved_filters/{saved_filter_id}', json=payload)
data = response.json(){
"data": {
"id": "15",
"type": "saved_filter",
"attributes": {
"name": "Summer favorites (images)",
"filter": {
"q": "sneakers",
"media_type": [
"image"
]
}
}
}
}{
"data": {
"id": "15",
"type": "saved_filter",
"attributes": {
"name": "Summer favorites",
"filter": {
"q": "sneakers",
"status": [
"public",
"recurring"
],
"published_at": {
"$gte": "2025-06-01T00:00:00.000Z",
"$lte": "2025-08-31T23:59:59.000Z"
},
"type": [
"instagram_business",
"tiktok"
],
"social_feed_id": [
"311",
"312"
],
"media_type": [
"image",
"video"
],
"language": [
"en",
"es"
],
"sentiment": [
"positive"
],
"image_object": [
"shoe",
"beach"
],
"tag": [
"featured"
],
"product_id": [
"501"
],
"right_request_status": [
"approved"
],
"right_request_status_expires_at": "+2592000",
"rating": {
"$gte": 60,
"$lte": 100,
"$range": "80-100"
},
"highlighted": true,
"pinned": false,
"incentivized": false
},
"created_at": "2025-03-14T16:42:07.000Z",
"updated_at": "2025-03-14T16:42:07.000Z"
},
"relationships": {
"tint": {
"data": {
"type": "tint",
"id": "42"
},
"meta": {
"included": false
}
},
"cta_associations": {
"data": [
{
"type": "cta_association",
"id": "64"
}
],
"meta": {
"included": false
}
}
}
}
}{
"errors": [
{
"title": "Invalid name",
"detail": "Name can't be blank",
"source": {
"pointer": "/data/attributes/name"
}
}
]
}TINTmix
group_tintmixMixes
mixesRetrieve a public mix
This endpoint is public and doesn't require an access token.
Parameters
mix_idintegerrequiredpathThe ID of the mix.
Response
The mix. Without an access token, the public representation is returned; with one, the full representation is returned.
curl -X GET 'https://api.tintup.com/v2/mixes/{mix_id}'const response = await fetch('https://api.tintup.com/v2/mixes/{mix_id}', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.tintup.com/v2/mixes/{mix_id}')
data = response.json(){
"data": {
"id": "12",
"type": "mix",
"attributes": {
"scenes": [
{
"layout": "horizontal",
"template": "\"logo feed\"",
"areas": {
"logo": [
{
"type": "image",
"duration": 10,
"name": "Acme logo",
"url": "https://cdn.example.com/mixes/acme-logo.png"
}
],
"feed": [
{
"type": "tint",
"duration": 30,
"name": "Summer campaign board",
"tint_id": 42,
"personalization_id": 7
}
]
}
}
]
}
}
}Retrieve a list of mixes
Returns the mixes you have access to.
Parameters
team_idintegerrequiredpathThe ID of the team.
filterobjectqueryFilters the mixes.
pageobjectqueryOffset pagination. Use page[size] to set the number of items per page and page[number] to select a page. The response's links object contains ready-to-use URLs for the next and previous pages.
Response
A list of mixes.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: mixes:read
curl -X GET 'https://api.tintup.com/v2/teams/{team_id}/mixes'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/mixes', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.tintup.com/v2/teams/{team_id}/mixes')
data = response.json(){
"data": [
{
"id": "12",
"type": "mix",
"attributes": {
"name": "Lobby screen",
"scenes": [
{
"layout": "horizontal",
"template": "\"logo feed\"",
"areas": {
"logo": [
{
"type": "image",
"duration": 10,
"name": "Acme logo",
"url": "https://cdn.example.com/mixes/acme-logo.png"
}
],
"feed": [
{
"type": "tint",
"duration": 30,
"name": "Summer campaign board",
"tint_id": 42,
"personalization_id": 7
}
]
}
}
],
"created_at": "2025-02-10T15:00:00.000Z",
"updated_at": "2025-03-14T16:42:07.000Z"
}
}
],
"links": {
"self": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=2",
"first": "https://api.tintup.com/v2/teams/1/tints",
"next": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=3",
"prev": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=1"
}
}Create a mix
Fails with 402 when the team has reached its plan's mix limit.
Body
The mix to create.
dataNewMixrequiredThe mix to create.
Parameters
team_idintegerrequiredpathThe ID of the team.
Response
The mix.
Payment Required. The team already has as many mixes as its plan allows.
Unprocessable Entity. The request is missing required parameters or the resource is invalid.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: mixes:write
curl -X POST 'https://api.tintup.com/v2/teams/{team_id}/mixes' \
-H 'Content-Type: application/vnd.api+json' \
-d '{
"data": {
"type": "mix",
"attributes": {
"name": "Lobby screen",
"scenes": [
{
"layout": "horizontal",
"template": "\"logo feed\"",
"areas": {
"logo": [
{
"type": "image",
"duration": 10,
"name": "Acme logo",
"url": "https://cdn.example.com/mixes/acme-logo.png"
}
],
"feed": [
{
"type": "tint",
"duration": 30,
"name": "Summer campaign board",
"tint_id": 42,
"personalization_id": 7
}
]
}
}
]
}
}
}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/mixes', {
method: 'POST',
headers: {
'Content-Type': 'application/vnd.api+json',
},
body: JSON.stringify({
"data": {
"type": "mix",
"attributes": {
"name": "Lobby screen",
"scenes": [
{
"layout": "horizontal",
"template": "\"logo feed\"",
"areas": {
"logo": [
{
"type": "image",
"duration": 10,
"name": "Acme logo",
"url": "https://cdn.example.com/mixes/acme-logo.png"
}
],
"feed": [
{
"type": "tint",
"duration": 30,
"name": "Summer campaign board",
"tint_id": 42,
"personalization_id": 7
}
]
}
}
]
}
}
}),
});
const data = await response.json();import requests
payload = {
"data": {
"type": "mix",
"attributes": {
"name": "Lobby screen",
"scenes": [
{
"layout": "horizontal",
"template": "\"logo feed\"",
"areas": {
"logo": [
{
"type": "image",
"duration": 10,
"name": "Acme logo",
"url": "https://cdn.example.com/mixes/acme-logo.png"
}
],
"feed": [
{
"type": "tint",
"duration": 30,
"name": "Summer campaign board",
"tint_id": 42,
"personalization_id": 7
}
]
}
}
]
}
}
}
response = requests.post('https://api.tintup.com/v2/teams/{team_id}/mixes', json=payload)
data = response.json(){
"data": {
"type": "mix",
"attributes": {
"name": "Lobby screen",
"scenes": [
{
"layout": "horizontal",
"template": "\"logo feed\"",
"areas": {
"logo": [
{
"type": "image",
"duration": 10,
"name": "Acme logo",
"url": "https://cdn.example.com/mixes/acme-logo.png"
}
],
"feed": [
{
"type": "tint",
"duration": 30,
"name": "Summer campaign board",
"tint_id": 42,
"personalization_id": 7
}
]
}
}
]
}
}
}{
"data": {
"id": "12",
"type": "mix",
"attributes": {
"name": "Lobby screen",
"scenes": [
{
"layout": "horizontal",
"template": "\"logo feed\"",
"areas": {
"logo": [
{
"type": "image",
"duration": 10,
"name": "Acme logo",
"url": "https://cdn.example.com/mixes/acme-logo.png"
}
],
"feed": [
{
"type": "tint",
"duration": 30,
"name": "Summer campaign board",
"tint_id": 42,
"personalization_id": 7
}
]
}
}
],
"created_at": "2025-02-10T15:00:00.000Z",
"updated_at": "2025-03-14T16:42:07.000Z"
}
}
}{
"errors": [
{
"code": "4020001",
"title": "Payment Required",
"detail": "You have exceeded your plan's limit of 5",
"status": "402"
}
]
}{
"errors": [
{
"title": "Invalid name",
"detail": "Name can't be blank",
"source": {
"pointer": "/data/attributes/name"
}
}
]
}Delete multiple mixes
Deletes several mixes at once.
Body
The mixes to delete, each identified by its id.
dataArray<MixBulkDelete>requiredParameters
team_idintegerrequiredpathThe ID of the team.
Response
No Content. The request succeeded and there is no response body.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: mixes:write
curl -X DELETE 'https://api.tintup.com/v2/teams/{team_id}/mixes' \
-H 'Content-Type: application/vnd.api+json; ext=bulk' \
-d '{
"data": [
{
"id": "12",
"type": "mix"
},
{
"id": "13",
"type": "mix"
}
]
}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/mixes', {
method: 'DELETE',
headers: {
'Content-Type': 'application/vnd.api+json; ext=bulk',
},
body: JSON.stringify({
"data": [
{
"id": "12",
"type": "mix"
},
{
"id": "13",
"type": "mix"
}
]
}),
});
const data = await response.json();import requests
payload = {
"data": [
{
"id": "12",
"type": "mix"
},
{
"id": "13",
"type": "mix"
}
]
}
response = requests.delete('https://api.tintup.com/v2/teams/{team_id}/mixes', json=payload)
data = response.json(){
"data": [
{
"id": "12",
"type": "mix"
},
{
"id": "13",
"type": "mix"
}
]
}Retrieve a mix
Retrieves one of the team's mixes.
Parameters
team_idintegerrequiredpathThe ID of the team.
mix_idintegerrequiredpathThe ID of the mix.
Response
The mix.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: mixes:read
curl -X GET 'https://api.tintup.com/v2/teams/{team_id}/mixes/{mix_id}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/mixes/{mix_id}', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.tintup.com/v2/teams/{team_id}/mixes/{mix_id}')
data = response.json(){
"data": {
"id": "12",
"type": "mix",
"attributes": {
"name": "Lobby screen",
"scenes": [
{
"layout": "horizontal",
"template": "\"logo feed\"",
"areas": {
"logo": [
{
"type": "image",
"duration": 10,
"name": "Acme logo",
"url": "https://cdn.example.com/mixes/acme-logo.png"
}
],
"feed": [
{
"type": "tint",
"duration": 30,
"name": "Summer campaign board",
"tint_id": 42,
"personalization_id": 7
}
]
}
}
],
"created_at": "2025-02-10T15:00:00.000Z",
"updated_at": "2025-03-14T16:42:07.000Z"
}
}
}Delete a mix
Deletes the mix.
Parameters
team_idintegerrequiredpathThe ID of the team.
mix_idintegerrequiredpathThe ID of the mix.
Response
No Content. The request succeeded and there is no response body.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: mixes:write
curl -X DELETE 'https://api.tintup.com/v2/teams/{team_id}/mixes/{mix_id}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/mixes/{mix_id}', {
method: 'DELETE',
});
const data = await response.json();import requests
response = requests.delete('https://api.tintup.com/v2/teams/{team_id}/mixes/{mix_id}')
data = response.json()Update a mix
Updates the mix.
Body
The mix changes.
dataMixUpdaterequiredThe mix changes. The id is optional; the mix is identified by the URL. scenes replaces all existing scenes.
Parameters
team_idintegerrequiredpathThe ID of the team.
mix_idintegerrequiredpathThe ID of the mix.
Response
The mix.
Unprocessable Entity. The request is missing required parameters or the resource is invalid.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: mixes:write
curl -X PATCH 'https://api.tintup.com/v2/teams/{team_id}/mixes/{mix_id}' \
-H 'Content-Type: application/vnd.api+json' \
-d '{
"data": {
"id": "12",
"type": "mix",
"attributes": {
"name": "Lobby screen (summer)"
}
}
}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/mixes/{mix_id}', {
method: 'PATCH',
headers: {
'Content-Type': 'application/vnd.api+json',
},
body: JSON.stringify({
"data": {
"id": "12",
"type": "mix",
"attributes": {
"name": "Lobby screen (summer)"
}
}
}),
});
const data = await response.json();import requests
payload = {
"data": {
"id": "12",
"type": "mix",
"attributes": {
"name": "Lobby screen (summer)"
}
}
}
response = requests.patch('https://api.tintup.com/v2/teams/{team_id}/mixes/{mix_id}', json=payload)
data = response.json(){
"data": {
"id": "12",
"type": "mix",
"attributes": {
"name": "Lobby screen (summer)"
}
}
}{
"data": {
"id": "12",
"type": "mix",
"attributes": {
"name": "Lobby screen",
"scenes": [
{
"layout": "horizontal",
"template": "\"logo feed\"",
"areas": {
"logo": [
{
"type": "image",
"duration": 10,
"name": "Acme logo",
"url": "https://cdn.example.com/mixes/acme-logo.png"
}
],
"feed": [
{
"type": "tint",
"duration": 30,
"name": "Summer campaign board",
"tint_id": 42,
"personalization_id": 7
}
]
}
}
],
"created_at": "2025-02-10T15:00:00.000Z",
"updated_at": "2025-03-14T16:42:07.000Z"
}
}
}{
"errors": [
{
"title": "Invalid name",
"detail": "Name can't be blank",
"source": {
"pointer": "/data/attributes/name"
}
}
]
}UGC Studio
group_ugc_studioAssets
assetsRetrieve a list of assets
Returns the team's assets that are in a collection the user has access to or in no collection. Returns 503 while search is temporarily unavailable.
Parameters
team_idintegerrequiredpathThe ID of the team.
pageobjectqueryOffset pagination. Use page[size] to set the number of items per page and page[number] to select a page. The response's links object contains ready-to-use URLs for the next and previous pages.
includeArray<string>collectionsimported_frommediateamqueryA comma-separated list of related resources to include in the response.
sortArray<string>id-idcreated_at-created_atupdated_at-updated_atsize-size-idqueryA comma-separated list of fields to sort by. Prefix a field with - to sort in descending order.
filterobjectqueryFilters that accept multiple values take a comma-separated list.
Response
A list of assets.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Service Unavailable. Search is temporarily unavailable; retry later.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: assets:read
curl -X GET 'https://api.tintup.com/v2/teams/{team_id}/assets'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/assets', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.tintup.com/v2/teams/{team_id}/assets')
data = response.json(){
"data": [
{
"id": "190245",
"type": "asset",
"attributes": {
"created_at": "2025-03-10T09:15:32.000Z",
"updated_at": "2025-03-14T16:42:07.000Z",
"status": "active",
"source": "branded",
"name": "Beach picnic with the Acme cooler",
"description": "Customer photo submitted during the summer campaign.",
"alternative_text": "Two friends sitting on a beach towel next to a red cooler.",
"caption": "Two friends sitting on a beach towel next to a red cooler.",
"tags": [
"spring-launch",
"ugc"
],
"objects": [
"beach",
"cooler",
"person"
],
"emotions": [
"happy"
],
"infections": null,
"licenses": false,
"sfw": true,
"insights": null,
"imported_from_data": {},
"source_url": "https://cdn.example.com/uploads/beach-picnic.jpg",
"expanded_url": "https://cdn.example.com/uploads/beach-picnic.jpg",
"download_url": "https://cdn.example.com/uploads/beach-picnic.jpg",
"url": "https://media.example.com/assets/190245/beach-picnic.jpg",
"thumbnail_url": "https://media.example.com/assets/190245/thumbnail.jpg",
"mime_type": "image/jpeg",
"size": 2483910,
"dimensions": [
1080,
1350
],
"duration": null,
"author": null,
"text": null,
"post_title": null,
"post_text": null
},
"relationships": {
"media": {
"data": null
},
"person": {
"data": {
"type": "person",
"id": null
}
},
"team": {
"data": {
"type": "team",
"id": "212"
},
"links": {
"self": "https://api.tintup.com/v2/teams/212"
}
},
"collections": {
"data": [
{
"type": "collection",
"id": "48"
}
],
"meta": {
"included": false
}
},
"imported_from": {
"data": {
"type": "right_request",
"id": "7710"
},
"meta": {
"included": false
}
},
"variants": {
"data": [
{
"type": "variant",
"id": "190245"
}
],
"meta": {
"total": 1
}
}
},
"links": {
"self": "https://api.tintup.com/v2/teams/212/assets/190245"
}
}
],
"links": {
"self": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=2",
"first": "https://api.tintup.com/v2/teams/1/tints",
"next": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=3",
"prev": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=1"
},
"meta": {
"aggregations": {
"objects": {
"beach": 18,
"person": 42
},
"sources": {
"branded": 120,
"instagram_business": 64
},
"mime_types": {
"image": 170,
"video": 14
},
"tags": {
"spring-launch": 31,
"ugc": 77
},
"emotions": {
"happy": 25
}
}
}
}{
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}Create assets
Creates one or more assets asynchronously. Once complete, a websocket message of type asset_bulk_create_request is delivered to the team's private channel (private-team- followed by the team's ID) with the request's id and final status. Creation fails when the plan's limit of uploaded assets is reached.
Body
One asset, or several assets using the bulk extension. If any asset is invalid, none are created and a 422 is returned.
application/vnd.api+json; ext=bulkobjectdataArray<NewAsset>requiredapplication/vnd.api+jsonobjectdataNewAssetrequiredSpecify either source_url or media. The file is downloaded and analyzed asynchronously, and counts toward the plan's limit of uploaded assets.
Parameters
team_idintegerrequiredpathThe ID of the team.
Response
Accepted. The assets are being created.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Unprocessable Entity. The request is missing required parameters or the resource is invalid.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: assets:write
curl -X POST 'https://api.tintup.com/v2/teams/{team_id}/assets' \
-H 'Content-Type: application/vnd.api+json; ext=bulk' \
-d '{
"data": [
{
"type": "asset",
"attributes": {
"status": "active",
"name": "Beach picnic with the Acme cooler",
"title": "Beach picnic with the Acme cooler",
"description": "Customer photo submitted during the summer campaign.",
"alternative_text": "Two friends sitting on a beach towel next to a red cooler.",
"tags": [
"spring-launch",
"ugc"
],
"collection_ids": [
48,
52
],
"source_url": "https://cdn.example.com/uploads/beach-picnic.jpg",
"media": "eyJfcmFpbHMiOnsiZGF0YSI6ODgyMTUsInB1ciI6ImJsb2JfaWQifX0=--1c3e5a7b9d2f4a6c8e0b1d3f5a7c9e2b4d6f8a0c",
"parent_id": 190233
}
}
]
}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/assets', {
method: 'POST',
headers: {
'Content-Type': 'application/vnd.api+json; ext=bulk',
},
body: JSON.stringify({
"data": [
{
"type": "asset",
"attributes": {
"status": "active",
"name": "Beach picnic with the Acme cooler",
"title": "Beach picnic with the Acme cooler",
"description": "Customer photo submitted during the summer campaign.",
"alternative_text": "Two friends sitting on a beach towel next to a red cooler.",
"tags": [
"spring-launch",
"ugc"
],
"collection_ids": [
48,
52
],
"source_url": "https://cdn.example.com/uploads/beach-picnic.jpg",
"media": "eyJfcmFpbHMiOnsiZGF0YSI6ODgyMTUsInB1ciI6ImJsb2JfaWQifX0=--1c3e5a7b9d2f4a6c8e0b1d3f5a7c9e2b4d6f8a0c",
"parent_id": 190233
}
}
]
}),
});
const data = await response.json();import requests
payload = {
"data": [
{
"type": "asset",
"attributes": {
"status": "active",
"name": "Beach picnic with the Acme cooler",
"title": "Beach picnic with the Acme cooler",
"description": "Customer photo submitted during the summer campaign.",
"alternative_text": "Two friends sitting on a beach towel next to a red cooler.",
"tags": [
"spring-launch",
"ugc"
],
"collection_ids": [
48,
52
],
"source_url": "https://cdn.example.com/uploads/beach-picnic.jpg",
"media": "eyJfcmFpbHMiOnsiZGF0YSI6ODgyMTUsInB1ciI6ImJsb2JfaWQifX0=--1c3e5a7b9d2f4a6c8e0b1d3f5a7c9e2b4d6f8a0c",
"parent_id": 190233
}
}
]
}
response = requests.post('https://api.tintup.com/v2/teams/{team_id}/assets', json=payload)
data = response.json(){
"data": [
{
"type": "asset",
"attributes": {
"status": "active",
"name": "Beach picnic with the Acme cooler",
"title": "Beach picnic with the Acme cooler",
"description": "Customer photo submitted during the summer campaign.",
"alternative_text": "Two friends sitting on a beach towel next to a red cooler.",
"tags": [
"spring-launch",
"ugc"
],
"collection_ids": [
48,
52
],
"source_url": "https://cdn.example.com/uploads/beach-picnic.jpg",
"media": "eyJfcmFpbHMiOnsiZGF0YSI6ODgyMTUsInB1ciI6ImJsb2JfaWQifX0=--1c3e5a7b9d2f4a6c8e0b1d3f5a7c9e2b4d6f8a0c",
"parent_id": 190233
}
}
]
}{
"data": {
"type": "asset",
"attributes": {
"status": "active",
"name": "Beach picnic with the Acme cooler",
"title": "Beach picnic with the Acme cooler",
"description": "Customer photo submitted during the summer campaign.",
"alternative_text": "Two friends sitting on a beach towel next to a red cooler.",
"tags": [
"spring-launch",
"ugc"
],
"collection_ids": [
48,
52
],
"source_url": "https://cdn.example.com/uploads/beach-picnic.jpg",
"media": "eyJfcmFpbHMiOnsiZGF0YSI6ODgyMTUsInB1ciI6ImJsb2JfaWQifX0=--1c3e5a7b9d2f4a6c8e0b1d3f5a7c9e2b4d6f8a0c",
"parent_id": 190233
}
}
}{
"data": {
"id": "3f9c1a7e5b2d4c86a0e1",
"type": "asset_bulk_create_request",
"attributes": {
"status": "pending"
}
}
}{
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"title": "Invalid name",
"detail": "Name can't be blank",
"source": {
"pointer": "/data/attributes/name"
}
}
]
}Delete multiple assets
Deletes several assets at once.
Body
The assets to delete. Assets that don't exist or that the user can't access are skipped.
dataArray<AssetDelete>requiredParameters
team_idintegerrequiredpathThe ID of the team.
Response
No Content. The request succeeded and there is no response body.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: assets:write
curl -X DELETE 'https://api.tintup.com/v2/teams/{team_id}/assets' \
-H 'Content-Type: application/vnd.api+json; ext=bulk' \
-d '{
"data": [
{
"id": "190245",
"type": "asset"
}
]
}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/assets', {
method: 'DELETE',
headers: {
'Content-Type': 'application/vnd.api+json; ext=bulk',
},
body: JSON.stringify({
"data": [
{
"id": "190245",
"type": "asset"
}
]
}),
});
const data = await response.json();import requests
payload = {
"data": [
{
"id": "190245",
"type": "asset"
}
]
}
response = requests.delete('https://api.tintup.com/v2/teams/{team_id}/assets', json=payload)
data = response.json(){
"data": [
{
"id": "190245",
"type": "asset"
}
]
}{
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}Update multiple assets
Updates several assets at once. If any asset is invalid, none are updated.
Body
The assets to update and the attributes to change for each. Assets that don't exist or that the user can't access are skipped.
dataArray<AssetBulkUpdate>requiredParameters
team_idintegerrequiredpathThe ID of the team.
includeArray<string>collectionsimported_frommediateamqueryA comma-separated list of related resources to include in the response.
Response
The updated assets.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Unprocessable Entity. The request is missing required parameters or the resource is invalid.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: assets:write
curl -X PATCH 'https://api.tintup.com/v2/teams/{team_id}/assets' \
-H 'Content-Type: application/vnd.api+json; ext=bulk' \
-d '{
"data": [
{
"id": "190245",
"type": "asset",
"attributes": {
"status": "active",
"name": "Beach picnic with the Acme cooler",
"title": "Beach picnic with the Acme cooler",
"description": "Customer photo submitted during the summer campaign.",
"alternative_text": "Two friends sitting on a beach towel next to a red cooler.",
"tags": [
"spring-launch",
"ugc"
],
"collection_ids": [
48,
52
]
}
}
]
}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/assets', {
method: 'PATCH',
headers: {
'Content-Type': 'application/vnd.api+json; ext=bulk',
},
body: JSON.stringify({
"data": [
{
"id": "190245",
"type": "asset",
"attributes": {
"status": "active",
"name": "Beach picnic with the Acme cooler",
"title": "Beach picnic with the Acme cooler",
"description": "Customer photo submitted during the summer campaign.",
"alternative_text": "Two friends sitting on a beach towel next to a red cooler.",
"tags": [
"spring-launch",
"ugc"
],
"collection_ids": [
48,
52
]
}
}
]
}),
});
const data = await response.json();import requests
payload = {
"data": [
{
"id": "190245",
"type": "asset",
"attributes": {
"status": "active",
"name": "Beach picnic with the Acme cooler",
"title": "Beach picnic with the Acme cooler",
"description": "Customer photo submitted during the summer campaign.",
"alternative_text": "Two friends sitting on a beach towel next to a red cooler.",
"tags": [
"spring-launch",
"ugc"
],
"collection_ids": [
48,
52
]
}
}
]
}
response = requests.patch('https://api.tintup.com/v2/teams/{team_id}/assets', json=payload)
data = response.json(){
"data": [
{
"id": "190245",
"type": "asset",
"attributes": {
"status": "active",
"name": "Beach picnic with the Acme cooler",
"title": "Beach picnic with the Acme cooler",
"description": "Customer photo submitted during the summer campaign.",
"alternative_text": "Two friends sitting on a beach towel next to a red cooler.",
"tags": [
"spring-launch",
"ugc"
],
"collection_ids": [
48,
52
]
}
}
]
}{
"data": [
{
"id": "190245",
"type": "asset",
"attributes": {
"created_at": "2025-03-10T09:15:32.000Z",
"updated_at": "2025-03-14T16:42:07.000Z",
"status": "active",
"source": "branded",
"name": "Beach picnic with the Acme cooler",
"description": "Customer photo submitted during the summer campaign.",
"alternative_text": "Two friends sitting on a beach towel next to a red cooler.",
"caption": "Two friends sitting on a beach towel next to a red cooler.",
"tags": [
"spring-launch",
"ugc"
],
"objects": [
"beach",
"cooler",
"person"
],
"emotions": [
"happy"
],
"infections": null,
"licenses": false,
"sfw": true,
"insights": null,
"imported_from_data": {},
"source_url": "https://cdn.example.com/uploads/beach-picnic.jpg",
"expanded_url": "https://cdn.example.com/uploads/beach-picnic.jpg",
"download_url": "https://cdn.example.com/uploads/beach-picnic.jpg",
"url": "https://media.example.com/assets/190245/beach-picnic.jpg",
"thumbnail_url": "https://media.example.com/assets/190245/thumbnail.jpg",
"mime_type": "image/jpeg",
"size": 2483910,
"dimensions": [
1080,
1350
],
"duration": null,
"author": null,
"text": null,
"post_title": null,
"post_text": null
},
"relationships": {
"media": {
"data": null
},
"person": {
"data": {
"type": "person",
"id": null
}
},
"team": {
"data": {
"type": "team",
"id": "212"
},
"links": {
"self": "https://api.tintup.com/v2/teams/212"
}
},
"collections": {
"data": [
{
"type": "collection",
"id": "48"
}
],
"meta": {
"included": false
}
},
"imported_from": {
"data": {
"type": "right_request",
"id": "7710"
},
"meta": {
"included": false
}
},
"variants": {
"data": [
{
"type": "variant",
"id": "190245"
}
],
"meta": {
"total": 1
}
}
},
"links": {
"self": "https://api.tintup.com/v2/teams/212/assets/190245"
}
}
]
}{
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"title": "Invalid name",
"detail": "Name can't be blank",
"source": {
"pointer": "/data/attributes/name"
}
}
]
}Retrieve an asset
Returns 404 when the asset is only in collections the user doesn't have access to.
Parameters
team_idintegerrequiredpathThe ID of the team.
asset_idintegerrequiredpathThe ID of the asset.
includeArray<string>collectionsimported_frommediateamqueryA comma-separated list of related resources to include in the response.
Response
The asset.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Not Found.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: assets:read
curl -X GET 'https://api.tintup.com/v2/teams/{team_id}/assets/{asset_id}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/assets/{asset_id}', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.tintup.com/v2/teams/{team_id}/assets/{asset_id}')
data = response.json(){
"data": {
"id": "190245",
"type": "asset",
"attributes": {
"created_at": "2025-03-10T09:15:32.000Z",
"updated_at": "2025-03-14T16:42:07.000Z",
"status": "active",
"source": "branded",
"name": "Beach picnic with the Acme cooler",
"description": "Customer photo submitted during the summer campaign.",
"alternative_text": "Two friends sitting on a beach towel next to a red cooler.",
"caption": "Two friends sitting on a beach towel next to a red cooler.",
"tags": [
"spring-launch",
"ugc"
],
"objects": [
"beach",
"cooler",
"person"
],
"emotions": [
"happy"
],
"infections": null,
"licenses": false,
"sfw": true,
"insights": null,
"imported_from_data": {},
"source_url": "https://cdn.example.com/uploads/beach-picnic.jpg",
"expanded_url": "https://cdn.example.com/uploads/beach-picnic.jpg",
"download_url": "https://cdn.example.com/uploads/beach-picnic.jpg",
"url": "https://media.example.com/assets/190245/beach-picnic.jpg",
"thumbnail_url": "https://media.example.com/assets/190245/thumbnail.jpg",
"mime_type": "image/jpeg",
"size": 2483910,
"dimensions": [
1080,
1350
],
"duration": null,
"author": null,
"text": null,
"post_title": null,
"post_text": null
},
"relationships": {
"media": {
"data": null
},
"person": {
"data": {
"type": "person",
"id": null
}
},
"team": {
"data": {
"type": "team",
"id": "212"
},
"links": {
"self": "https://api.tintup.com/v2/teams/212"
}
},
"collections": {
"data": [
{
"type": "collection",
"id": "48"
}
],
"meta": {
"included": false
}
},
"imported_from": {
"data": {
"type": "right_request",
"id": "7710"
},
"meta": {
"included": false
}
},
"variants": {
"data": [
{
"type": "variant",
"id": "190245"
}
],
"meta": {
"total": 1
}
}
},
"links": {
"self": "https://api.tintup.com/v2/teams/212/assets/190245"
}
}
}{
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"code": "404",
"title": "Not found",
"status": "404"
}
]
}Delete an asset
Deletes the asset.
Parameters
team_idintegerrequiredpathThe ID of the team.
asset_idintegerrequiredpathThe ID of the asset.
Response
No Content. The request succeeded and there is no response body.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Not Found.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: assets:write
curl -X DELETE 'https://api.tintup.com/v2/teams/{team_id}/assets/{asset_id}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/assets/{asset_id}', {
method: 'DELETE',
});
const data = await response.json();import requests
response = requests.delete('https://api.tintup.com/v2/teams/{team_id}/assets/{asset_id}')
data = response.json(){
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"code": "404",
"title": "Not found",
"status": "404"
}
]
}Update an asset
Updates the asset.
Body
The attributes to change.
dataAssetUpdaterequiredOnly the attributes that are sent are changed.
Parameters
team_idintegerrequiredpathThe ID of the team.
asset_idintegerrequiredpathThe ID of the asset.
includeArray<string>collectionsimported_frommediateamqueryA comma-separated list of related resources to include in the response.
Response
The asset.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Not Found.
Unprocessable Entity. The request is missing required parameters or the resource is invalid.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: assets:write
curl -X PATCH 'https://api.tintup.com/v2/teams/{team_id}/assets/{asset_id}' \
-H 'Content-Type: application/vnd.api+json' \
-d '{
"data": {
"id": "190245",
"type": "asset",
"attributes": {
"status": "active",
"name": "Beach picnic with the Acme cooler",
"title": "Beach picnic with the Acme cooler",
"description": "Customer photo submitted during the summer campaign.",
"alternative_text": "Two friends sitting on a beach towel next to a red cooler.",
"tags": [
"spring-launch",
"ugc"
],
"collection_ids": [
48,
52
]
}
}
}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/assets/{asset_id}', {
method: 'PATCH',
headers: {
'Content-Type': 'application/vnd.api+json',
},
body: JSON.stringify({
"data": {
"id": "190245",
"type": "asset",
"attributes": {
"status": "active",
"name": "Beach picnic with the Acme cooler",
"title": "Beach picnic with the Acme cooler",
"description": "Customer photo submitted during the summer campaign.",
"alternative_text": "Two friends sitting on a beach towel next to a red cooler.",
"tags": [
"spring-launch",
"ugc"
],
"collection_ids": [
48,
52
]
}
}
}),
});
const data = await response.json();import requests
payload = {
"data": {
"id": "190245",
"type": "asset",
"attributes": {
"status": "active",
"name": "Beach picnic with the Acme cooler",
"title": "Beach picnic with the Acme cooler",
"description": "Customer photo submitted during the summer campaign.",
"alternative_text": "Two friends sitting on a beach towel next to a red cooler.",
"tags": [
"spring-launch",
"ugc"
],
"collection_ids": [
48,
52
]
}
}
}
response = requests.patch('https://api.tintup.com/v2/teams/{team_id}/assets/{asset_id}', json=payload)
data = response.json(){
"data": {
"id": "190245",
"type": "asset",
"attributes": {
"status": "active",
"name": "Beach picnic with the Acme cooler",
"title": "Beach picnic with the Acme cooler",
"description": "Customer photo submitted during the summer campaign.",
"alternative_text": "Two friends sitting on a beach towel next to a red cooler.",
"tags": [
"spring-launch",
"ugc"
],
"collection_ids": [
48,
52
]
}
}
}{
"data": {
"id": "190245",
"type": "asset",
"attributes": {
"created_at": "2025-03-10T09:15:32.000Z",
"updated_at": "2025-03-14T16:42:07.000Z",
"status": "active",
"source": "branded",
"name": "Beach picnic with the Acme cooler",
"description": "Customer photo submitted during the summer campaign.",
"alternative_text": "Two friends sitting on a beach towel next to a red cooler.",
"caption": "Two friends sitting on a beach towel next to a red cooler.",
"tags": [
"spring-launch",
"ugc"
],
"objects": [
"beach",
"cooler",
"person"
],
"emotions": [
"happy"
],
"infections": null,
"licenses": false,
"sfw": true,
"insights": null,
"imported_from_data": {},
"source_url": "https://cdn.example.com/uploads/beach-picnic.jpg",
"expanded_url": "https://cdn.example.com/uploads/beach-picnic.jpg",
"download_url": "https://cdn.example.com/uploads/beach-picnic.jpg",
"url": "https://media.example.com/assets/190245/beach-picnic.jpg",
"thumbnail_url": "https://media.example.com/assets/190245/thumbnail.jpg",
"mime_type": "image/jpeg",
"size": 2483910,
"dimensions": [
1080,
1350
],
"duration": null,
"author": null,
"text": null,
"post_title": null,
"post_text": null
},
"relationships": {
"media": {
"data": null
},
"person": {
"data": {
"type": "person",
"id": null
}
},
"team": {
"data": {
"type": "team",
"id": "212"
},
"links": {
"self": "https://api.tintup.com/v2/teams/212"
}
},
"collections": {
"data": [
{
"type": "collection",
"id": "48"
}
],
"meta": {
"included": false
}
},
"imported_from": {
"data": {
"type": "right_request",
"id": "7710"
},
"meta": {
"included": false
}
},
"variants": {
"data": [
{
"type": "variant",
"id": "190245"
}
],
"meta": {
"total": 1
}
}
},
"links": {
"self": "https://api.tintup.com/v2/teams/212/assets/190245"
}
}
}{
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"code": "404",
"title": "Not found",
"status": "404"
}
]
}{
"errors": [
{
"title": "Invalid name",
"detail": "Name can't be blank",
"source": {
"pointer": "/data/attributes/name"
}
}
]
}Retrieve asset aggregations
Returns the number of the team's assets per source, detected object, emotion, media type and tag. Returns 503 while search is temporarily unavailable.
Parameters
team_idintegerrequiredpathThe ID of the team.
filterobjectqueryFilters that accept multiple values take a comma-separated list.
Response
The number of the team's assets per source, detected object, emotion, media type and tag.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Service Unavailable. Search is temporarily unavailable; retry later.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: assets:read
curl -X GET 'https://api.tintup.com/v2/teams/{team_id}/assets/aggregations'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/assets/aggregations', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.tintup.com/v2/teams/{team_id}/assets/aggregations')
data = response.json(){
"data": [
{
"id": "tags",
"type": "aggregation",
"attributes": {
"buckets": {
"spring-launch": 31,
"ugc": 77
}
}
}
]
}{
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}Collections
collectionsRetrieve a list of collections
Returns the collections you have access to.
Parameters
team_idintegerrequiredpathThe ID of the team.
filterobjectqueryFilters the collections.
sortArray<string>id-idname-namecreated_at-created_atupdated_at-updated_at-idqueryA comma-separated list of fields to sort by. Prefix a field with - to sort in descending order. Defaults to -id (newest first).
includeArray<string>assetsqueryA comma-separated list of related resources to include in the response.
pageobjectqueryOffset pagination. Use page[size] to set the number of items per page and page[number] to select a page. The response's links object contains ready-to-use URLs for the next and previous pages.
Response
A list of collections.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: collections:read
curl -X GET 'https://api.tintup.com/v2/teams/{team_id}/collections'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/collections', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.tintup.com/v2/teams/{team_id}/collections')
data = response.json(){
"data": [
{
"id": "27",
"type": "collection",
"attributes": {
"name": "Summer campaign",
"status": "active",
"public": false,
"slug": null,
"assets_count": 48,
"created_at": "2025-02-03T11:30:00.000Z",
"updated_at": "2025-03-14T16:42:07.000Z"
},
"relationships": {
"assets": {
"data": [
{
"type": "asset",
"id": "7300"
}
],
"links": {
"first": "https://api.tintup.com/v2/teams/1/collections/27/assets",
"next": "https://api.tintup.com/v2/teams/1/collections/27/assets?page%5Bnumber%5D=2",
"previous": "https://api.tintup.com/v2/teams/1/collections/27/assets?page%5Bnumber%5D=1"
},
"meta": {
"included": false,
"total": 48
}
}
}
}
],
"links": {
"self": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=2",
"first": "https://api.tintup.com/v2/teams/1/tints",
"next": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=3",
"prev": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=1"
}
}Create a collection
Creates a collection.
Body
The collection to create.
dataNewCollectionrequiredThe collection to create. New collections are active.
Parameters
team_idintegerrequiredpathThe ID of the team.
includeArray<string>assetsqueryA comma-separated list of related resources to include in the response.
Response
The collection.
Unprocessable Entity. The request is missing required parameters or the resource is invalid.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: collections:write
curl -X POST 'https://api.tintup.com/v2/teams/{team_id}/collections' \
-H 'Content-Type: application/vnd.api+json' \
-d '{
"data": {
"type": "collection",
"attributes": {
"name": "Summer campaign",
"public": false
}
}
}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/collections', {
method: 'POST',
headers: {
'Content-Type': 'application/vnd.api+json',
},
body: JSON.stringify({
"data": {
"type": "collection",
"attributes": {
"name": "Summer campaign",
"public": false
}
}
}),
});
const data = await response.json();import requests
payload = {
"data": {
"type": "collection",
"attributes": {
"name": "Summer campaign",
"public": False
}
}
}
response = requests.post('https://api.tintup.com/v2/teams/{team_id}/collections', json=payload)
data = response.json(){
"data": {
"type": "collection",
"attributes": {
"name": "Summer campaign",
"public": false
}
}
}{
"data": {
"id": "27",
"type": "collection",
"attributes": {
"name": "Summer campaign",
"status": "active",
"public": false,
"slug": null,
"assets_count": 48,
"created_at": "2025-02-03T11:30:00.000Z",
"updated_at": "2025-03-14T16:42:07.000Z"
},
"relationships": {
"assets": {
"data": [
{
"type": "asset",
"id": "7300"
}
],
"links": {
"first": "https://api.tintup.com/v2/teams/1/collections/27/assets",
"next": "https://api.tintup.com/v2/teams/1/collections/27/assets?page%5Bnumber%5D=2",
"previous": "https://api.tintup.com/v2/teams/1/collections/27/assets?page%5Bnumber%5D=1"
},
"meta": {
"included": false,
"total": 48
}
}
}
}
}{
"errors": [
{
"title": "Invalid name",
"detail": "Name can't be blank",
"source": {
"pointer": "/data/attributes/name"
}
}
]
}Delete multiple collections
Deletes several collections at once.
Body
The collections to delete, each identified by its id.
dataArray<CollectionBulkDelete>requiredParameters
team_idintegerrequiredpathThe ID of the team.
Response
No Content. The request succeeded and there is no response body.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: collections:write
curl -X DELETE 'https://api.tintup.com/v2/teams/{team_id}/collections' \
-H 'Content-Type: application/vnd.api+json; ext=bulk' \
-d '{
"data": [
{
"id": "27",
"type": "collection"
},
{
"id": "28",
"type": "collection"
}
]
}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/collections', {
method: 'DELETE',
headers: {
'Content-Type': 'application/vnd.api+json; ext=bulk',
},
body: JSON.stringify({
"data": [
{
"id": "27",
"type": "collection"
},
{
"id": "28",
"type": "collection"
}
]
}),
});
const data = await response.json();import requests
payload = {
"data": [
{
"id": "27",
"type": "collection"
},
{
"id": "28",
"type": "collection"
}
]
}
response = requests.delete('https://api.tintup.com/v2/teams/{team_id}/collections', json=payload)
data = response.json(){
"data": [
{
"id": "27",
"type": "collection"
},
{
"id": "28",
"type": "collection"
}
]
}Update multiple collections
The request is validated as a whole: if any collection is invalid, none are updated.
Body
The collections to update, each identified by its id.
dataArray<CollectionBulkUpdate>requiredParameters
team_idintegerrequiredpathThe ID of the team.
Response
The updated collections.
Unprocessable Entity. The request is missing required parameters or the resource is invalid.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: collections:write
curl -X PATCH 'https://api.tintup.com/v2/teams/{team_id}/collections' \
-H 'Content-Type: application/vnd.api+json; ext=bulk' \
-d '{
"data": [
{
"id": "27",
"type": "collection",
"attributes": {
"status": "archived"
}
},
{
"id": "28",
"type": "collection",
"attributes": {
"status": "archived"
}
}
]
}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/collections', {
method: 'PATCH',
headers: {
'Content-Type': 'application/vnd.api+json; ext=bulk',
},
body: JSON.stringify({
"data": [
{
"id": "27",
"type": "collection",
"attributes": {
"status": "archived"
}
},
{
"id": "28",
"type": "collection",
"attributes": {
"status": "archived"
}
}
]
}),
});
const data = await response.json();import requests
payload = {
"data": [
{
"id": "27",
"type": "collection",
"attributes": {
"status": "archived"
}
},
{
"id": "28",
"type": "collection",
"attributes": {
"status": "archived"
}
}
]
}
response = requests.patch('https://api.tintup.com/v2/teams/{team_id}/collections', json=payload)
data = response.json(){
"data": [
{
"id": "27",
"type": "collection",
"attributes": {
"status": "archived"
}
},
{
"id": "28",
"type": "collection",
"attributes": {
"status": "archived"
}
}
]
}{
"data": [
{
"id": "27",
"type": "collection",
"attributes": {
"name": "Summer campaign",
"status": "active",
"public": false,
"slug": null,
"assets_count": 48,
"created_at": "2025-02-03T11:30:00.000Z",
"updated_at": "2025-03-14T16:42:07.000Z"
},
"relationships": {
"assets": {
"data": [
{
"type": "asset",
"id": "7300"
}
],
"links": {
"first": "https://api.tintup.com/v2/teams/1/collections/27/assets",
"next": "https://api.tintup.com/v2/teams/1/collections/27/assets?page%5Bnumber%5D=2",
"previous": "https://api.tintup.com/v2/teams/1/collections/27/assets?page%5Bnumber%5D=1"
},
"meta": {
"included": false,
"total": 48
}
}
}
}
]
}{
"errors": [
{
"title": "Invalid name",
"detail": "Name can't be blank",
"source": {
"pointer": "/data/attributes/name"
}
}
]
}Delete a collection
Deletes the collection.
Parameters
team_idintegerrequiredpathThe ID of the team.
collection_idintegerrequiredpathThe ID of the collection.
Response
No Content. The request succeeded and there is no response body.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: collections:write
curl -X DELETE 'https://api.tintup.com/v2/teams/{team_id}/collections/{collection_id}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/collections/{collection_id}', {
method: 'DELETE',
});
const data = await response.json();import requests
response = requests.delete('https://api.tintup.com/v2/teams/{team_id}/collections/{collection_id}')
data = response.json()Update a collection
Updates the collection.
Body
The collection changes.
dataCollectionUpdaterequiredThe collection changes. The id is optional; the collection is identified by the URL.
Parameters
team_idintegerrequiredpathThe ID of the team.
collection_idintegerrequiredpathThe ID of the collection.
includeArray<string>assetsqueryA comma-separated list of related resources to include in the response.
Response
The collection.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: collections:write
curl -X PATCH 'https://api.tintup.com/v2/teams/{team_id}/collections/{collection_id}' \
-H 'Content-Type: application/vnd.api+json' \
-d '{
"data": {
"id": "27",
"type": "collection",
"attributes": {
"public": true
}
}
}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/collections/{collection_id}', {
method: 'PATCH',
headers: {
'Content-Type': 'application/vnd.api+json',
},
body: JSON.stringify({
"data": {
"id": "27",
"type": "collection",
"attributes": {
"public": true
}
}
}),
});
const data = await response.json();import requests
payload = {
"data": {
"id": "27",
"type": "collection",
"attributes": {
"public": True
}
}
}
response = requests.patch('https://api.tintup.com/v2/teams/{team_id}/collections/{collection_id}', json=payload)
data = response.json(){
"data": {
"id": "27",
"type": "collection",
"attributes": {
"public": true
}
}
}{
"data": {
"id": "27",
"type": "collection",
"attributes": {
"name": "Summer campaign",
"status": "active",
"public": false,
"slug": null,
"assets_count": 48,
"created_at": "2025-02-03T11:30:00.000Z",
"updated_at": "2025-03-14T16:42:07.000Z"
},
"relationships": {
"assets": {
"data": [
{
"type": "asset",
"id": "7300"
}
],
"links": {
"first": "https://api.tintup.com/v2/teams/1/collections/27/assets",
"next": "https://api.tintup.com/v2/teams/1/collections/27/assets?page%5Bnumber%5D=2",
"previous": "https://api.tintup.com/v2/teams/1/collections/27/assets?page%5Bnumber%5D=1"
},
"meta": {
"included": false,
"total": 48
}
}
}
}
}Marketing Integrations
marketing_integrationsRetrieve a list of marketing integrations
Parameters
team_idintegerrequiredpathThe ID of the team.
pageobjectqueryOffset pagination. Use page[size] to set the number of items per page and page[number] to select a page. The response's links object contains ready-to-use URLs for the next and previous pages.
Response
A list of marketing integrations.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: marketing_integrations:read
curl -X GET 'https://api.tintup.com/v2/teams/{team_id}/marketing_integrations'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/marketing_integrations', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.tintup.com/v2/teams/{team_id}/marketing_integrations')
data = response.json(){
"data": [
{
"id": "318",
"type": "marketing_integration",
"attributes": {
"status": "ready",
"site": "https://acme.bynder.com",
"external_id": "acme.bynder.com",
"name": "Acme Inc.",
"username": "jane.doe@example.com",
"image_url": "https://cdn.example.com/avatars/acme.png"
}
}
],
"links": {
"self": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=2",
"first": "https://api.tintup.com/v2/teams/1/tints",
"next": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=3",
"prev": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=1"
}
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}Create a marketing integration
Connects a marketing integration using credentials. Except for twitter, the credentials are checked by fetching the account's profile from the source. The credentials are never returned.
Body
The marketing integration to connect. Only sources that use credentials can be created this way; other sources are connected with Authenticate a marketing integration.
dataNewMarketingIntegrationrequiredConnects a marketing integration using credentials instead of OAuth. Which attributes are required depends on source; see each attribute.
Parameters
team_idintegerrequiredpathThe ID of the team.
Response
The marketing integration.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Unprocessable Entity. The request is missing required parameters or the resource is invalid.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: marketing_integrations:write
curl -X POST 'https://api.tintup.com/v2/teams/{team_id}/marketing_integrations' \
-H 'Content-Type: application/vnd.api+json' \
-d '{
"data": {
"type": "marketing_integration",
"attributes": {
"source": "bynder",
"access_token": "3f1c9a7e-5d2b-4e8a-9c61-7b0d2e4f8a13|Zm9vYmFyLWNsaWVudC1zZWNyZXQ",
"site": "https://acme.bynder.com"
}
}
}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/marketing_integrations', {
method: 'POST',
headers: {
'Content-Type': 'application/vnd.api+json',
},
body: JSON.stringify({
"data": {
"type": "marketing_integration",
"attributes": {
"source": "bynder",
"access_token": "3f1c9a7e-5d2b-4e8a-9c61-7b0d2e4f8a13|Zm9vYmFyLWNsaWVudC1zZWNyZXQ",
"site": "https://acme.bynder.com"
}
}
}),
});
const data = await response.json();import requests
payload = {
"data": {
"type": "marketing_integration",
"attributes": {
"source": "bynder",
"access_token": "3f1c9a7e-5d2b-4e8a-9c61-7b0d2e4f8a13|Zm9vYmFyLWNsaWVudC1zZWNyZXQ",
"site": "https://acme.bynder.com"
}
}
}
response = requests.post('https://api.tintup.com/v2/teams/{team_id}/marketing_integrations', json=payload)
data = response.json(){
"data": {
"type": "marketing_integration",
"attributes": {
"source": "bynder",
"access_token": "3f1c9a7e-5d2b-4e8a-9c61-7b0d2e4f8a13|Zm9vYmFyLWNsaWVudC1zZWNyZXQ",
"site": "https://acme.bynder.com"
}
}
}{
"data": {
"id": "318",
"type": "marketing_integration",
"attributes": {
"status": "ready",
"site": "https://acme.bynder.com",
"external_id": "acme.bynder.com",
"name": "Acme Inc.",
"username": "jane.doe@example.com",
"image_url": "https://cdn.example.com/avatars/acme.png"
}
}
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"title": "Invalid name",
"detail": "Name can't be blank",
"source": {
"pointer": "/data/attributes/name"
}
}
]
}Delete a marketing integration
Parameters
team_idintegerrequiredpathThe ID of the team.
marketing_integration_idintegerrequiredpathThe ID of the marketing integration.
Response
No Content. The request succeeded and there is no response body.
Not Found.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: marketing_integrations:write
curl -X DELETE 'https://api.tintup.com/v2/teams/{team_id}/marketing_integrations/{marketing_integration_id}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/marketing_integrations/{marketing_integration_id}', {
method: 'DELETE',
});
const data = await response.json();import requests
response = requests.delete('https://api.tintup.com/v2/teams/{team_id}/marketing_integrations/{marketing_integration_id}')
data = response.json(){
"errors": [
{
"code": "404",
"title": "Not found",
"status": "404"
}
]
}Reauthenticate a marketing integration
Returns the URL of the third-party authorization page for the marketing integration. Open this URL (usually in a popup window) so the user can grant access again. Once the user completes the authorization flow, the marketing integration is updated and the result is delivered using the origin or redirect_uri options.
Parameters
team_idintegerrequiredpathThe ID of the team.
marketing_integration_idintegerrequiredpathThe ID of the marketing integration.
originstring<uri>queryWhen specified, once the user completes the authorization flow, the callback page posts a message to window.opener using window.postMessage with this value as the target origin. The message is a JSON string of the form {"type": "marketing_integration_new", "data": <response body>, "status": <HTTP status>} (marketing_integration_edit when reauthenticating), where the response body is the marketing integration (or errors).
redirect_uristring<uri>queryWhen specified, once the user completes the authorization flow, the user is redirected to this URI with a data query parameter containing the same JSON message as for origin, encoded using Base64. Takes precedence over origin.
Response
The URL of the third-party authorization page. Open it (usually in a popup window) so the user can grant access.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Not Found.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: marketing_integrations:write
curl -X GET 'https://api.tintup.com/v2/teams/{team_id}/marketing_integrations/{marketing_integration_id}/edit'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/marketing_integrations/{marketing_integration_id}/edit', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.tintup.com/v2/teams/{team_id}/marketing_integrations/{marketing_integration_id}/edit')
data = response.json(){
"data": {
"id": "9e107d9d372bb6826bd81d3542a419d6",
"type": "redirect",
"attributes": {
"url": "https://auth.example.com/oauth/authorize?client_id=8f14e45f&response_type=code&state=eyJhbGciOiJIUzI1NiJ9"
}
}
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"code": "404",
"title": "Not found",
"status": "404"
}
]
}Retrieve a list of marketing integration folders
A folder is a remote group or collection that can be accessed directly using the specified marketing integration's credentials. Use a folder's id as the folder_id when creating marketing integration requests. Sources without folders return an empty list.
Parameters
team_idintegerrequiredpathThe ID of the team.
marketing_integration_idintegerrequiredpathThe ID of the marketing integration.
Response
A list of folders in the marketing integration. This list is not paginated.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Not Found.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: marketing_integrations:write
curl -X GET 'https://api.tintup.com/v2/teams/{team_id}/marketing_integrations/{marketing_integration_id}/folders'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/marketing_integrations/{marketing_integration_id}/folders', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.tintup.com/v2/teams/{team_id}/marketing_integrations/{marketing_integration_id}/folders')
data = response.json(){
"data": [
{
"id": "41736560",
"type": "marketing_integration_folder",
"attributes": {
"name": "Marketing assets"
}
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"code": "404",
"title": "Not found",
"status": "404"
}
]
}Authenticate a marketing integration
Returns the URL of the third-party authorization page for the requested source. Open this URL (usually in a popup window) so the user can grant access. Once the user completes the authorization flow, the marketing integration is created and the result is delivered using the origin or redirect_uri options.
Parameters
team_idintegerrequiredpathThe ID of the team.
sourcestringdropboxfacebookgoogle_drivehubspotmailchimprequiredqueryThe source of the marketing integration to authenticate.
sitestring<uri>queryThe API endpoint to use, for sources that require one.
originstring<uri>queryWhen specified, once the user completes the authorization flow, the callback page posts a message to window.opener using window.postMessage with this value as the target origin. The message is a JSON string of the form {"type": "marketing_integration_new", "data": <response body>, "status": <HTTP status>} (marketing_integration_edit when reauthenticating), where the response body is the marketing integration (or errors).
redirect_uristring<uri>queryWhen specified, once the user completes the authorization flow, the user is redirected to this URI with a data query parameter containing the same JSON message as for origin, encoded using Base64. Takes precedence over origin.
Response
The URL of the third-party authorization page. Open it (usually in a popup window) so the user can grant access.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: marketing_integrations:write
curl -X GET 'https://api.tintup.com/v2/teams/{team_id}/marketing_integrations/new'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/marketing_integrations/new', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.tintup.com/v2/teams/{team_id}/marketing_integrations/new')
data = response.json(){
"data": {
"id": "9e107d9d372bb6826bd81d3542a419d6",
"type": "redirect",
"attributes": {
"url": "https://auth.example.com/oauth/authorize?client_id=8f14e45f&response_type=code&state=eyJhbGciOiJIUzI1NiJ9"
}
}
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}Create marketing integration requests
Asynchronously publishes assets or collections to a marketing integration. One request is created per published asset (publishing a collection creates one request per asset in the collection).
Body
The assets or collections to publish. Send a single resource with application/vnd.api+json, or several at once with application/vnd.api+json; ext=bulk. If any of them is invalid, nothing is created.
application/vnd.api+jsonobjectdataNewMarketingIntegrationRequestrequiredPublishes an asset, or every asset of a collection, to a folder of the marketing integration.
application/vnd.api+json; ext=bulkobjectdataArray<NewMarketingIntegrationRequest>requiredParameters
team_idintegerrequiredpathThe ID of the team.
marketing_integration_idintegerrequiredpathThe ID of the marketing integration.
Response
The marketing integration requests that were created, one per published asset. The uploads happen asynchronously; each request starts as pending.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Not Found.
Unprocessable Entity. The request is missing required parameters or the resource is invalid.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: marketing_integrations_requests:write
curl -X POST 'https://api.tintup.com/v2/teams/{team_id}/marketing_integrations/{marketing_integration_id}/requests' \
-H 'Content-Type: application/vnd.api+json' \
-d '{
"data": {
"type": "marketing_integration_request",
"attributes": {
"asset_id": 2750981,
"folder_id": "41736560"
}
}
}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/marketing_integrations/{marketing_integration_id}/requests', {
method: 'POST',
headers: {
'Content-Type': 'application/vnd.api+json',
},
body: JSON.stringify({
"data": {
"type": "marketing_integration_request",
"attributes": {
"asset_id": 2750981,
"folder_id": "41736560"
}
}
}),
});
const data = await response.json();import requests
payload = {
"data": {
"type": "marketing_integration_request",
"attributes": {
"asset_id": 2750981,
"folder_id": "41736560"
}
}
}
response = requests.post('https://api.tintup.com/v2/teams/{team_id}/marketing_integrations/{marketing_integration_id}/requests', json=payload)
data = response.json(){
"data": {
"type": "marketing_integration_request",
"attributes": {
"asset_id": 2750981,
"folder_id": "41736560"
}
}
}{
"data": [
{
"type": "marketing_integration_request",
"attributes": {
"asset_id": 2750981,
"folder_id": "41736560"
}
},
{
"type": "marketing_integration_request",
"attributes": {
"collection_id": 1184,
"folder_id": "41736560"
}
}
]
}{
"data": [
{
"id": "70412",
"type": "marketing_integration_request",
"attributes": {
"status": "pending",
"folder_id": "41736560"
},
"relationships": {
"marketing_integration": {
"data": {
"id": "318",
"type": "marketing_integration"
},
"meta": {
"included": false
}
},
"asset": {
"data": {
"id": "2750981",
"type": "asset"
},
"meta": {
"included": false
}
}
}
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"code": "404",
"title": "Not found",
"status": "404"
}
]
}{
"errors": [
{
"title": "Invalid name",
"detail": "Name can't be blank",
"source": {
"pointer": "/data/attributes/name"
}
}
]
}Publisher
group_publisherCampaigns
campaignsRetrieve a list of campaigns
Returns the team's campaigns.
Parameters
team_idintegerrequiredpathThe ID of the team.
filterobjectqueryFilters the list of campaigns. All filters are combined with AND. Date filters accept ISO 8601 date-times and the operators $eq, $gt, $gte, $lt, and $lte, for example filter[starts_at][$gte]=2025-06-01T00:00:00Z.
sortstring-idqueryA comma-separated list of attributes to sort by (for example name, starts_at, ends_at, created_at). Prefix an attribute with - to sort in descending order.
pageobjectqueryOffset pagination. Use page[size] to set the number of items per page and page[number] to select a page. The response's links object contains ready-to-use URLs for the next and previous pages.
Response
A list of campaigns.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: campaigns:read
curl -X GET 'https://api.tintup.com/v2/teams/{team_id}/campaigns'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/campaigns', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.tintup.com/v2/teams/{team_id}/campaigns')
data = response.json(){
"data": [
{
"id": "57",
"type": "campaign",
"attributes": {
"name": "Summer collection",
"starts_at": "2025-06-01T00:00:00.000Z",
"ends_at": "2025-08-31T23:59:59.000Z",
"label_color": "#f5a623",
"created_at": "2025-03-14T16:42:07.000Z",
"updated_at": "2025-03-14T16:42:07.000Z"
},
"links": {
"self": "https://api.example.com/v2/teams/1024/campaigns/57"
}
}
],
"links": {
"self": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=2",
"first": "https://api.tintup.com/v2/teams/1/tints",
"next": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=3",
"prev": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=1"
}
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}Create a campaign
Creates a campaign.
Body
The campaign to create.
dataNewCampaignrequiredParameters
team_idintegerrequiredpathThe ID of the team.
Response
The campaign.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Unprocessable Entity. The request is missing required parameters or the resource is invalid.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: campaigns:write
curl -X POST 'https://api.tintup.com/v2/teams/{team_id}/campaigns' \
-H 'Content-Type: application/vnd.api+json' \
-d '{
"data": {
"type": "campaign",
"attributes": {
"name": "Summer collection",
"starts_at": "2025-06-01T00:00:00.000Z",
"ends_at": "2025-08-31T23:59:59.000Z",
"label_color": "#f5a623"
}
}
}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/campaigns', {
method: 'POST',
headers: {
'Content-Type': 'application/vnd.api+json',
},
body: JSON.stringify({
"data": {
"type": "campaign",
"attributes": {
"name": "Summer collection",
"starts_at": "2025-06-01T00:00:00.000Z",
"ends_at": "2025-08-31T23:59:59.000Z",
"label_color": "#f5a623"
}
}
}),
});
const data = await response.json();import requests
payload = {
"data": {
"type": "campaign",
"attributes": {
"name": "Summer collection",
"starts_at": "2025-06-01T00:00:00.000Z",
"ends_at": "2025-08-31T23:59:59.000Z",
"label_color": "#f5a623"
}
}
}
response = requests.post('https://api.tintup.com/v2/teams/{team_id}/campaigns', json=payload)
data = response.json(){
"data": {
"type": "campaign",
"attributes": {
"name": "Summer collection",
"starts_at": "2025-06-01T00:00:00.000Z",
"ends_at": "2025-08-31T23:59:59.000Z",
"label_color": "#f5a623"
}
}
}{
"data": {
"id": "57",
"type": "campaign",
"attributes": {
"name": "Summer collection",
"starts_at": "2025-06-01T00:00:00.000Z",
"ends_at": "2025-08-31T23:59:59.000Z",
"label_color": "#f5a623",
"created_at": "2025-03-14T16:42:07.000Z",
"updated_at": "2025-03-14T16:42:07.000Z"
},
"links": {
"self": "https://api.example.com/v2/teams/1024/campaigns/57"
}
}
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"title": "Invalid name",
"detail": "Name can't be blank",
"source": {
"pointer": "/data/attributes/name"
}
}
]
}Retrieve a campaign
Parameters
team_idintegerrequiredpathThe ID of the team.
campaign_idintegerrequiredpathThe ID of the campaign.
Response
The campaign.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Not Found.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: campaigns:read
curl -X GET 'https://api.tintup.com/v2/teams/{team_id}/campaigns/{campaign_id}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/campaigns/{campaign_id}', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.tintup.com/v2/teams/{team_id}/campaigns/{campaign_id}')
data = response.json(){
"data": {
"id": "57",
"type": "campaign",
"attributes": {
"name": "Summer collection",
"starts_at": "2025-06-01T00:00:00.000Z",
"ends_at": "2025-08-31T23:59:59.000Z",
"label_color": "#f5a623",
"created_at": "2025-03-14T16:42:07.000Z",
"updated_at": "2025-03-14T16:42:07.000Z"
},
"links": {
"self": "https://api.example.com/v2/teams/1024/campaigns/57"
}
}
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"code": "404",
"title": "Not found",
"status": "404"
}
]
}Delete a campaign
Deleting a campaign also removes it from the scheduled content it was associated with.
Parameters
team_idintegerrequiredpathThe ID of the team.
campaign_idintegerrequiredpathThe ID of the campaign.
Response
No Content. The request succeeded and there is no response body.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Not Found.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: campaigns:write
curl -X DELETE 'https://api.tintup.com/v2/teams/{team_id}/campaigns/{campaign_id}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/campaigns/{campaign_id}', {
method: 'DELETE',
});
const data = await response.json();import requests
response = requests.delete('https://api.tintup.com/v2/teams/{team_id}/campaigns/{campaign_id}')
data = response.json(){
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"code": "404",
"title": "Not found",
"status": "404"
}
]
}Update a campaign
Body
The campaign attributes to change.
dataCampaignUpdaterequiredParameters
team_idintegerrequiredpathThe ID of the team.
campaign_idintegerrequiredpathThe ID of the campaign.
Response
The campaign.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Not Found.
Unprocessable Entity. The request is missing required parameters or the resource is invalid.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: campaigns:write
curl -X PATCH 'https://api.tintup.com/v2/teams/{team_id}/campaigns/{campaign_id}' \
-H 'Content-Type: application/vnd.api+json' \
-d '{
"data": {
"id": "57",
"type": "campaign",
"attributes": {
"ends_at": "2025-09-15T23:59:59.000Z"
}
}
}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/campaigns/{campaign_id}', {
method: 'PATCH',
headers: {
'Content-Type': 'application/vnd.api+json',
},
body: JSON.stringify({
"data": {
"id": "57",
"type": "campaign",
"attributes": {
"ends_at": "2025-09-15T23:59:59.000Z"
}
}
}),
});
const data = await response.json();import requests
payload = {
"data": {
"id": "57",
"type": "campaign",
"attributes": {
"ends_at": "2025-09-15T23:59:59.000Z"
}
}
}
response = requests.patch('https://api.tintup.com/v2/teams/{team_id}/campaigns/{campaign_id}', json=payload)
data = response.json(){
"data": {
"id": "57",
"type": "campaign",
"attributes": {
"ends_at": "2025-09-15T23:59:59.000Z"
}
}
}{
"data": {
"id": "57",
"type": "campaign",
"attributes": {
"name": "Summer collection",
"starts_at": "2025-06-01T00:00:00.000Z",
"ends_at": "2025-08-31T23:59:59.000Z",
"label_color": "#f5a623",
"created_at": "2025-03-14T16:42:07.000Z",
"updated_at": "2025-03-14T16:42:07.000Z"
},
"links": {
"self": "https://api.example.com/v2/teams/1024/campaigns/57"
}
}
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"code": "404",
"title": "Not found",
"status": "404"
}
]
}{
"errors": [
{
"title": "Invalid name",
"detail": "Name can't be blank",
"source": {
"pointer": "/data/attributes/name"
}
}
]
}Scheduled Content
scheduled_contentsRetrieve a list of scheduled contents
By default, only contents scheduled to be published in the last 14 days or later are returned; use filter[published_at] to change the range.
Parameters
team_idintegerrequiredpathThe ID of the team.
pageobjectqueryOffset pagination. Use page[size] to set the number of items per page and page[number] to select a page. The response's links object contains ready-to-use URLs for the next and previous pages.
includeArray<string>accountcampaignmediasubaccountteamqueryA comma-separated list of related resources to include in the response.
filterobjectqueryFilters that accept multiple values take a comma-separated list.
Response
A list of scheduled contents.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: scheduled_contents:read
curl -X GET 'https://api.tintup.com/v2/teams/{team_id}/scheduled_contents'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/scheduled_contents', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.tintup.com/v2/teams/{team_id}/scheduled_contents')
data = response.json(){
"data": [
{
"id": "4821",
"type": "scheduled_content",
"attributes": {
"status": "pending",
"text": "Our spring collection drops Friday. Which color are you picking? 🌸",
"published_at": "2025-03-14T16:42:07.000Z",
"created_at": "2025-03-10T09:15:32.000Z",
"updated_at": "2025-03-11T13:02:48.000Z",
"tags": [
"spring-launch",
"instagram"
],
"source": "instagram_business",
"subaccount_id": "17841400008460056",
"privacy": null,
"options": {}
},
"relationships": {
"media": {
"data": [
{
"type": "upload",
"id": "eyJfcmFpbHMiOnsiZGF0YSI6ODgyMTQsInB1ciI6ImJsb2JfaWQifX0=--7b1f0c7c3e5e0a9d2b6f4e1c8a3d5f7e9b2c4a6d"
}
],
"meta": {
"included": false
}
},
"account": {
"data": {
"type": "account",
"id": "1375"
},
"meta": {
"included": false
}
},
"subaccount": {
"data": {
"type": "subaccount",
"id": "17841400008460056"
},
"meta": {
"included": false
}
},
"team": {
"data": {
"type": "team",
"id": "212"
},
"meta": {
"included": false
}
},
"campaign": {
"data": {
"type": "campaign",
"id": "58"
},
"meta": {
"included": false
}
}
}
}
],
"links": {
"self": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=2",
"first": "https://api.tintup.com/v2/teams/1/tints",
"next": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=3",
"prev": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=1"
}
}{
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}Create a scheduled content
Schedules content to be published to a connected account. Validation rules (required attributes, caption length and file limits) depend on the account's network.
Body
The content to schedule.
dataNewScheduledContentrequiredParameters
team_idintegerrequiredpathThe ID of the team.
includeArray<string>accountcampaignmediasubaccountteamqueryA comma-separated list of related resources to include in the response.
Response
The scheduled content.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Unprocessable Entity. The request is missing required parameters or the resource is invalid.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: scheduled_contents:write
curl -X POST 'https://api.tintup.com/v2/teams/{team_id}/scheduled_contents' \
-H 'Content-Type: application/vnd.api+json' \
-d '{
"data": {
"type": "scheduled_content",
"attributes": {
"text": "Our spring collection drops Friday. Which color are you picking? 🌸",
"title": null,
"tags": [
"spring-launch",
"instagram"
],
"published_at": "2025-03-14T16:42:07.000Z",
"media": [
"eyJfcmFpbHMiOnsiZGF0YSI6ODgyMTQsInB1ciI6ImJsb2JfaWQifX0=--7b1f0c7c3e5e0a9d2b6f4e1c8a3d5f7e9b2c4a6d"
],
"campaign_id": "58",
"privacy": null,
"options": {},
"account_id": "1375",
"subaccount_id": "17841400008460056"
}
}
}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/scheduled_contents', {
method: 'POST',
headers: {
'Content-Type': 'application/vnd.api+json',
},
body: JSON.stringify({
"data": {
"type": "scheduled_content",
"attributes": {
"text": "Our spring collection drops Friday. Which color are you picking? 🌸",
"title": null,
"tags": [
"spring-launch",
"instagram"
],
"published_at": "2025-03-14T16:42:07.000Z",
"media": [
"eyJfcmFpbHMiOnsiZGF0YSI6ODgyMTQsInB1ciI6ImJsb2JfaWQifX0=--7b1f0c7c3e5e0a9d2b6f4e1c8a3d5f7e9b2c4a6d"
],
"campaign_id": "58",
"privacy": null,
"options": {},
"account_id": "1375",
"subaccount_id": "17841400008460056"
}
}
}),
});
const data = await response.json();import requests
payload = {
"data": {
"type": "scheduled_content",
"attributes": {
"text": "Our spring collection drops Friday. Which color are you picking? 🌸",
"title": None,
"tags": [
"spring-launch",
"instagram"
],
"published_at": "2025-03-14T16:42:07.000Z",
"media": [
"eyJfcmFpbHMiOnsiZGF0YSI6ODgyMTQsInB1ciI6ImJsb2JfaWQifX0=--7b1f0c7c3e5e0a9d2b6f4e1c8a3d5f7e9b2c4a6d"
],
"campaign_id": "58",
"privacy": None,
"options": {},
"account_id": "1375",
"subaccount_id": "17841400008460056"
}
}
}
response = requests.post('https://api.tintup.com/v2/teams/{team_id}/scheduled_contents', json=payload)
data = response.json(){
"data": {
"type": "scheduled_content",
"attributes": {
"text": "Our spring collection drops Friday. Which color are you picking? 🌸",
"title": null,
"tags": [
"spring-launch",
"instagram"
],
"published_at": "2025-03-14T16:42:07.000Z",
"media": [
"eyJfcmFpbHMiOnsiZGF0YSI6ODgyMTQsInB1ciI6ImJsb2JfaWQifX0=--7b1f0c7c3e5e0a9d2b6f4e1c8a3d5f7e9b2c4a6d"
],
"campaign_id": "58",
"privacy": null,
"options": {},
"account_id": "1375",
"subaccount_id": "17841400008460056"
}
}
}{
"data": {
"id": "4821",
"type": "scheduled_content",
"attributes": {
"status": "pending",
"text": "Our spring collection drops Friday. Which color are you picking? 🌸",
"published_at": "2025-03-14T16:42:07.000Z",
"created_at": "2025-03-10T09:15:32.000Z",
"updated_at": "2025-03-11T13:02:48.000Z",
"tags": [
"spring-launch",
"instagram"
],
"source": "instagram_business",
"subaccount_id": "17841400008460056",
"privacy": null,
"options": {}
},
"relationships": {
"media": {
"data": [
{
"type": "upload",
"id": "eyJfcmFpbHMiOnsiZGF0YSI6ODgyMTQsInB1ciI6ImJsb2JfaWQifX0=--7b1f0c7c3e5e0a9d2b6f4e1c8a3d5f7e9b2c4a6d"
}
],
"meta": {
"included": false
}
},
"account": {
"data": {
"type": "account",
"id": "1375"
},
"meta": {
"included": false
}
},
"subaccount": {
"data": {
"type": "subaccount",
"id": "17841400008460056"
},
"meta": {
"included": false
}
},
"team": {
"data": {
"type": "team",
"id": "212"
},
"meta": {
"included": false
}
},
"campaign": {
"data": {
"type": "campaign",
"id": "58"
},
"meta": {
"included": false
}
}
}
}
}{
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"title": "Invalid name",
"detail": "Name can't be blank",
"source": {
"pointer": "/data/attributes/name"
}
}
]
}Retrieve a scheduled content
Retrieves one of the team's scheduled contents.
Parameters
team_idintegerrequiredpathThe ID of the team.
scheduled_content_idintegerrequiredpathThe ID of the scheduled content.
includeArray<string>accountcampaignmediasubaccountteamqueryA comma-separated list of related resources to include in the response.
Response
The scheduled content.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Not Found.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: scheduled_contents:read
curl -X GET 'https://api.tintup.com/v2/teams/{team_id}/scheduled_contents/{scheduled_content_id}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/scheduled_contents/{scheduled_content_id}', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.tintup.com/v2/teams/{team_id}/scheduled_contents/{scheduled_content_id}')
data = response.json(){
"data": {
"id": "4821",
"type": "scheduled_content",
"attributes": {
"status": "pending",
"text": "Our spring collection drops Friday. Which color are you picking? 🌸",
"published_at": "2025-03-14T16:42:07.000Z",
"created_at": "2025-03-10T09:15:32.000Z",
"updated_at": "2025-03-11T13:02:48.000Z",
"tags": [
"spring-launch",
"instagram"
],
"source": "instagram_business",
"subaccount_id": "17841400008460056",
"privacy": null,
"options": {}
},
"relationships": {
"media": {
"data": [
{
"type": "upload",
"id": "eyJfcmFpbHMiOnsiZGF0YSI6ODgyMTQsInB1ciI6ImJsb2JfaWQifX0=--7b1f0c7c3e5e0a9d2b6f4e1c8a3d5f7e9b2c4a6d"
}
],
"meta": {
"included": false
}
},
"account": {
"data": {
"type": "account",
"id": "1375"
},
"meta": {
"included": false
}
},
"subaccount": {
"data": {
"type": "subaccount",
"id": "17841400008460056"
},
"meta": {
"included": false
}
},
"team": {
"data": {
"type": "team",
"id": "212"
},
"meta": {
"included": false
}
},
"campaign": {
"data": {
"type": "campaign",
"id": "58"
},
"meta": {
"included": false
}
}
}
}
}{
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"code": "404",
"title": "Not found",
"status": "404"
}
]
}Delete a scheduled content
Deletes the scheduled content.
Parameters
team_idintegerrequiredpathThe ID of the team.
scheduled_content_idintegerrequiredpathThe ID of the scheduled content.
Response
No Content. The request succeeded and there is no response body.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Not Found.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: scheduled_contents:write
curl -X DELETE 'https://api.tintup.com/v2/teams/{team_id}/scheduled_contents/{scheduled_content_id}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/scheduled_contents/{scheduled_content_id}', {
method: 'DELETE',
});
const data = await response.json();import requests
response = requests.delete('https://api.tintup.com/v2/teams/{team_id}/scheduled_contents/{scheduled_content_id}')
data = response.json(){
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"code": "404",
"title": "Not found",
"status": "404"
}
]
}Update a scheduled content
Only pending and failed scheduled contents can be updated; a success content returns 404.
Body
The attributes to change.
dataScheduledContentUpdaterequiredOnly the attributes that are sent are changed; account_id and subaccount_id can't be changed. media is always replaced: omitting it removes the existing files.
Parameters
team_idintegerrequiredpathThe ID of the team.
scheduled_content_idintegerrequiredpathThe ID of the scheduled content.
includeArray<string>accountcampaignmediasubaccountteamqueryA comma-separated list of related resources to include in the response.
Response
The scheduled content.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Not Found.
Unprocessable Entity. The request is missing required parameters or the resource is invalid.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: scheduled_contents:write
curl -X PATCH 'https://api.tintup.com/v2/teams/{team_id}/scheduled_contents/{scheduled_content_id}' \
-H 'Content-Type: application/vnd.api+json' \
-d '{
"data": {
"id": "4821",
"type": "scheduled_content",
"attributes": {
"text": "Our spring collection drops Friday. Which color are you picking? 🌸",
"title": null,
"tags": [
"spring-launch",
"instagram"
],
"published_at": "2025-03-14T16:42:07.000Z",
"media": [
"eyJfcmFpbHMiOnsiZGF0YSI6ODgyMTQsInB1ciI6ImJsb2JfaWQifX0=--7b1f0c7c3e5e0a9d2b6f4e1c8a3d5f7e9b2c4a6d"
],
"campaign_id": "58",
"privacy": null,
"options": {}
}
}
}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/scheduled_contents/{scheduled_content_id}', {
method: 'PATCH',
headers: {
'Content-Type': 'application/vnd.api+json',
},
body: JSON.stringify({
"data": {
"id": "4821",
"type": "scheduled_content",
"attributes": {
"text": "Our spring collection drops Friday. Which color are you picking? 🌸",
"title": null,
"tags": [
"spring-launch",
"instagram"
],
"published_at": "2025-03-14T16:42:07.000Z",
"media": [
"eyJfcmFpbHMiOnsiZGF0YSI6ODgyMTQsInB1ciI6ImJsb2JfaWQifX0=--7b1f0c7c3e5e0a9d2b6f4e1c8a3d5f7e9b2c4a6d"
],
"campaign_id": "58",
"privacy": null,
"options": {}
}
}
}),
});
const data = await response.json();import requests
payload = {
"data": {
"id": "4821",
"type": "scheduled_content",
"attributes": {
"text": "Our spring collection drops Friday. Which color are you picking? 🌸",
"title": None,
"tags": [
"spring-launch",
"instagram"
],
"published_at": "2025-03-14T16:42:07.000Z",
"media": [
"eyJfcmFpbHMiOnsiZGF0YSI6ODgyMTQsInB1ciI6ImJsb2JfaWQifX0=--7b1f0c7c3e5e0a9d2b6f4e1c8a3d5f7e9b2c4a6d"
],
"campaign_id": "58",
"privacy": None,
"options": {}
}
}
}
response = requests.patch('https://api.tintup.com/v2/teams/{team_id}/scheduled_contents/{scheduled_content_id}', json=payload)
data = response.json(){
"data": {
"id": "4821",
"type": "scheduled_content",
"attributes": {
"text": "Our spring collection drops Friday. Which color are you picking? 🌸",
"title": null,
"tags": [
"spring-launch",
"instagram"
],
"published_at": "2025-03-14T16:42:07.000Z",
"media": [
"eyJfcmFpbHMiOnsiZGF0YSI6ODgyMTQsInB1ciI6ImJsb2JfaWQifX0=--7b1f0c7c3e5e0a9d2b6f4e1c8a3d5f7e9b2c4a6d"
],
"campaign_id": "58",
"privacy": null,
"options": {}
}
}
}{
"data": {
"id": "4821",
"type": "scheduled_content",
"attributes": {
"status": "pending",
"text": "Our spring collection drops Friday. Which color are you picking? 🌸",
"published_at": "2025-03-14T16:42:07.000Z",
"created_at": "2025-03-10T09:15:32.000Z",
"updated_at": "2025-03-11T13:02:48.000Z",
"tags": [
"spring-launch",
"instagram"
],
"source": "instagram_business",
"subaccount_id": "17841400008460056",
"privacy": null,
"options": {}
},
"relationships": {
"media": {
"data": [
{
"type": "upload",
"id": "eyJfcmFpbHMiOnsiZGF0YSI6ODgyMTQsInB1ciI6ImJsb2JfaWQifX0=--7b1f0c7c3e5e0a9d2b6f4e1c8a3d5f7e9b2c4a6d"
}
],
"meta": {
"included": false
}
},
"account": {
"data": {
"type": "account",
"id": "1375"
},
"meta": {
"included": false
}
},
"subaccount": {
"data": {
"type": "subaccount",
"id": "17841400008460056"
},
"meta": {
"included": false
}
},
"team": {
"data": {
"type": "team",
"id": "212"
},
"meta": {
"included": false
}
},
"campaign": {
"data": {
"type": "campaign",
"id": "58"
},
"meta": {
"included": false
}
}
}
}
}{
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}{
"errors": [
{
"code": "404",
"title": "Not found",
"status": "404"
}
]
}{
"errors": [
{
"title": "Invalid name",
"detail": "Name can't be blank",
"source": {
"pointer": "/data/attributes/name"
}
}
]
}Retrieve aggregations for scheduled contents
Returns the number of scheduled contents of the team per tag, account and subaccount, across all statuses and dates.
Parameters
team_idintegerrequiredpathThe ID of the team.
Response
The number of scheduled contents of the team per tag, account and subaccount.
Unauthorized. The access token is missing, invalid, expired or revoked.
Forbidden. The access token doesn't have the required scope, the user isn't allowed to perform this action, or the id_token is missing or invalid.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: scheduled_contents:read
curl -X GET 'https://api.tintup.com/v2/teams/{team_id}/scheduled_contents/aggregations'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/scheduled_contents/aggregations', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.tintup.com/v2/teams/{team_id}/scheduled_contents/aggregations')
data = response.json(){
"data": [
{
"id": "account_ids",
"type": "aggregation",
"attributes": {
"buckets": {
"1375": 42,
"1402": 7
}
}
}
]
}{
"errors": [
{
"code": "401",
"title": "Unauthorized",
"status": "401"
}
]
}{
"errors": [
{
"code": "4030000",
"title": "Forbidden",
"status": "403"
}
]
}Webhooks
group_webhooksWebhooks
webhooksA webhook subscribes to exactly one event. Create a separate webhook per event, which lets each one carry its own filter, serialization and body settings. See Receiving Webhooks for how events are delivered, and Webhook Events for what each event contains.
Beyond the endpoint and the event, a webhook can set a filter, the HTTP method, extra request headers, which related resources to include, which fields to keep, and a Liquid template that reshapes the body entirely.
Retrieve a list of webhooks
Returns the webhooks the current user has access to.
Parameters
team_idintegerrequiredpathThe ID of the team.
pageobjectqueryOffset pagination. Use page[size] to set the number of items per page and page[number] to select a page. The response's links object contains ready-to-use URLs for the next and previous pages.
sortstring-idqueryA comma-separated list of fields to sort by. Prefix a field with - to sort in descending order. Defaults to -id (newest first).
Response
A list of webhooks.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: webhooks:read
curl -X GET 'https://api.tintup.com/v2/teams/{team_id}/webhooks'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/webhooks', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.tintup.com/v2/teams/{team_id}/webhooks')
data = response.json(){
"data": [
{
"id": "1",
"type": "webhook",
"attributes": {
"url": "https://hooks.example.com/trueloyal",
"description": "Sync new UGC assets to our DAM.",
"events": [
"asset_created"
],
"status": "active",
"version": 20190326,
"signing_secret": "whsec_8f14e45fceea167a5a36dedd4bea2543",
"filter": {
"form_id": "2012",
"created_at": {
"$gte": "2025-01-01T00:00:00Z"
}
},
"http_method": "post",
"headers": {
"Authorization": "Bearer 3f2a9c71d04b"
},
"payload_include": [
"object.person"
],
"payload_fields": {
"form_submission": [
"data",
"created_at",
"person"
]
},
"payload_transformation_template": "{\"text\": \"New submission {{ data.relationships.object.data.id }}\"}",
"created_at": "2020-01-01T00:00:00.000Z",
"updated_at": "2020-01-01T00:00:00.000Z"
}
}
],
"links": {
"self": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=2",
"first": "https://api.tintup.com/v2/teams/1/tints",
"next": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=3",
"prev": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=1"
}
}Create a webhook
The new webhook is shared with the roles that are granted access to new webhooks and with the current user's role.
Body
The webhook to create.
dataNewWebhookrequiredParameters
team_idintegerrequiredpathThe ID of the team.
Response
The webhook was created.
Unprocessable Entity. The request is missing required parameters or the resource is invalid.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: webhooks:write
curl -X POST 'https://api.tintup.com/v2/teams/{team_id}/webhooks' \
-H 'Content-Type: application/vnd.api+json' \
-d '{
"data": {
"type": "webhook",
"attributes": {
"url": "https://hooks.example.com/trueloyal",
"description": "Forward new contest entries to our CRM.",
"events": [
"form_submission_created"
],
"signing_secret": "whsec_8f14e45fceea167a5a36dedd4bea2543",
"filter": {
"experience_id": "2012"
},
"payload_include": [
"object.person"
],
"payload_fields": {
"form_submission": [
"data",
"created_at",
"person"
]
}
}
}
}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/webhooks', {
method: 'POST',
headers: {
'Content-Type': 'application/vnd.api+json',
},
body: JSON.stringify({
"data": {
"type": "webhook",
"attributes": {
"url": "https://hooks.example.com/trueloyal",
"description": "Forward new contest entries to our CRM.",
"events": [
"form_submission_created"
],
"signing_secret": "whsec_8f14e45fceea167a5a36dedd4bea2543",
"filter": {
"experience_id": "2012"
},
"payload_include": [
"object.person"
],
"payload_fields": {
"form_submission": [
"data",
"created_at",
"person"
]
}
}
}
}),
});
const data = await response.json();import requests
payload = {
"data": {
"type": "webhook",
"attributes": {
"url": "https://hooks.example.com/trueloyal",
"description": "Forward new contest entries to our CRM.",
"events": [
"form_submission_created"
],
"signing_secret": "whsec_8f14e45fceea167a5a36dedd4bea2543",
"filter": {
"experience_id": "2012"
},
"payload_include": [
"object.person"
],
"payload_fields": {
"form_submission": [
"data",
"created_at",
"person"
]
}
}
}
}
response = requests.post('https://api.tintup.com/v2/teams/{team_id}/webhooks', json=payload)
data = response.json(){
"data": {
"type": "webhook",
"attributes": {
"url": "https://hooks.example.com/trueloyal",
"description": "Forward new contest entries to our CRM.",
"events": [
"form_submission_created"
],
"signing_secret": "whsec_8f14e45fceea167a5a36dedd4bea2543",
"filter": {
"experience_id": "2012"
},
"payload_include": [
"object.person"
],
"payload_fields": {
"form_submission": [
"data",
"created_at",
"person"
]
}
}
}
}{
"data": {
"id": "1",
"type": "webhook",
"attributes": {
"url": "https://hooks.example.com/trueloyal",
"description": "Sync new UGC assets to our DAM.",
"events": [
"asset_created"
],
"status": "active",
"version": 20190326,
"signing_secret": "whsec_8f14e45fceea167a5a36dedd4bea2543",
"filter": {
"form_id": "2012",
"created_at": {
"$gte": "2025-01-01T00:00:00Z"
}
},
"http_method": "post",
"headers": {
"Authorization": "Bearer 3f2a9c71d04b"
},
"payload_include": [
"object.person"
],
"payload_fields": {
"form_submission": [
"data",
"created_at",
"person"
]
},
"payload_transformation_template": "{\"text\": \"New submission {{ data.relationships.object.data.id }}\"}",
"created_at": "2020-01-01T00:00:00.000Z",
"updated_at": "2020-01-01T00:00:00.000Z"
}
}
}{
"errors": [
{
"title": "Invalid name",
"detail": "Name can't be blank",
"source": {
"pointer": "/data/attributes/name"
}
}
]
}Retrieve a webhook
Retrieves one of the team's webhooks.
Parameters
team_idintegerrequiredpathThe ID of the team.
webhook_idintegerrequiredpathThe ID of the webhook.
Response
The webhook.
Not Found.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: webhooks:read
curl -X GET 'https://api.tintup.com/v2/teams/{team_id}/webhooks/{webhook_id}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/webhooks/{webhook_id}', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.tintup.com/v2/teams/{team_id}/webhooks/{webhook_id}')
data = response.json(){
"data": {
"id": "1",
"type": "webhook",
"attributes": {
"url": "https://hooks.example.com/trueloyal",
"description": "Sync new UGC assets to our DAM.",
"events": [
"asset_created"
],
"status": "active",
"version": 20190326,
"signing_secret": "whsec_8f14e45fceea167a5a36dedd4bea2543",
"filter": {
"form_id": "2012",
"created_at": {
"$gte": "2025-01-01T00:00:00Z"
}
},
"http_method": "post",
"headers": {
"Authorization": "Bearer 3f2a9c71d04b"
},
"payload_include": [
"object.person"
],
"payload_fields": {
"form_submission": [
"data",
"created_at",
"person"
]
},
"payload_transformation_template": "{\"text\": \"New submission {{ data.relationships.object.data.id }}\"}",
"created_at": "2020-01-01T00:00:00.000Z",
"updated_at": "2020-01-01T00:00:00.000Z"
}
}
}{
"errors": [
{
"code": "404",
"title": "Not found",
"status": "404"
}
]
}Delete a webhook
Deleting a webhook also deletes its events.
Parameters
team_idintegerrequiredpathThe ID of the team.
webhook_idintegerrequiredpathThe ID of the webhook.
Response
No Content. The request succeeded and there is no response body.
Not Found.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: webhooks:write
curl -X DELETE 'https://api.tintup.com/v2/teams/{team_id}/webhooks/{webhook_id}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/webhooks/{webhook_id}', {
method: 'DELETE',
});
const data = await response.json();import requests
response = requests.delete('https://api.tintup.com/v2/teams/{team_id}/webhooks/{webhook_id}')
data = response.json(){
"errors": [
{
"code": "404",
"title": "Not found",
"status": "404"
}
]
}Update a webhook
Updates the webhook.
Body
The webhook changes. Only the attributes you send are changed.
dataIdAsString & objectrequiredParameters
team_idintegerrequiredpathThe ID of the team.
webhook_idintegerrequiredpathThe ID of the webhook.
Response
The webhook.
Not Found.
Unprocessable Entity. The request is missing required parameters or the resource is invalid.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: webhooks:write
curl -X PATCH 'https://api.tintup.com/v2/teams/{team_id}/webhooks/{webhook_id}' \
-H 'Content-Type: application/vnd.api+json' \
-d '{
"data": {
"id": "15",
"type": "webhook",
"attributes": {
"status": "inactive"
}
}
}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/webhooks/{webhook_id}', {
method: 'PATCH',
headers: {
'Content-Type': 'application/vnd.api+json',
},
body: JSON.stringify({
"data": {
"id": "15",
"type": "webhook",
"attributes": {
"status": "inactive"
}
}
}),
});
const data = await response.json();import requests
payload = {
"data": {
"id": "15",
"type": "webhook",
"attributes": {
"status": "inactive"
}
}
}
response = requests.patch('https://api.tintup.com/v2/teams/{team_id}/webhooks/{webhook_id}', json=payload)
data = response.json(){
"data": {
"id": "15",
"type": "webhook",
"attributes": {
"status": "inactive"
}
}
}{
"data": {
"id": "1",
"type": "webhook",
"attributes": {
"url": "https://hooks.example.com/trueloyal",
"description": "Sync new UGC assets to our DAM.",
"events": [
"asset_created"
],
"status": "active",
"version": 20190326,
"signing_secret": "whsec_8f14e45fceea167a5a36dedd4bea2543",
"filter": {
"form_id": "2012",
"created_at": {
"$gte": "2025-01-01T00:00:00Z"
}
},
"http_method": "post",
"headers": {
"Authorization": "Bearer 3f2a9c71d04b"
},
"payload_include": [
"object.person"
],
"payload_fields": {
"form_submission": [
"data",
"created_at",
"person"
]
},
"payload_transformation_template": "{\"text\": \"New submission {{ data.relationships.object.data.id }}\"}",
"created_at": "2020-01-01T00:00:00.000Z",
"updated_at": "2020-01-01T00:00:00.000Z"
}
}
}{
"errors": [
{
"code": "404",
"title": "Not found",
"status": "404"
}
]
}{
"errors": [
{
"title": "Invalid name",
"detail": "Name can't be blank",
"source": {
"pointer": "/data/attributes/name"
}
}
]
}Webhook Event Log
webhook_eventsEvery event we send is recorded with the payload, its delivery status and, with include=attempts, each
delivery attempt and your endpoint's response. Use these endpoints to debug your endpoint or to recover events
you missed. The event id is the data.id of the payload.
Retrieve a list of webhook events
Returns the events recorded for a webhook, with the payload we sent and their delivery status.
Parameters
team_idintegerrequiredpathThe ID of the team.
webhook_idintegerrequiredpathThe ID of the webhook.
pageobjectqueryOffset pagination. Use page[size] to set the number of items per page and page[number] to select a page. The response's links object contains ready-to-use URLs for the next and previous pages.
filterobjectqueryFilters the webhook events.
sortstring-idqueryA comma-separated list of fields to sort by. Prefix a field with - to sort in descending order. Defaults to -id (newest first).
includeArray<string>attemptsqueryA comma-separated list of related resources to include. attempts returns the delivery attempts.
Response
A list of webhook events.
Not Found.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: webhooks:read
curl -X GET 'https://api.tintup.com/v2/teams/{team_id}/webhooks/{webhook_id}/events'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/webhooks/{webhook_id}/events', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.tintup.com/v2/teams/{team_id}/webhooks/{webhook_id}/events')
data = response.json(){
"data": [
{
"id": "1",
"type": "event",
"attributes": {
"payload": "{\"data\":{\"id\":\"1377451\",\"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\":[]}",
"status": "success",
"version": 20190326,
"created_at": "2020-01-01T00:00:00.000Z"
},
"relationships": {
"attempts": {
"data": [
{
"type": "attempt",
"id": "2210987"
}
],
"meta": {
"included": false
}
}
}
}
],
"included": [
{
"id": "1",
"type": "attempt",
"attributes": {
"webhook_url": "https://hooks.example.com/trueloyal",
"response_status": "200",
"response_body": "{\"received\":true}",
"response_headers": {
"content-type": "application/json"
},
"created_at": "2020-01-01T00:00:00.000Z"
}
}
],
"links": {
"self": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=2",
"first": "https://api.tintup.com/v2/teams/1/tints",
"next": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=3",
"prev": "https://api.tintup.com/v2/teams/1/tints?page%5Bnumber%5D=1"
}
}{
"errors": [
{
"code": "404",
"title": "Not found",
"status": "404"
}
]
}Retrieve a webhook event
Retrieves one of the webhook's events, with the payload we sent and its delivery status.
Parameters
team_idintegerrequiredpathThe ID of the team.
webhook_idintegerrequiredpathThe ID of the webhook.
webhook_event_idintegerrequiredpathThe ID of the webhook event (the data.id of the payload we sent).
includeArray<string>attemptsqueryA comma-separated list of related resources to include. attempts returns the delivery attempts.
Response
The webhook event.
Not Found.
Authorization
access_tokenoauth2OAuth 2.0 authorization code flow.
Scopes: webhooks:read
curl -X GET 'https://api.tintup.com/v2/teams/{team_id}/webhooks/{webhook_id}/events/{webhook_event_id}'const response = await fetch('https://api.tintup.com/v2/teams/{team_id}/webhooks/{webhook_id}/events/{webhook_event_id}', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.tintup.com/v2/teams/{team_id}/webhooks/{webhook_id}/events/{webhook_event_id}')
data = response.json(){
"data": {
"id": "1",
"type": "event",
"attributes": {
"payload": "{\"data\":{\"id\":\"1377451\",\"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\":[]}",
"status": "success",
"version": 20190326,
"created_at": "2020-01-01T00:00:00.000Z"
},
"relationships": {
"attempts": {
"data": [
{
"type": "attempt",
"id": "2210987"
}
],
"meta": {
"included": false
}
}
}
},
"included": [
{
"id": "1",
"type": "attempt",
"attributes": {
"webhook_url": "https://hooks.example.com/trueloyal",
"response_status": "200",
"response_body": "{\"received\":true}",
"response_headers": {
"content-type": "application/json"
},
"created_at": "2020-01-01T00:00:00.000Z"
}
}
]
}{
"errors": [
{
"code": "404",
"title": "Not found",
"status": "404"
}
]
}