Skip to main content
The Tempo API gives you HTTP access to deals, deal state, proposed CRM updates, action items, meetings, Themes, and Tempo’s query engine. Use it for dashboards, ETL, internal tools, and scheduled jobs. If you are building an AI agent, the MCP server is the better fit. It exposes a broader, self-describing surface and authenticates each user with OAuth. See which surface to use.

Base URL

Authentication

Every request needs an organization API key sent as a Bearer token:
Treat your API key like a password. A key belongs to your organization, not to the person who created it, and anyone holding it acts for the whole organization. Keep it server-side, never ship it in a browser bundle or mobile app, and never commit it.

Manage keys

API keys live in the Tempo web app under Settings → API Keys. Only an organization admin can open that page. If you are building an integration and are not an admin, ask one to issue a key for you.
1

Create a key

Click Create Key and give it a name that identifies the integration it is for. One name per integration keeps the list readable later.
2

Copy the secret immediately

Tempo shows the key’s value exactly once, at creation. Copy it straight into your secret store. After you close the dialog, the value cannot be retrieved. The list shows that the key exists, not what it is.
3

Watch usage

The list shows each key’s name, creation date, and Last used date. A key that has not been used in a long time is a candidate for deletion.
4

Delete a key you no longer need

Click the delete control next to the key and confirm Delete key. Tempo rejects a deleted key on its next request.

Rotate a key

Rotate a key by creating its replacement first, then deleting the old one:
1

Create a second key

Create a new key on the API Keys page and copy its value.
2

Switch your integrations over

Update every service that authenticates with the old key. Both keys work at once, so you can cut over one service at a time with no downtime.
3

Delete the old key

Once nothing uses it, delete the old key. If a key has leaked, delete it right away and contact support so we can check for unexpected use.

What a key is authorized to do

API keys are organization-owned. The identity a request runs as depends on whether you narrow it: A bare key is an organization principal. It is not a stand-in for the user who created it, and it is not limited by that user’s visibility. Treat a key as organization-wide access and narrow it deliberately when you do not want that. To run a request as one member, send the X-Acting-User header with that member’s user ID or email:
Every API-key endpoint accepts X-Acting-User. The value must name a member of your organization; otherwise the request fails with 403. What the header changes depends on the endpoint. For example, GET /meetings reads the acting member’s calendar, and the Themes endpoints apply the acting member’s role to evidence access. Deal reads on the read endpoints stay organization-wide either way. The query endpoints are organization-bounded and scope to a member through the request body instead, with scope: { as: "user", user: "<id or email>" }.

What’s available

Read

Session context, deals, deal state, action items, meetings, and the sales process.

Deal updates

GET /api/v1/deal-updates lists the CRM field updates Tempo proposed or wrote from evidence. Read-only; review happens in the app.

Themes

GET /api/v1/themes and GET /api/v1/themes/{id} browse recurring Themes across the organization, when available.

Signal activity

Read where live signals appeared and the observations behind them.

Query

Describe entities, then filter, aggregate, and fetch across opportunities, accounts, and contacts with a typed field catalog.

Agentic search

POST /api/v1/agentic-search/deal-context returns cited deal evidence. Set detail to summary for a prose answer.

Read search results

POST /api/v1/agentic-search/deal-context returns the first page of a saved search and its run_id. Evidence is the default. Set detail to summary when you need an answer in prose with citations. Check coverage before treating a partial result as complete. Read later pages with GET /api/v1/agentic-search/deal-context/runs/{run_id}. Pass catalog.next_cursor as catalog_cursor to continue evidence. Pass answer.next_cursor as answer_cursor to continue the summary. Read an oversized evidence item with its evidence_marker, then follow detail.next_cursor as detail_cursor. These reads use the saved run.

Search effort

Omit budget_mode to use auto. A request for one deal, named in deal_id or deal_ids, starts at instant. Other requests start at medium (Balanced) and may continue at high when more work is useful. Set instant, medium, or high when you need a specific effort level.

The query API

Most of the surface is straightforward REST. The query endpoints are worth understanding before you use them, because they are the most capable part. The pattern is describe, then query:
1

Discover what you can query

GET /api/v1/query/describe returns every queryable entity and the users you can scope to.
2

Get an entity's fields

GET /api/v1/query/describe/{entity} returns a typed field catalog, including custom CRM fields as virtual columns.
3

Search, aggregate, or fetch

POST /api/v1/query/{entity} filters to matching IDs. /aggregate does group-by with measures. /fetch retrieves rows by ID with optional relational expansion.
Describe first rather than hardcoding field names. Field catalogs differ per organization because they reflect your CRM. Observations are not queryable over REST; use the MCP server or agentic search for them.

Deal updates

GET /api/v1/deal-updates returns the same payload as the MCP list_deal_updates tool. By default it lists pending updates on open, non-renewal deals touched in the last 30 days, with no-op proposals hidden. Pass status=approved for updates already written to the CRM, deal_state=all to include closed deals, and max_days_since_update to widen the window. Each update carries the proposed and current values, the write mode, and sources that cite the observations and artifacts behind it. This endpoint never writes to the CRM. Pending proposals can be reviewed in the Tempo app or through the MCP manage_fields tool.

Themes

The Themes endpoints take the same parameters as the MCP search_themes and get_theme tools, read from the query string. List parameters such as sources, types, families, statuses, and include accept comma-separated or repeated values. Unknown parameters return 400. Despite their names, all_time_* counts cover a limited range, not all history. The new status means first seen within that range during the selected period. See Choose a period. A nonempty query without days, from, to, statuses, or sort=growth defaults to 365 days. first_seen_at, last_seen_at, and themes_through also use the longer range. Every successful response carries an availability field. It is hidden if Themes is turned off for your organization and unpublished until the first themes are built. While Themes is ready, a theme lookup returns 404 for an unknown or filtered-out ID. A topic lookup also returns 404 in that case when topic grouping is on. When topic grouping is off, a topic lookup returns topic: null with 200. While hidden or unpublished, GET /api/v1/themes/{id} returns a null resource with 200. Hidden and unpublished responses also include a next_step field that explains why there are no themes to read. A read that cannot finish in time returns 503. Try again later or use a shorter window. Themes responses can include computed_at, the UTC time when counts were computed. The first page of GET /api/v1/themes without a query or deal_id can reflect counts computed up to six hours earlier. Searches, deal_id lists, later pages, and GET /api/v1/themes/{id} are computed for each call. Pages can have different computation times, so a theme may repeat or be missed when counts change between pages.

Signal activity

These read-only endpoints show where live signals appeared. Use them to build account lists or inspect cited observations without opening each signal in the app. An organization API key reads signal activity across the whole organization, including deals that other endpoints hide. Add X-Acting-User to limit signal rows to deals the named member can see. For paged results, follow next_cursor to read more rows. If a cursor is stale, start again from the first page.

Rate limits

Usage limits are described on Usage and limits.

Deprecated: Canvas

The Canvas REST surface is deprecated. POST /api/v1/canvas/generate and GET /api/v1/canvas/generate/{runId} still respond, but each response carries a Deprecation: true header and a Link header pointing at the successor route, /api/v1/canvases/{canvasId}/runs. Do not build new integrations on either route. A sunset date will be announced in the changelog.

Reference

Full endpoint reference, including request and response schemas, is in the pages that follow.