CommunityHire an ExpertSign Up
Softr Database APIOverview
Softr Database API

Softr Database API

Public API to communicate with Softr Databases

The Softr Database API lets you integrate your Softr data with external systems. The API follows REST semantics, uses JSON to encode objects, and requires all requests to be made over HTTPS.

Download the OpenAPI specification to import into tools like Postman or use for code generation.

Video Introduction

Data Model

The API is organized around four core resources:

  • Database — A top-level container that belongs to a workspace. Each database holds one or more tables.
  • Table — A structured collection of records, similar to a spreadsheet or database table. Each table has a set of fields and one or more views.
  • Field — A column definition on a table. Fields have a type (e.g. SINGLE_LINE_TEXT, NUMBER, SELECT) and optional configuration. Some fields are read-only (computed or system-managed).
  • Record — A single row of data in a table. Record values are stored in a fields object, keyed by field ID. Responses can use field names instead (?fieldNames=true); requests always use field IDs.

Every resource is identified by its ID.

Authentication

All requests require a Personal Access Token (PAT) passed in the Softr-Api-Key header:

Terminal
curl -X GET 'https://tables-api.softr.io/api/v1/databases' \
  -H 'Softr-Api-Key: <your-token>'

Tokens are scoped to one or more workspaces — you can only access databases within your authorized workspaces. See Authorisation for how to generate a token.

Quick Start

1. List your databases:

Terminal
curl -X GET 'https://tables-api.softr.io/api/v1/databases' \
  -H 'Softr-Api-Key: <your-token>'

2. Get records from a table:

Terminal
curl -X GET 'https://tables-api.softr.io/api/v1/databases/{databaseId}/tables/{tableId}/records?limit=10&fieldNames=true' \
  -H 'Softr-Api-Key: <your-token>'

3. Create a record (the keys are field IDs; Get Single Table lists a table’s fields with their IDs):

Terminal
curl -X POST 'https://tables-api.softr.io/api/v1/databases/{databaseId}/tables/{tableId}/records' \
  -H 'Softr-Api-Key: <your-token>' \
  -H 'Content-Type: application/json' \
  -d '{
    "fields": {
      "<name field ID>": "Jane Doe",
      "<email field ID>": "jane@example.com"
    }
  }'

Response Format

Success (single item)

JSON
{
  "data": { ... },
  "metadata": null
}

Success (paginated list)

JSON
{
  "data": [ ... ],
  "metadata": {
    "offset": 0,
    "limit": 20,
    "total": 100
  }
}

Error

JSON
{
  "message": "Human-readable error message",
  "errorCode": "MACHINE_READABLE_CODE",
  "details": {
    "fieldId": "Additional context",
    "traceId": "abc-123"
  }
}

Error Codes

CodeHTTP StatusDescription
BAD_REQUEST400Invalid request format or data
VALIDATION_ERROR400Field validation failed
UNKNOWN_FIELD400Unrecognized field in request
UNAUTHORIZED401Missing or invalid token
QUOTA_EXCEEDED402Plan quota limit reached
FORBIDDEN403Insufficient permissions
RESOURCE_NOT_FOUND404Resource does not exist
CONSTRAINT_VIOLATION409Data constraint violation (e.g. duplicate unique value)
PAYLOAD_TOO_LARGE413Request body exceeds 64 MB
TOO_MANY_REQUESTS429Rate limit exceeded
SERVICE_UNAVAILABLE503Service temporarily unavailable

Pagination

All list endpoints support offset-based pagination:

ParameterDefaultMaxDescription
offset0—Number of records to skip
limit20200Number of records per page

The response metadata includes a total count. To iterate through all records:

GET .../records?offset=0&limit=100    → records 1–100
GET .../records?offset=100&limit=100  → records 101–200
GET .../records?offset=200&limit=100  → records 201–300

Stop when offset >= metadata.total.

Using Field Names

By default, the fields object in record responses uses field IDs as keys. Pass ?fieldNames=true on any record endpoint to get human-readable field names in the response instead:

Terminal
# With field IDs (default)
GET .../records
→ { "fields": { "fld_abc123": "Jane Doe" } }

# With field names
GET .../records?fieldNames=true
→ { "fields": { "Full Name": "Jane Doe" } }

fieldNames changes the response only. The fields of a create or update request and the field references of a search (leftSide, sortingField) always take field IDs; a field name there fails with Unknown field.

Use these docs with your AI tools

An AI agent can read this documentation directly. You do not need an account or an API key. Everything here is public and read-only.

Query these docs via MCP

Recommended

Add this server to Claude, Claude Code, Cursor, Mistral, or any tool that supports MCP. Your agent can then search Softr Documentation documentation and read it in full, instead of answering from memory.

https://docs.softr.io/mcp
  • searchFind the passages that answer a question.
  • fetchRead one page in full, as Markdown.
  • list_pagesSee every page in this documentation.

Query these docs over HTTP

The same tools also work as plain web requests. Use this for scripts, or for any tool that does not support MCP. There is one endpoint per tool. Arguments go in the query string, and the answer comes back as JSON.

https://docs.softr.io/api/docs/search?query=custom+domain

Read the OpenAPI description. It is built from the same definitions as the tools, so it always matches what the endpoints do.

Read these docs as Markdown

Add .md to any page URL to get its Markdown source. You can also send the headerAccept: text/markdown to the page URL itself.

To read the whole documentation in one file, open llms-full.txt. For a short index of every page, open llms.txt.