Softr Database API
Public API to communicate with Softr Databases
The Softr Database API can be used to integrate your data in Softr with external systems. The API follows REST semantics and uses JSON to encode objects.
Video Introduction
Authorisation
For making calls you need 2 elements:
- API Basic URL:
https://tables-api.softr.io/api/v1
- Public API Token - Obtain here
To make a call you combine them into a HTTP request. Example:
$ curl -XGET 'https://tables-api.softr.io/api/v1/databases' \
-H 'Softr-Api-Key: <TOKEN>'
- All API requests must be authenticated and made through HTTPS.
- We currently support using personal access tokens (a.k.a API Key) and OAuth access tokens will be supported later.
- API Key inherits the access rights of the account of the user who grants access. Later more granular scopes will be supported as well as multiple Keys (Tokens) with different scopes.
Rate Limiting
All calls are subject to rate limiting.
Current rate-limit for paid plans is 20 calls per second per single Public API Token or Workspace.
Free plans are limited to 10 calls per second per single Public API Token or Workspace
On exceeding the limit you will receive 429 HTTP Response Status Code.
Databases
Get Databases
GET /api/v1/databases
Retrieve a list of all databases accessible to the authenticated user.
$ curl -X GET 'https://tables-api.softr.io/api/v1/databases' \
-H 'Softr-Api-Key: <TOKEN>'
Response format:
{
"data": [
{
"id": "string",
"name": "string",
"description": "string",
"workspaceId": "string",
"createdAt": "2025-06-01T10:42:10.000Z",
"updatedAt": "2025-06-01T10:42:10.000Z"
}
]
}
Get Single Database
GET /api/v1/databases/<DATABASE_ID>
Retrieve details of a specific database by its ID.
curl -X GET 'https://tables-api.softr.io/api/v1/databases/<DATABASE_ID>' \
-H 'Softr-Api-Key: <TOKEN>'
Response format:
{
"data": {
"id": "string",
"name": "string",
"description": "string",
"workspaceId": "string",
"createdAt": "2025-06-01T10:42:10.000Z",
"updatedAt": "2025-06-01T10:42:10.000Z"
}
}
Create a Database
POST /api/v1/databases
Create a new database in the specified workspace.
Request Body
{
"workspaceId": "string",
"name": "string",
"description": "string" // optional
}
Example Request
curl -X POST 'https://tables-api.softr.io/api/v1/databases' \
-H 'Softr-Api-Key: <TOKEN>' \
-d '{
"workspaceId": "<WORKSPACE_ID>",
"name": "Marketing DB",
"description": "Stores campaign data"
}'
Response
{
"data": {
"id": "string",
"name": "string",
"description": "string",
"workspaceId": "string",
"createdAt": "2025-06-01T10:42:10.000Z",
"updatedAt": "2025-06-01T10:42:10.000Z"
}
}
Update Database
PUT /api/v1/databases/{databaseId}
Update the details of an existing database.
Request Body
{
"name": "string", // optional
"description": "string" // optional
}
Example Request
curl -X PUT 'https://tables-api.softr.io/api/v1/databases/<DATABASE_ID>' \
-H 'Softr-Api-Key: <TOKEN>' \
-d '{
"name": "Updated Name",
"description": "Updated description"
}'
Response
{
"data": {
"id": "string",
"name": "string",
"description": "string",
"workspaceId": "string",
"createdAt": "2025-06-01T10:42:10.000Z",
"updatedAt": "2025-06-01T10:42:10.000Z"
}
}
Delete Database
DELETE /api/v1/databases/{databaseId}
Delete a specific database by its ID, if it is empty.
Optional Query Parameters
force
(boolean): Iftrue
, forces deletion even if there database is not empty. Default:false
.
Example Request
curl -X DELETE 'https://tables-api.softr.io/api/v1/databases/<DATABASE_ID>' \
-H 'Softr-Api-Key: <TOKEN>'
Response
204 No Content
โ Database deleted successfully
400 Bad Request
- If Database has tables, andforce=true
not passed
Tables
Get Tables
GET /api/v1/databases/{databaseId}/tables
Retrieve a list of all tables in the specified database.
curl -X GET 'https://tables-api.softr.io/api/v1/databases/<DATABASE_ID>/tables' \
-H 'Softr-Api-Key: <TOKEN>'
Response format:
{
"data": [
{
"id": "string",
"name": "string",
"description": "string",
"primaryFieldId": "string",
"defaultViewId": "string",
"fields": [
{
"id": "string",
"name": "string",
"type": "string",
"options": {},
"allowMultipleEntries": true,
"readonly": true,
"required": true,
"locked": true,
"defaultValue": "string",
"createdAt": "2025-06-24T12:22:07.444Z",
"updatedAt": "2025-06-24T12:22:07.444Z"
}
],
"createdAt": "2025-06-01T10:42:10.000Z",
"updatedAt": "2025-06-01T10:42:10.000Z"
}
]
}
Get Single Table
GET /api/v1/databases/{databaseId}/tables/{tableId}
Retrieve details of a specific table by its ID.
curl -X GET 'https://tables-api.softr.io/api/v1/databases/<DATABASE_ID>/tables/<TABLE_ID>' \
-H 'Softr-Api-Key: <TOKEN>'
Response format:
{
"data": {
"id": "string",
"name": "string",
"description": "string",
"primaryFieldId": "string",
"defaultViewId": "string",
"fields": [
{
"id": "string",
"name": "string",
"type": "string",
"options": {},
"allowMultipleEntries": true,
"readonly": true,
"required": true,
"locked": true,
"defaultValue": "string",
"createdAt": "2025-06-24T12:22:07.444Z",
"updatedAt": "2025-06-24T12:22:07.444Z"
}
],
"createdAt": "2025-06-01T10:42:10.000Z",
"updatedAt": "2025-06-01T10:42:10.000Z"
}
}
Get Table Views
GET /api/v1/databases/{databaseId}/tables/{tableId}/views
Retrieve table views.
curl -X GET 'https://tables-api.softr.io/api/v1/databases/<DATABASE_ID>/tables/<TABLE_ID>/views' \
-H 'Softr-Api-Key: <TOKEN>'
Response format:
{
"data": [
{
"id": "string",
"tableId": "string",
"name": "string",
"description": "string",
"createdAt": "2025-05-09T12:14:44Z",
"updatedAt": "2025-05-09T12:14:44Z"
}
]
}
Create Table
POST /api/v1/databases/{databaseId}/tables
Create a new table in the specified database.
Optional Request Body
{
"name": "string",
"description": "string", // optional
"primaryFieldName": "string" // optional
"fields": [
{
"name": "string",
"type": "SINGLE_LINE_TEXT",
"options": {
"minLength": 0,
"maxLength": 50
}
]
}
Example Request - Create Table with specified details
curl -X POST 'https://tables-api.softr.io/api/v1/databases/<DATABASE_ID>/tables' \
-H 'Softr-Api-Key: <TOKEN>' \
-d '{
"name": "My Table",
"description": "Table Description",
"primaryFieldName": "Email",
"fields": [ ... ]
}'
Example Request - Create Table with default details
curl -X POST 'https://tables-api.softr.io/api/v1/databases/<DATABASE_ID>/tables' \
-H 'Softr-Api-Key: <TOKEN>'
Response
{
"data": {
"id": "string",
"name": "string",
"description": "string",
"primaryFieldId": "string",
"defaultViewId": "string",
"fields": [ ... ],
"createdAt": "2025-06-01T10:42:10.000Z",
"updatedAt": "2025-06-01T10:42:10.000Z"
}
}
Update Table
PUT /api/v1/databases/{databaseId}/tables/{tableId}
Update a specific table by its ID.
You can only update name and/or description here.
For changing table fields see fields related API endpoints.
Request Body
{
"name": "string", // optional
"description": "string" // optional
}
Example Request
curl -X PUT 'https://tables-api.softr.io/api/v1/databases/<DATABASE_ID>/tables/<TABLE_ID>' \
-H 'Softr-Api-Key: <TOKEN>' \
-d '{
"name": "Updated Table",
"description": "Updated description"
}'
Response
{
"data": {
"id": "string",
"name": "string",
"description": "string",
"primaryFieldId": "string",
"defaultViewId": "string",
"fields": [ ... ],
"createdAt": "2025-06-01T10:42:10.000Z",
"updatedAt": "2025-06-01T10:42:10.000Z"
}
}
Delete Table
DELETE /api/v1/databases/{databaseId}/tables/{tableId}
Delete a specific table by its ID.
Optional Query Parameters
force
(boolean): Iftrue
, forces deletion even if the table is not empty. Default:false
.
Example Request
curl -X DELETE 'https://tables-api.softr.io/api/v1/databases/<DATABASE_ID>/tables/<TABLE_ID>' \
-H 'Softr-Api-Key: <TOKEN>'
Response
204 No Content
โ Table deleted successfully
Table Fields
Get Table Field
GET /api/v1/databases/{databaseId}/tables/{tableId}/fields/{fieldId}
Retrieve details of a specific field.
Example Request
curl -X GET '<https://tables-api.softr.io/api/v1/databases/><DATABASE_ID>/tables/<TABLE_ID>/fields/<FIELD_ID>' \\
-H 'Softr-Api-Key: <TOKEN>'
Add Table Field
POST /api/v1/databases/{databaseId}/tables/{tableId}/fields
Add a new field to a table.
Request Body
{
"name": "string",
"type": "string",
"options": { ... }
}
Example Request
curl -X POST 'https://tables-api.softr.io/api/v1/databases/<DATABASE_ID>/tables/<TABLE_ID>/fields' \\
-H 'Softr-Api-Key: <TOKEN>' \\
-d '{
"name": "Field Name",
"type": "SINGLE_LINE_TEXT",
"options": {}
}'
Response
{
"data": {
"id": "string",
"name": "string",
"type": "string",
"options": {},
"allowMultipleEntries": false,
"readonly": false,
"required": false,
"locked": false,
"defaultValue": null,
"createdAt": "2025-06-01T10:42:10.000Z",
"updatedAt": "2025-06-01T10:42:10.000Z"
}
}
Update Table Field
PUT /api/v1/databases/:databaseId/tables/:tableId/fields/:fieldId
{
"name": "My Field",
"type": "SINGLE_LINE_TEXT"
}
Example:
curl -X PUT 'https://tables-api.softr.io/api/v1/databases/<DATABASE_ID>/tables/<TABLE_ID>/fields/<FIELD_ID>' \
-H 'Content-Type: application/json' \
-H 'Softr-Api-Key: <TOKEN>' \
-d '{
"name": "My Field",
"type": "SINGLE_LINE_TEXT",
"options": {
"minLength": 1,
"maxLength: 256
}
}'
Delete Table Field
DELETE /api/v1/databases/:databaseId/tables/:tableId/fields/:fieldId
Example:
curl -s -X DELETE 'https://tables-api-staging.softr.io/api/v1/databases/<DATABASE_ID>/tables/<TABLE_ID>/fields/<FIELD_ID>' \
-H 'Softr-Api-Key: <TOKEN>'
Field Types
Below we present a list of all available field types with their options.
SINGLE_LINE_TEXT
{
"name": "My Field",
"type": "SINGLE_LINE_TEXT",
"options": {
"minLength": 0,
"maxLength": 50
}
}
CHECKBOX
{
"name": "My Field",
"type": "CHECKBOX"
}
CURRENCY
{
"name": "My Field",
"type": "CURRENCY"
"options" : {
"precision" : 2, // currency value precision
"min" : -100000, // min value
"max" : 100000, // max value
"isoCode" : "USD", // ISO 4217 currency code e.g. USD, EUR, JPY
"customSymbol" : "$", // Custom symbol for the currency (optional)
"showAs" : "SYMBOL", // or "CODE"
"showThousandSeparator" : true, // or "false"
"thousandSeparatorLocale" : "en-US", // "The locale to use for the thousand separator"
"largeNumberAbbreviation" : "NONE", // NONE, K, M, B, T, examples: 1K, 1M, 1B, 1T
"symbolOrCodePosition" : "BEFORE" // or "AFTER"
}
}
DATETIME
{
"name": "My Field",
"type": "DATETIME"
"options" : {
"precision" : "DATETIME", // or "DATE"
"useRelativeDatetimeFormat" : false, // or "true"
"timezoneType" : "FIXED", // or "LOCAL"
"timezone" : "DEFAULT" // If timezoneType is FIXED, this is the timezone to use, e.g. "Europe/Prague", or "America/New_York", or "DEFAULT" to use the database timezone
}
}
DURATION
{
"name": "My Field",
"type": "DURATION",
"options" : {
"format" : "yyyy-MM-dd'T'HH:mm:ss" // format in which value is displayed
}
}
{
"name": "My Field",
"type": "EMAIL"
}
SELECT
{
"name": "My Field",
"type": "SELECT",
"options": {
"choices": [
{
"id": "dewqc",
"label": "In Progress",
"color": "yellow"
},
{
"id": "pq213m",
"label": "Done",
"color": "green"
}
],
"allowToAddNewChoice": true
}
}
NUMBER
{
"name": "My Field",
"type": "NUMBER",
"options": {
"precision" : 2,
"min" : -100200300,
"max" : 100200300,
"showThousandSeparator" : true, // or "false"
"thousandSeparatorLocale" : "en-US",
"largeNumberAbbreviation" : "NONE", // or K, M, B, T, e.g. 1K, 1M, 1B, 1T
"prefix" : "of", // number value prefix
"suffix" : "kg" // number value suffix
}
}
ATTACHMENT
{
"name": "My Field",
"type": "ATTACHMENT",
"options": {
"showAs" : "PREVIEW", // or "BADGE"
"enableFileLinkExpiration" : false, // or "true"
"fileLinkExpirationValue" : 100, // expiration time (optional)
"fileLinkExpirationUnit" : "HOURS" // or "MINUTES", expiration unit (optional)
}
}
RATING
{
"name": "My Field",
"type": "RATING",
"options" : {
"max" : 5,
"shape" : "STAR" // or "HEART"
}
}
LINKED_RECORD
{
"name": "My Field",
"type": "LINKED_RECORD",
"options": {
"linkedTableId": "1ngdhgT38Kv3Cl",
"inverseLinkFieldId": "pdsaKdsa"
}
}
LONG_TEXT
{
"name": "My Field",
"type": "LONG_TEXT",
"options": {
"type" : "TEXT" // or "HTML", or "MARKDOWN"
}
}
URL
{
"name": "My Field",
"type": "URL"
}
PERCENT
{
"name": "My Field",
"type": "PERCENT",
"options" : {
"precision" : 2, // number precistion
"min" : -100, // min value
"max" : 100, // max value
"showThousandSeparator" : true, // or "false"
"thousandSeparatorLocale" : "en-US",
"progressBarColor" : "#4CAF50", // The color of the progress bar.
"showNumber" : true, // This is relevant when ShowAs is set to PROGRESS_BAR/PROGRESS_RING.
"showAs" : "NUMBER", // or "PROGRESS_BAR", "PROGRESS_RING"
}
}
BUTTON
{
"name": "My Field",
"type": "BUTTON",
"options" : {
"label" : "Submit",
"conditionFormula" : "",
"conditionReferencedFieldIds" : [ ],
"urlFormula" : "",
"urlReferencedFieldIds" : [ ],
"action" : "OPEN_URL", // or "OPEN_MODAL", "RUN_WORKFLOW"
}
}
PROGRESS
{
"name": "My Field",
"type": "PROGRESS",
"options" : {
"min" : 0, // min value
"max" : 100. // max value
}
}
PHONE
{
"name": "My Field",
"type": "PHONE"
}
DATE_RANGE
{
"name": "My Field",
"type" : "DATE_RANGE"
}
ADDRESS
{
"name": "My Field",
"type" : "ADDRESS"
}
TIME
{
"name": "My Field",
"type" : "TIME"
}
LOOKUP
{
"name": "My Field",
"type": "LOOKUP",
"options": {
"linkedRecordFieldId": "7qn0n",
"lookupFieldId": "Wk7Im",
"returnedField": { // returned field options
"type": "LONG_TEXT",
"options": {
"type": "TEXT"
}
},
"valid": true // is lookup valid
}
}
ROLLUP
More on Rollup Field:
{
"name": "My Field",
"type": "ROLLUP",
"options": {
"linkedRecordFieldId": "7qn0n", // linked record field ID
"rollupFieldId": "xiRvA", // field to be rolled up
"function": "ARRAYJOIN", // function used to roll up the fields: SUM, MIN, MAX, COUNT, AVERAGE, ARRAYCOMPACT, ARRAYJOIN, ARRAYUNIQUE, ARRAYFLATTEN, CONCATENATE, COUNTALL, COUNTA, OR, AND
"returnedField": { // returned field options
"type": "SINGLE_LINE_TEXT",
"options": {
"minLength": 0,
"maxLength": 2000000
}
}
}
}
FORMULA
More on Formula field:
{
"name": "My Field",
"type": "FORMULA",
"options": {
"formula": "SUM({Price}, ({Price}*{Tax Rate}))", // the formula
"referencedFieldIds": ["fJ4Fl", "dsazP"], // fields referenced in formula
"returnedField": { // returned field options
"type": "SINGLE_LINE_TEXT",
"options": {
"minLength": 0,
"maxLength": 1024
}
},
"valid": true
}
}
COUNT
{
"name": "My Field",
"type" : "COUNT",
"options" : {
"linkedRecordFieldId": "fJ4Fl" // linked record field
}
}
CREATED_AT
{
"name": "My Field",
"type" : "CREATED_AT",
"options" : {
"precision" : "DATETIME", // or "DATE"
"useRelativeDatetimeFormat" : false, // or "true"
"timezoneType" : "FIXED", // or "LOCAL", LOCAL means the timezone is taken from the user browser, FIXED means there is a fixed timezone for all users.
"timezone" : "DEFAULT" // timezone when set to "FIXED", e.g. "Europe/Paris"
}
}
UPDATED_AT
{
"name": "My Field",
"type" : "UPDATED_AT",
"options" : {
"precision" : "DATETIME", // or "DATE"
"useRelativeDatetimeFormat" : false, // or "true"
"timezoneType" : "FIXED", // or "LOCAL", LOCAL means the timezone is taken from the user browser, FIXED means there is a fixed timezone for all users.
"timezone" : "DEFAULT" // timezone when set to "FIXED", e.g. "Europe/Paris"
}
}
CREATED_BY
{
"name": "My Field",
"type" : "CREATED_BY"
}
UPDATED_BY
{
"name": "My Field",
"type" : "UPDATED_BY"
}
AUTONUMBER
{
"name": "My Field",
"type" : "AUTONUMBER",
"options" : {
"counter" : 0 // counter, last autonumber value
}
}
RECORD_ID
{
"name": "My Field",
"type" : "RECORD_ID"
}
USER
{
"name": "My Field",
"type" : "USER"
}
Records
Get Records
GET /api/v1/databases/{databaseId}/tables/{tableId}/records
Retrieve a list of all records in the specified table.
Optional Query Parameters
offset
(integer): Pagination offset
limit
(integer): Pagination limit
curl -X GET 'https://tables-api.softr.io/api/v1/databases/<DATABASE_ID>/tables/<TABLE_ID>/records?limit=10&offset=0' \
-H 'Softr-Api-Key: <TOKEN>'
Response format:
{
"data": [
{
"id": "string",
"tableId": "string",
"fields": {
"fieldId": "value"
},
"createdAt": "2025-06-01T10:42:10.000Z",
"updatedAt": "2025-06-01T10:42:10.000Z"
}
],
"metadata": {
"offset": 0,
"limit": 10,
"total": 1
}
}
Search Records
POST /api/v1/databases/{databaseId}/tables/{tableId}/records/search
Search for records in the specified table based on criteria.
Request Body
{
"filter": { ... },
"sort": { ... },
"paging": {
"offset": 0,
"limit": 10
}
}
Example Request
curl -X POST 'https://tables-api.softr.io/api/v1/databases/<DATABASE_ID>/tables/<TABLE_ID>/records/search' \
-H 'Softr-Api-Key: <TOKEN>' \
-d '{
"filter": {},
"sort": {},
"paging": {
"offset": 0,
"limit": 10
}
}'
Response format: Same as GET /records
Example Filter
"filter": {
"condition": {
"operator": "AND",
"conditions": [
{
"leftSide": "Vrthy",
"operator": "IS",
"rightSide": "test@softr.io"
},
{
"operator": "OR",
"conditions": [
{
"leftSide": "Fo3SS",
"operator": "IS_ONE_OF",
"rightSide": [
"Active"
]
},
{
"leftSide": "bJ6jE"
"operator": "IS_NOT_EMPTY",
}
]
}
]
}
}
List of Operators
AND
All Conditions Must Pass
{
"operator": "AND",
"conditions": [
{
"leftSide": "Fo3SS",
"operator": "IS",
"rightSide": "100"
},
{
"leftSide": "bJ6jE"
"operator": "IS_NOT_EMPTY",
}
]
}
OR
One of the conditions must pass
{
"operator": "OR",
"conditions": [
{
"leftSide": "Fo3SS",
"operator": "IS",
"rightSide": "100"
},
{
"leftSide": "bJ6jE"
"operator": "IS_NOT_EMPTY",
}
]
}
IS_EMPTY
Field is empty
{
"operator": "IS_EMPTY",
"leftSide": "Fo3SS"
}
IS_NOT_EMPTY
Field is not empty
{
"operator": "IS_NOT_EMPTY",
"leftSide": "Fo3SS"
}
IS_BETWEEN
Value is within specified range
{
"operator": "IS_BETWEEN",
"leftSide": "Fo3SS",
"lowerBound": "100",
"upperBound": "500"
}
IS_NOT_BETWEEN
Value is outside the specified range
{
"operator": "IS_NOT_BETWEEN",
"leftSide": "Fo3SS",
"lowerBound": "100",
"upperBound": "500"
}
IS
Value is equal to
{
"operator": "IS",
"leftSide": "Fo3SS",
"rightSide": "100"
}
IS_NOT
Value is different than
{
"operator": "IS_NOT",
"leftSide": "Fo3SS",
"rightSide": "100"
}
GREATER_THAN
Value is greater than
{
"operator": "GREATER_THAN",
"leftSide": "Fo3SS",
"rightSide": "100"
}
GREATER_THAN_OR_EQUALS
Value is greater or equal to
{
"operator": "GREATER_THAN_OR_EQUALS",
"leftSide": "Fo3SS",
"rightSide": "100"
}
LESS_THAN
Value is less than
{
"operator": "LESS_THAN",
"leftSide": "Fo3SS",
"rightSide": "100"
}
LESS_THAN_OR_EQUALS
Value is less than or equal to
{
"operator": "LESS_THAN_OR_EQUALS",
"leftSide": "Fo3SS",
"rightSide": "100"
}
CONTAINS
String contains substring
{
"operator": "CONTAINS",
"leftSide": "Fo3SS",
"rightSide": "urgent"
}
All text-related conditions are case insensitive.
DOES_NOT_CONTAIN
String does not contain substring
{
"operator": "DOES_NOT_CONTAIN",
"leftSide": "Fo3SS",
"rightSide": "urgent"
}
STARTS_WITH
String starts with text
{
"operator": "STARTS_WITH",
"leftSide": "Fo3SS",
"rightSide": "THE"
}
DOES_NOT_START_WITH
String does not start with a text
{
"operator": "DOES_NOT_START_WITH",
"leftSide": "Fo3SS",
"rightSide": "THE"
}
ENDS_WITH
String ends with a text
{
"operator": "ENDS_WITH",
"leftSide": "Fo3SS",
"rightSide": "END"
}
DOES_NOT_END_WITH
String does not end with a text
{
"operator": "DOES_NOT_END_WITH",
"leftSide": "Fo3SS",
"rightSide": "END"
}
IS_ONE_OF
Value is one of many
{
"operator": "IS_ONE_OF",
"leftSide": "Fo3SS",
"rightSide": ["URGENT", "IMPORTANT"]
}
IS_NOT_ONE_OF
Value is none of many
{
"operator": "IS_NOT_ONE_OF",
"leftSide": "Fo3SS",
"rightSide": ["URGENT", "IMPORTANT"]
}
HAS_ALL_OF
Value has all of many
{
"operator": "HAS_ALL_OF",
"leftSide": "Fo3SS",
"rightSide": ["DONE", "DEPLOYED"]
}
HAS_NONE_OF
Value has none of many
{
"operator": "HAS_NONE_OF",
"leftSide": "Fo3SS",
"rightSide": ["DONE", "DEPLOYED"]
}
Get Single Record
GET /api/v1/databases/{databaseId}/tables/{tableId}/records/{recordId}
Retrieve details of a specific record by its ID.
curl -X GET 'https://tables-api.softr.io/api/v1/databases/<DATABASE_ID>/tables/<TABLE_ID>/records/<RECORD_ID>' \
-H 'Softr-Api-Key: <TOKEN>'
Response format:
{
"data": {
"id": "string",
"tableId": "string",
"fields": {
"fieldId": "value"
},
"createdAt": "2025-06-01T10:42:10.000Z",
"updatedAt": "2025-06-01T10:42:10.000Z"
}
}
Create Record
POST /api/v1/databases/{databaseId}/tables/{tableId}/records
Create a new record in the specified table.
Request Body
{
"fields": {
"fieldId": "value"
}
}
Example Request
curl -X POST '<https://tables-api.softr.io/api/v1/databases/><DATABASE_ID>/tables/<TABLE_ID>/records' \
-H 'Softr-Api-Key: <TOKEN>' \
-d '{
"fields": {
"E08c0": "Example",
"kl5nP": "Active"
}
}'
Response format: Same as Get Single Record
Update Record
PUT /api/v1/databases/{databaseId}/tables/{tableId}/records/{recordId}
Update a specific record by its ID.
Request Body
{
"fields": {
"fieldId": "new value"
}
}
Example Request
curl -X PUT 'https://tables-api.softr.io/api/v1/databases/<DATABASE_ID>/tables/<TABLE_ID>/records/<RECORD_ID>' \
-H 'Softr-Api-Key: <TOKEN>' \
-d '{
"fields": {
"oLv8D": "Archived"
}
}'
Response format: Same as Get Single Record
Delete Record
DELETE /api/v1/databases/{databaseId}/tables/{tableId}/records/{recordId}
Delete a specific record by its ID.
curl -X DELETE 'https://tables-api.softr.io/api/v1/databases/<DATABASE_ID>/tables/<TABLE_ID>/records/<RECORD_ID>' \
-H 'Softr-Api-Key: <TOKEN>'
Response
204 No Content
โ Record deleted successfully
Upload a File
There are 3 data formats you can use to upload a file to Softr Database.
Simple:
{
"fields": {
"<fieldId>": "<file-url>"
}
}
Short:
{
"fields": {
"<fieldId>": {
"url": "<file-url>"
}
}
}
Full:
{
"fields": {
"<fieldId>": {
"url": "<file-url>",
"filename": "<file-name>",
"type": "<file-type">
}
}
}
Examples:
curl -X PUT '<https://tables-api.softr.io/api/v1/databases/><DATABASE_ID>/tables/<TABLE_ID>/records/<RECORD_ID>' \
-H 'Softr-Api-Key: <TOKEN>'
-d '{
"fields": {
"SSXUc": "https://picsum.photos/200/300"
}
}'
Or
curl -X PUT '<https://tables-api.softr.io/api/v1/databases/><DATABASE_ID>/tables/<TABLE_ID>/records/<RECORD_ID>' \
-H 'Softr-Api-Key: <TOKEN>'
-d '{
"fields": {
"SSXUc": {
"name": "landscape.jpeg"
"url": https://picsum.photos/200/300",
"type": "image/jpeg"
}
}
}'
Link a record
To link a record from another table, you need to get that record ID & Label
curl -X PATCH 'https://tables-api.softr.io/api/v1/databases/<DATABASE_ID>/tables/<TABLE_ID>/records/<RECORD_ID>' \
-H 'Softr-Api-Key: <TOKEN>'
-d '{
"fields": {
"<fieldId>": [
{
"id": "<linkedRecordId>",
"label": "<linkedRecordLabel>"
},
{
"id": "<linkedRecordId>",
"label": "<linkedRecordLabel>"
},
...
]
}
}'
Example:
curl -X PATCH 'https://tables-api.softr.io/api/v1/databases/<DATABASE_ID>/tables/<TABLE_ID>/records/<RECORD_ID>' \
-H 'Softr-Api-Key: <TOKEN>'
-d '{
"fields": {
"7qn0n": [
{
"id": "vQ9BI8QUVQiFua",
"label": "Sales"
}
]
}
}'
Updating a linked record field always overwrite all links already present.
To delete all links you simply call PATCH with empty values array:
curl -X PATCH 'https://tables-api.softr.io/api/v1/databases/<DATABASE_ID>/tables/<TABLE_ID>/records/<RECORD_ID>' \
-H 'Softr-Api-Key: <TOKEN>'
-d '{
"fields": {
"<fieldId>": []
}
}'
Last updated on June 30, 2025