What is the Loopster API for?
The API lets you manage tables, columns, rows and processing in your Loopster workspace from your own code or tools. For example, your code can create a table, add rows to it, run enrichment on those rows and read the results back. The section "What can the API manage?" below gives an overview.
Everything you do happens in the one workspace that owns your key.
What is the base URL?
The base URL is https://app.loopster.ai/api. Every endpoint path starts with /v1, so a full address looks like https://app.loopster.ai/api/v1/tables. The version is part of the path.
Where is the OpenAPI spec?
Loopster publishes the API as an OpenAPI 3.0.3 file in JSON at https://app.loopster.ai/openapi.json. Open it to see the endpoints and what each one takes and returns. Tools that read OpenAPI files can load it.
How do I get an API key?
Open Settings, then Loopster API.
Under Create a key, type a name, pick a role and pick when the key ends.
Click Create key.
A Loopster API key starts with loopster_sk_. The page lists each saved key with only its last four characters. Keep your keys secret and do not share them publicly.
The role decides what a key can do. The menu offers Member — read only, Editor — read, write and run and Admin — everything an API key can do. Give a key the least access it needs. Each key belongs to one workspace.
For every field on the form, and for how to revoke a key, see Create and revoke a Loopster API key.
How do I send my key?
Send your key as a Bearer token in the Authorization header.
Authorization: Bearer loopster_sk_…
The key decides which workspace you work in. No endpoint takes a workspace id or name. A call that reaches for another workspace's data is refused.
In the OpenAPI spec, one call takes no Authorization header. It is a table's inbound webhook address, described in the Good to know section at the end.
What does a response look like?
Responses are JSON. A successful response has "success": true. A failed response has "success": false and an error message. Some failed responses also carry a code you can check in your code, and extra fields that explain the refusal.
For example, a key that is past its expiry gets HTTP status 401 and a body like this. The error text holds the expiry date.
{"success": false, "error": "…", "code": "key_expired"}
How do I make my first request?
Start with calls that only read. Replace loopster_sk_… with your own key.
Check your key with
GET /v1/key. Runcurl https://app.loopster.ai/api/v1/key -H "Authorization: Bearer loopster_sk_…"List your tables with
GET /v1/tables. Runcurl https://app.loopster.ai/api/v1/tables -H "Authorization: Bearer loopster_sk_…"
GET /v1/key returns details of the key you call it with, including its id, name, role, when it was created, when it expires and when it was last used. expiresAt is null for a key that never expires. The call never returns the key itself, and any role may use it.
GET /v1/tables lists the tables in your workspace, newest first. Without pageSize, every matching table comes back in one answer. In a large workspace, add pageSize (1 to 500) and send the nextCursor from each answer back as cursor to get the next page. You can also narrow the list with search (part of a name, ignoring case) or folderId. See List Tables in the API Reference.
Both calls only read. Neither is one of the calls that can start paid work, which are listed below. Add -i to a curl command to see the HTTP status code.
What can the API manage?
Tables, workbooks and folders:
/v1/tables,/v1/workbooks,/v1/foldersand/v1/trash. Every table is in exactly one workbook, and a folder holds workbooks.DELETE /v1/tables/{tableId}moves a table to Trash, and you can restore it for 30 days.Columns and views:
/v1/tables/{tableId}/columnslists columns and creates them from templates, and/v1/tables/{tableId}/columns/templateslists the templates./v1/tables/{tableId}/viewsmanages saved views.Rows and cells:
/v1/tables/{tableId}/rowslists, inserts and deletes rows./v1/tables/{tableId}/rows/{rowId}reads or updates one row./v1/tables/{tableId}/cellsupdates many cells in one request.Running enrichment:
/v1/tables/{tableId}/triggerstarts processing,/v1/tables/{tableId}/stopstops it and/v1/tables/{tableId}/statusshows progress./v1/runslists runs and/v1/runs/{runId}reads one run.Import, export and sharing: a file import takes three steps: get an upload address, upload the file, then import it.
/v1/tables/{tableId}/exportsexports a table or a view as CSV or JSON lines./v1/tables/{tableId}/sharesmanages public, read-only links to a table.Search:
POST /v1/searchfinds people or companies in Loopster Data, andGET /v1/search/filterslists the filters you can use.Capabilities and Functions:
/v1/capabilitieslists enrichment actions you can run without building a table./v1/functionsmanages reusable workflows and runs them.Schedules:
/v1/tables/{tableId}/schedulesruns columns on a schedule.Webhooks: a table can have an inbound webhook address that accepts new rows.
/v1/webhook-endpointsregisters an https URL that Loopster calls when one of the workspace's runs settles.Wallet, usage and connections:
/v1/walletshows the wallet and/v1/usageshows what the workspace spent./v1/connections,/v1/provider-defaultsand/v1/contextscover connections, provider defaults and contexts.Feedback:
POST /v1/feedbacksends feedback to the Loopster team.
Which calls can spend from my wallet?
Some calls start paid work. Paid work is taken from your wallet in US dollars. These calls can start it, and the MCP tool for each is in parentheses:
POST /v1/tables/{tableId}/trigger(trigger_rows) runs enrichment on rows. WithoutrowIdsit runs every row.POST /v1/functions/{functionId}/runs(run_function) runs a Function. Each step bills as it would in a table.POST /v1/capabilities/{templateId}/runs(run_capability) runs one enrichment action without a table. It spends unless it runs on your own connection.POST /v1/tables(create_table) spends when you create a table from a paid starter. A blank table, a webhook table and a search table are free.POST /v1/tables/{tableId}/rows(insert_rows) and a table's inbound webhook can spend when the table'sautoplaysetting is on. Withautoplayon, the rows you insert are queued for processing.PATCH /v1/tables/{tableId}/rows/{rowId}(update_row) andPATCH /v1/tables/{tableId}/cells(update_cells) can also start paid work. On a table with auto-rerun columns, writing a cell re-queues the columns that read it, and that spends from your wallet.POST /v1/tables/{tableId}/schedules(create_schedule) spends every time the schedule fires, with nobody watching, until you pause or delete it. Resuming a paused schedule (update_schedulewithpaused: false) does the same.
These do not spend by themselves: a trigger dry run (estimate_trigger_cost in MCP), searching Loopster Data (search_people and search_companies), importing a file, exporting a table, and inserting rows into a table whose autoplay is off.
Before you run anything that spends:
Price it first. Add
?dryRun=trueto the URL of the trigger call. Nothing is queued and nothing is charged. PutdryRunin the URL, not in the body.Name the rows. Send
rowIds, and run 10,000 rows or fewer in one request.Set a cap. Send
maxCostUsdwith the trigger. If the estimate is higher than the cap, the run is refused before it starts. The cap is a check at the start, not a meter.Check
autoplay. Read the table withGET /v1/tables/{tableId}before you insert rows.Set a column up before you run it. A column left on a template's defaults runs on those defaults and bills for them.
A trigger or a Function run holds its worst-case cost from your wallet first, and you are charged what it really cost, never more. If the wallet cannot cover even the first row or input, the call is refused with a 402 before anything is queued. If it covers only some of them, the rest are refused, not run and not charged.
To stop a table's processing, call POST /v1/tables/{tableId}/stop (stop_run). Queued work is removed before it starts, so nothing is charged for it. Work that is already running can still finish and be billed, and work that was already charged is not refunded. The answer's stillRunning count says how many cells may still run and bill. A null count means not reported, not zero.
Read your balance with GET /v1/wallet and your spend with GET /v1/usage. In the app, see Your wallet and keeping spend under control. For dry runs, caps and what happens when the wallet runs short, see Trigger Processing in the API Reference.
Where is the API documentation?
The API documentation is the API Reference at docs.loopster.ai. The API Introduction shows the base URL and the OpenAPI file. The Authentication page shows how to send your key. The Error Codes page shows the error format.
In the app, open Settings. The bottom of the left menu has Help & support and API Docs. API Docs opens docs.loopster.ai.
If a docs page does not match what the API did, tell the team with POST /v1/feedback, or click Need Help? at the top right of any page to start a conversation. Do not put API keys or passwords in a feedback message or in the chat.
How does the API relate to MCP?
MCP lets an AI tool work in Loopster for you. Loopster runs an MCP server at https://app.loopster.ai/api/mcp. Its tools cover tables, workbooks and folders, columns, rows, imports and exports, running enrichment, search, the wallet, Functions, views, share links, schedules, connections, webhooks and contexts. Many do the same job as an API call. For example, list_tables lists your tables like GET /v1/tables, insert_rows adds rows like POST /v1/tables/{tableId}/rows, and trigger_rows runs enrichment like POST /v1/tables/{tableId}/trigger.
Use the API when your own code calls Loopster. Use MCP when you want an AI tool to do the work.
You can sign in to the MCP server through OAuth, or send an API key in an
Authorization: Bearerheader. A token from the OAuth sign-in is not an API key, soGET /v1/keyanswers 400 for it.When you use an API key, MCP tools work in the one workspace that owns that key.
The tool descriptions carry the same role rules as the API.
A tool that starts paid work spends from your wallet, like the matching API call.
MCP calls count toward your workspace's rate limits like any other authenticated call.
To add the server to Claude Code, run
claude mcp add --transport http loopster https://app.loopster.ai/api/mcp. To authenticate with an API key, add--header "Authorization: Bearer loopster_sk_…"to the same command.
For the list of tools, see MCP Tools in the API Reference. For the endpoint and the Claude Code setup, see MCP Server.
Troubleshooting
I get a 401
What you see: HTTP status 401 and "success": false. If the key is past its expiry, code is key_expired and error holds the date.
Why it happens: A 401 comes back when the Authorization header is missing or the key is past its expiry.
What to do: Send Authorization: Bearer loopster_sk_… with your calls. To see when a key ends, open Settings, then Loopster API. You choose a key's expiry when you create it, and it cannot be changed afterwards. To replace an expired key, create a new one.
I get a 403
What you see: HTTP status 403. When a role is the cause, the body also has requiredRole and role.
Why it happens: The call is not allowed. The reasons include a key whose role is below what the call needs, and a resource that belongs to another workspace.
What to do: If requiredRole is higher than your role, use a key with that role. A key belongs to one workspace, so use the key of the workspace that owns the resource.
I get a 400 when a call has an id in the path
What you see: HTTP status 400 on a call with a table, row, view, function or run id in the path.
Why it happens: Those ids are UUIDs. An id that is not a UUID gets a 400 before Loopster looks anything up. A placeholder such as {tableId} left in the URL is not a UUID.
What to do: List your tables with GET /v1/tables and copy the id of the table you want. Column ids look different: they start with col_.
I get a 402
What you see: HTTP status 402 on a call that would start paid work. The body has a code, plus requiredUsd and spendableUsd.
Why it happens: A limit stopped a call that would start paid work. Nothing was created, queued or charged. The code says which limit refused the call.
What to do: Match the code:
insufficient_balance: your wallet cannot cover the call. Top up or ask for less. Click the wallet button at the top right, then Manage wallet. Settings opens on Plan & billing, on the Wallet tab, which has a Top up button.workspace_limit: the workspace's own spend limit leaves less than the wallet. Raise the limit or ask for less. Open Settings, then Workspaces, click the workspace and change its Spend limit with Set spend limit.daily_cogs_limit: the account reached its daily spend safety limit. Topping up does not lift it. It resets at midnight UTC, and Loopster support can raise it. See Contact support.
I get a 429
What you see: HTTP status 429.
Why it happens: A rate limit was reached, and nothing was done.
What to do: Wait the number of seconds in the Retry-After header, then send the call again.
Good to know
Keys are created and revoked in the app only. The API has one call about keys,
GET /v1/key, and it only reads the key you call it with.In the OpenAPI spec, one call takes no key:
POST /v1/webhooks/{secret}, a table's inbound webhook address. The secret in the address is the credential, so treat it like an API key. It can only add rows.Eight calls accept an
Idempotency-Keyheader:POST /v1/tables,POST /v1/tables/{tableId}/rows,PATCH /v1/tables/{tableId}/rows/{rowId},PATCH /v1/tables/{tableId}/cells,POST /v1/tables/{tableId}/trigger,POST /v1/webhooks/{secret},POST /v1/capabilities/{templateId}/runsandPOST /v1/functions/{functionId}/runs. Use 1 to 128 characters: letters, digits,_,-,.or:. If you repeat the same request with the same key within 24 hours, you get the first answer back with"replayed": true, and nothing runs or bills twice.Adding connections and creating contexts are done in the app. The API and MCP have no call for them.
A call can succeed while some cells still fail to enrich, so check the cells as well as the HTTP status.
More about the API and MCP



