Superhuman Docs (Coda) Tables & Pages
Use a Coda doc (now Superhuman Docs) as the team's database: find a doc from its browser link, read pages and table rows with column-name queries, add or upsert rows by key column, update a row, press a row's button, and poll the mutation status until the change lands.
Connect this API to an AI agent Browse all specs
What you can do with Superhuman Docs (Coda) Tables & Pages via MCP
Every endpoint below becomes a governed tool your AI agent (Claude, ChatGPT, or a customer-facing VX agent) can call — with scoped permissions, sandbox testing, and audit logs.
| Method | Path | Operation | Description |
|---|---|---|---|
| GET | /whoami |
whoami | Check the token and show which account it belongs to |
| GET | /resolveBrowserLink |
resolveBrowserLink | Turn a doc, page or table link from the browser into API ids |
| GET | /docs |
listDocs | List or search docs you can access |
| GET | /docs/{docId} |
getDoc | Get a doc's name, owner and links |
| GET | /docs/{docId}/pages |
listPages | List the pages in a doc |
| GET | /docs/{docId}/pages/{pageIdOrName} |
getPage | Get one page's details |
| GET | /docs/{docId}/pages/{pageIdOrName}/content |
listPageContent | Read the text content of a page |
| GET | /docs/{docId}/tables |
listTables | List the tables and views in a doc |
| GET | /docs/{docId}/tables/{tableIdOrName}/columns |
listColumns | List a table's columns and their types |
| GET | /docs/{docId}/tables/{tableIdOrName}/rows |
listRows | List or filter table rows (e.g. query "Status":"Open") |
| POST | /docs/{docId}/tables/{tableIdOrName}/rows |
upsertRows | Add rows, or update matching rows when key columns are given |
| GET | /docs/{docId}/tables/{tableIdOrName}/rows/{rowIdOrName} |
getRow | Get one row's values |
| PUT | /docs/{docId}/tables/{tableIdOrName}/rows/{rowIdOrName} |
updateRow | Change cells in one row |
| POST | /docs/{docId}/tables/{tableIdOrName}/rows/{rowIdOrName}/buttons/{columnIdOrName} |
pushButton | Press a button column on a row (runs its action) |
| GET | /mutationStatus/{requestId} |
getMutationStatus | Check whether a queued write has been applied |
Authentication
codaToken
Bearer token — sent as Authorization: Bearer <token>
Superhuman Docs (formerly Coda) API token sent as Authorization: Bearer <token>.
How to get a credential
- Sign in and open Account settings (click your avatar > Account settings).
- Scroll to API settings and click Generate API token.
- Name it (e.g. "VX Agents"). Optionally add restrictions: limit it to one doc or table, and to Read only or Read and write.
- Copy the token now: it is shown only once.
Permissions used
Tokens have no named scopes. Access follows your own doc permissions plus any restriction set on the token.
| Token access | Operations |
|---|---|
| Read (any token) | whoami, listDocs, getDoc, resolveBrowserLink, listPages, getPage, listPageContent, listTables, listColumns, listRows, getRow, getMutationStatus |
| Read and write on the table | upsertRows, updateRow, pushButton |
Common errors
- 401 Unauthorized: the token is missing, mistyped or deleted.
- 403 Forbidden: the token is restricted to another doc or table, is read-only, or you lost access to the doc.
- 404 Not Found: wrong doc id, or a table/column name that does not match exactly. Use ids, or check with listTables/listColumns.
- 400 Bad Request: malformed
query(use"Column name":"value") or row cells that do not match the columns. - 429 Too Many Requests: reads allow about 100 requests per 6 seconds, writes 10 per 6 seconds, listDocs 4 per 6 seconds. Wait and retry.
Store the token as a VX Agents credential (bearer token) and never paste it into chat.
Usage guide
Setup
- Credential: a Superhuman Docs (formerly Coda) API token as a bearer token. For an agent, restrict it to the one doc it should use.
- Base URL
https://coda.io/apis/v1.https://docs.superhuman.com/apis/v1serves the same API. - Preset worth pinning:
docId, andtableIdOrNamefor the main table. Get them once withresolveBrowserLink(url= the link the user copies from the browser). Ids look likegrid-abc123(table) andc-xyz(column).
Read and update a table
listTablesfor the doc, thenlistColumnsfor the table you need. Note each column's exact name and type.listRowswithuseColumnNames=true(cells keyed by name instead of id) andvalueFormat=simple. Filter withqueryas"Status":"Open"(column name in double quotes, a colon, then a JSON value). Page withlimitandnextPageToken→pageToken.getRowfor one row by id.- Add or update rows:
upsertRowswithrows: [{"cells": [{"column": "Email", "value": "[email protected]"}, {"column": "Status", "value": "Booked"}]}]. PasskeyColumns: ["Email"]to update a matching row instead of adding a duplicate. - Change one known row:
updateRowwithrow: {"cells": [...]}. - Writes return 202 and a
requestId. PollgetMutationStatusuntilcompletedis true (usually a few seconds) before reading the row back.
Ask the user to confirm before upsertRows, updateRow and pushButton. They change shared data, and a button can run any action in the doc (send email, write other tables, call Packs).
Pages
listPagesandgetPagefor the outline.listPageContent(contentFormat=plainText) returns a page's text so you can read notes, SOPs or meeting docs.
Good to know
- Names work in place of ids, but if two rows or columns share a name an arbitrary one is used. Prefer ids for writes.
- Rate limits: reads ~100 per 6 s, writes 10 per 6 s,
listDocs4 per 6 s. 429 means wait and retry. listDocsonly returns docs you have opened at least once. Usequeryto search by title.- Dates in cells are ISO 8601 strings. Lookup and multi-select values are arrays.
- Source: Superhuman Docs API reference (https://docs.superhuman.com/developers/apis/v1), checked 2026-10-16.
How to use this spec
- Create a free VX Agents account (sandbox tools included).
- Open the marketplace and connect “Superhuman Docs (Coda) Tables & Pages” to an agent.
- Expose it as an MCP server for Claude/ChatGPT, or chat with it directly.