Temso

Getting started

Export Temso's AI visibility data into your own tools, and publish finished articles to your CMS.

Temso tracks how your brand and competitors appear across AI engines — ChatGPT, Google AI Overviews and AI Mode, Microsoft Copilot, Perplexity, Gemini, and Grok. There are three ways to connect it to your own tools:

  • REST API — pull raw responses, mentions, citations, and analytics into BI tools and custom integrations.
  • MCP server — connect AI assistants like Claude, Cursor, or ChatGPT directly to your Temso data.
  • Publishing — send finished articles to your CMS through Zapier, Make, or your own endpoint.

Base URL

https://api.temso.ai/v1

Authentication

Every request needs an API key in the Authorization header:

Authorization: Bearer tms_<key>

Create keys in the Temso app under Organization Settings → API Keys. Each key is scoped to one or more projects — endpoints only return data for projects the key can access.

Quickstart

List the projects your key can access:

curl "https://api.temso.ai/v1/projects" \
  -H "Authorization: Bearer tms_your_key"

Then pull AI responses for a project:

curl -G "https://api.temso.ai/v1/projects/PROJECT_ID/prompts/responses" \
  -H "Authorization: Bearer tms_your_key" \
  --data-urlencode "filter[startDate]=2026-05-01" \
  --data-urlencode "filter[endDate]=2026-05-31" \
  --data-urlencode "limit=100"

Pagination

List endpoints take flat page and limit query parameters and return a pagination object alongside the data:

{
  "data": [],
  "pagination": { "page": 1, "limit": 50, "total": 230 }
}

page is 1-indexed and defaults to 1. limit defaults to 50 with a maximum of 1000.

Filters

Data endpoints use bracket-scoped filter parameters so they never collide with pagination:

?filter[startDate]=2026-05-01&filter[endDate]=2026-05-31&filter[models]=openai/chatgpt,perplexity/search

filter[startDate] and filter[endDate] are required on data endpoints, and the range cannot exceed 90 days. Multi-value filters (languages, countries, models, brandIds, …) take comma-separated values. See the API reference for each endpoint's filters.

Every response and source row carries a runId — the ID of the monitor execution (scheduled or manually triggered) that produced it. Pass it as filter[runId] on List AI Responses and List Sources to isolate the rows of one run. Rows collected before run tracking existed return null.

Errors

Errors return a JSON body with a machine-readable code:

{
  "code": "UNAUTHORIZED",
  "status": 401,
  "message": "Invalid API key"
}
StatusMeaning
400Bad request — missing or invalid parameters
401Unauthorized — missing or invalid API key
403Forbidden — account inactive, project not allowed, or missing scope
404Not found
500Internal server error

On this page