Blog · Product

The API-First Approach To Business Software

Isaac Harmon · December 18, 2025

What API-first means

Most business software says it "integrates with everything". In practice that often means a short list of connectors and a support ticket when you need something that is not on it.

API-first means your data is reachable without waiting for anyone to build a connector. In Unstack there are three ways in: a REST API for reading and writing records, webhooks that push events to a URL you choose, and an MCP server that lets AI tools such as Claude work with your app. This post covers what each one does and when to use it.

API keys, webhooks and the MCP connection are part of the Business plan and above.

The REST API

Every table gets endpoints

The API lives at https://unstack.us/api/v1. Every table in your app gets the same set of endpoints at /custom/{table-slug}, so a table called customers is available as soon as you create it:

GET    /custom/customers          list records
POST   /custom/customers          create a record
GET    /custom/customers/{id}     get one record
PATCH  /custom/customers/{id}     update a record
DELETE /custom/customers/{id}     delete a record

API keys

Create a key under Data & API, on the API Keys tab. Give it a name, an optional expiration date and only the scopes it needs. A reporting tool, for example, needs Records (Read) and nothing else. The full key is shown once, so copy it when you create it. Keys start with usk_ and go in the X-API-Key header.

Your first request

curl "https://unstack.us/api/v1/custom/customers?limit=10" \
  -H "X-API-Key: usk_your_api_key"

The response is JSON with a data array and a pagination object:

{
  "data": [
    { "id": "abc-123", "name": "Example Customer", "email": "hello@example.com" }
  ],
  "pagination": { "total": 47, "limit": 10, "offset": 0, "has_more": true }
}

Lists return 50 records by default and up to 100 with limit. Use offset to page, sort and order to sort, and a field name as a filter, such as ?status=active. The API allows 600 requests an hour for each app. The full reference, with an OpenAPI spec, is at unstack.us/help/docs/api.

Webhooks

Polling the API to ask "did anything change?" works, but most of those requests come back empty. A webhook turns it around. Unstack sends a POST request to your URL when something happens.

You create a webhook subscription through the API by sending the URL and the events you want. Events follow one pattern: custom.{table-slug}.created, .updated and .deleted.

curl -X POST "https://unstack.us/api/v1/webhooks" \
  -H "X-API-Key: usk_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{ "url": "https://example.com/hooks/unstack", "events": ["custom.customers.created"] }'

The response includes a signing secret, which is shown once. Every delivery carries an X-Unstack-Signature header. Check it against that secret to confirm the request came from Unstack. Deliveries that fail are retried.

One thing to know before you rely on it: a subscription delivers events for records that are created, updated or deleted through the API. Changes your team makes inside the app do not go out this way. For those, use an automation with a record trigger and have one of its steps call your URL.

The MCP server

MCP, the Model Context Protocol, is a standard way for AI tools to use other software. Unstack's MCP server is at https://unstack.us/mcp.

To connect Claude, open Settings, then Connectors, choose Add custom connector, enter that URL and click Connect. You are sent to Unstack to sign in and approve access, then returned to Claude. Other MCP clients, such as Claude Code and Cursor, connect to the same URL or use an API key. The AI & MCP tab under Data & API has the connection details.

Once connected, the AI tool has the same abilities as the assistant inside Unstack: reading and writing records, designing tables, building pages, and creating automations and agents. Access is granted scope by scope when you approve the connection, and it never goes beyond what your own role allows.

Which one to use

Send new records to another system

If your team creates the records in the app, build an automation with a "record is created" trigger and have it send each record to the other system. If that system is one of the apps under Integrations, an app action does it with no code on your side. If the records arrive through the API, a webhook subscription covers it, and the payload includes the record.

Pull data into a reporting tool

Use the REST API with a read-only key. Have your reporting tool request the tables it needs on a schedule.

Let another system start a workflow

An active automation with a Webhook or Manual trigger can be called over HTTP. Give the key the Automations (Execute via HTTP) scope. The API Keys tab lists the automations that can be called this way.

Ask questions of live data

Use MCP. Connect your AI tool and ask "which customers have not ordered in 90 days?". It queries your tables at that moment. It is not working from an old export.

When you do not need the API at all

Before you write code, look at Integrations. Unstack connects to thousands of apps through Pipedream and Zapier, including accounting tools such as QuickBooks and Xero, and an automation can use a connected app with no code on your side. On Starter and above you can also bring in external data sources such as Airtable, Google Sheets and Snowflake as tables.

The API is for what is left: your own systems, custom reporting and anything specific to your business.

Getting started

  1. Create a key with only Records (Read) and list one of your tables.
  2. Create a webhook subscription for one table, point it at a test URL, and create a record through the API to see the delivery arrive.
  3. Connect an MCP client and ask it a question you already know the answer to.

None of these takes long, and after the third you will know which one fits the job you have in mind.

More from the blog