Ask AI

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

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): If true, 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, and force=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): If true, 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
  }
}

EMAIL

{
  "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>": []
      }
  }'
Did this answer your question?
๐Ÿ˜ž
๐Ÿ˜
๐Ÿคฉ

Last updated on June 30, 2025