Post Track API
Bring your monitor's comments into your own systems, already classified by sentiment and tagged by your team: a BI dashboard, a CRM, a data warehouse or an alert of your own. The API is read-only, speaks JSON over HTTPS and authenticates with a token you create in the app.
- Base URL
https://api.posttrack.com.br/public/v1- Authentication
Authorization: Bearer ptk_…- Format
- JSON, dates in ISO 8601 (UTC)
- Rate limit
- 600 requests per minute per token
Quickstart
- In the web app, open the monitor, go to Settings › API access tokens and choose Create token. Only the monitor's owners and admins see this screen.
- Name the token after the system that will use it, keep the "Read comments" permission and pick when it expires.
- Copy the token, which starts with ptk_. It is shown only once: store it in your secrets manager or as an environment variable.
- Make your first request:
curl "https://api.posttrack.com.br/public/v1/comments?max=50" \
-H "Authorization: Bearer $POST_TRACK_TOKEN"Authentication
Send the token in the Authorization header of every request, after the word Bearer. Requests without a valid token get a 401.
Authorization: Bearer ptk_...- A token belongs to one monitor and only reads that monitor's data. To read several monitors, create a token in each one.
- Tokens expire in 30, 90 or 365 days, or never, as chosen when created. The token list shows when each one was last used.
- Revoking a token on the same screen stops it immediately. Revoke it whenever it may have leaked, and create a new one.
- Keep the token on your server. The API accepts calls from a browser, but a token shipped in a web page or app can be read by anyone who opens it.
List comments
GET/public/v1/comments
Returns the monitor's comments, newest first, with the total that match the filters.
Query parameters
maxinteger- How many comments to return, from 1 to 200. Defaults to 50.
offsetinteger- How many comments to skip, for paging. Defaults to 0.
sinceISO 8601- Only comments published at or after this instant, e.g. 2026-09-01T00:00:00Z.
untilISO 8601- Only comments published at or before this instant.
sentimentstring- One of positive, negative, neutral or unclassified.
platformstring- One of facebook, instagram, tiktok, twitter, youtube, tripadvisor or googlenews.
Example
curl "https://api.posttrack.com.br/public/v1/comments?sentiment=negative&platform=instagram&since=2026-09-01T00:00:00Z" \
-H "Authorization: Bearer $POST_TRACK_TOKEN"{
"total": 128,
"data": [
{
"id": "c0a8012e-...",
"message": "Three days waiting for an answer in the DMs.",
"platform": "instagram",
"sentiment": "negative",
"permaLink": "https://www.instagram.com/p/...",
"likeCount": 4,
"replied": false,
"fromOwner": false,
"parentId": null,
"publishedAt": "2026-09-02T14:31:08Z",
"instagramMedia": {
"id": "...",
"message": "Our spring collection is here",
"permaLink": "https://www.instagram.com/p/...",
"publishedAt": "2026-09-01T12:00:00Z",
"instagramAccount": { "id": "...", "name": "Your brand", "username": null }
},
"facebookPost": null,
"tiktokVideo": null,
"twitterPost": null,
"youtubeVideo": null,
"tripadvisorLocation": null,
"tags": ["Customer service", "Delivery"]
}
]
}Get a comment
GET/public/v1/comments/{id}
Returns a single comment of the monitor by its id, in the same shape as an item of the list.
curl "https://api.posttrack.com.br/public/v1/comments/c0a8012e-..." \
-H "Authorization: Bearer $POST_TRACK_TOKEN"Pagination
Lists are paged with max and offset. The response's total says how many comments match, so you know when to stop. To sync continuously, filter with since from the publishedAt of the last comment you stored.
const comments = []
for (let offset = 0; ; offset += 200) {
const response = await fetch(
`https://api.posttrack.com.br/public/v1/comments?max=200&offset=${offset}`,
{ headers: { Authorization: `Bearer ${token}` } }
)
const page = await response.json()
comments.push(...page.data)
if (page.data.length === 0 || comments.length >= page.total) break
}Rate limits
Each token can make 600 requests per minute, counted over a sliding window. Every response tells you where you stand:
X-RateLimit-Limit- Requests allowed per window.
X-RateLimit-Remaining- Requests left in the current window.
X-RateLimit-Reset- When the window frees up again, as a Unix timestamp in seconds.
Retry-After- Only on a 429: seconds to wait before trying again.
Errors
Errors use the HTTP status and a JSON body with a readable message, in English or Portuguese according to the Accept-Language header.
{
"message": "Invalid API access token."
}400- A query parameter is invalid, such as max above 200 or an unknown sentiment.
401- The token is missing, malformed, revoked or expired.
403- The token lacks the comments:read permission, the monitor is inactive or its project is not on the Ultimate or Enterprise plan.
404- The comment does not exist or belongs to another monitor.
429- Too many requests. Wait the seconds in Retry-After and try again.
500- Something failed on our side. Try again later and, if it persists, write to us.
Plans and versioning
The API is part of the Ultimate and Enterprise plans. If a project moves to a lower plan, its tokens are kept but the API refuses them until the plan goes back up.
The version is in the path (/public/v1). New fields and endpoints may be added to it at any time, so ignore fields you do not know; a change that breaks existing integrations comes in a new version, announced in advance.
Questions or need an endpoint that is not here? Write to suporte@diamovi.com.br.
The comment object
idstringmessagestringplatformstringsentimentstringpermaLinkstringlikeCountintegerrepliedbooleanfromOwnerbooleanparentIdstringpublishedAtISO 8601facebookPost, instagramMedia, tiktokVideo, twitterPost, youtubeVideoobjecttripadvisorLocationobjecttagsstring[]Each profile in a post (a page, an account or a channel) comes as an object with id, name and username; username is only filled for TikTok and X.