CommunityHire an ExpertSign Up
RecordsSearch Records
Records

Search Records

Search for records in the specified table based on filter, sort, and pagination criteria.

POST/databases/{databaseId}/tables/{tableId}/records/search

Filtering Guide

The Search Records endpoint lets you filter, sort, and paginate records using a JSON request body. All three top-level fields (filter, sorting, paging) are optional.

JSON
{
  "paging": {
    "offset": 0,
    "limit": 50
  },
  "sorting": [
    { "sortingField": "field-uuid", "sortType": "ASC" }
  ],
  "filter": {
    "condition": { ... }
  }
}

Filter Condition Types

Filters are passed in filter.condition. There are four types, determined by the operator.

Binary Conditions

Compare a field to a value:

JSON
{
  "operator": "CONTAINS",
  "leftSide": "field-uuid",
  "rightSide": "search term"
}
OperatorDescriptionRight Side
ISEqualssingle value
IS_NOTNot equalssingle value
GREATER_THANGreater thannumber or date
GREATER_THAN_OR_EQUALSGreater than or equalnumber or date
LESS_THANLess thannumber or date
LESS_THAN_OR_EQUALSLess than or equalnumber or date
CONTAINSString containsstring
DOES_NOT_CONTAINString does not containstring
STARTS_WITHString starts withstring
DOES_NOT_START_WITHString does not start withstring
ENDS_WITHString ends withstring
DOES_NOT_END_WITHString does not end withstring
IS_ONE_OFValue is one ofarray
IS_NOT_ONE_OFValue is none ofarray
HAS_ANY_OFMulti-value field has any ofarray
HAS_ALL_OFMulti-value field has all ofarray
HAS_NONE_OFMulti-value field has none ofarray

Unary Conditions

Check whether a field is empty — no rightSide needed:

JSON
{
  "operator": "IS_EMPTY",
  "leftSide": "field-uuid"
}
OperatorDescription
IS_EMPTYField has no value
IS_NOT_EMPTYField has a value

Ternary Conditions

Range-based checks with lowerBound and upperBound:

JSON
{
  "operator": "IS_BETWEEN",
  "leftSide": "field-uuid",
  "lowerBound": 10,
  "upperBound": 100
}
OperatorDescription
IS_BETWEENValue is between bounds (inclusive)
IS_NOT_BETWEENValue is outside bounds
IS_WITHINDate is within a relative range
IS_NOT_WITHINDate is outside a relative range

Composite Conditions

Combine multiple conditions with AND or OR:

JSON
{
  "operator": "AND",
  "conditions": [
    { "operator": "CONTAINS", "leftSide": "name-field", "rightSide": "acme" },
    { "operator": "GREATER_THAN", "leftSide": "amount-field", "rightSide": 1000 },
    {
      "operator": "OR",
      "conditions": [
        { "operator": "IS", "leftSide": "status-field", "rightSide": "active" },
        { "operator": "IS_EMPTY", "leftSide": "archived-field" }
      ]
    }
  ]
}

Relative Date Values

For date fields, you can use relative date strings instead of fixed ISO 8601 dates:

FormatExamples
PREDEFINED:<token>PREDEFINED:TODAY, PREDEFINED:YESTERDAY, PREDEFINED:TOMORROW, PREDEFINED:THIS_WEEK, PREDEFINED:LAST_WEEK, PREDEFINED:THIS_MONTH, PREDEFINED:THIS_YEAR, PREDEFINED:NEXT_MONTH, PREDEFINED:PAST_MONTH, PREDEFINED:7_DAYS_AGO, PREDEFINED:30_DAYS_FROM_NOW
RELATIVE_DATE:<period>:<unit>RELATIVE_DATE:THIS:WEEK, RELATIVE_DATE:PAST:MONTH, RELATIVE_DATE:NEXT:QUARTER, RELATIVE_DATE:PAST:7 (7 days ago)
ISO 8601"2025-05-21", "2025-05-21T20:00:00.000Z"

Complete Example

Find active contacts named “acme” with an amount over 1000, created this month:

JSON
{
  "paging": { "offset": 0, "limit": 50 },
  "sorting": [
    { "sortingField": "amount-field-uuid", "sortType": "DESC" }
  ],
  "filter": {
    "condition": {
      "operator": "AND",
      "conditions": [
        { "operator": "CONTAINS", "leftSide": "name-field-uuid", "rightSide": "acme" },
        { "operator": "GREATER_THAN", "leftSide": "amount-field-uuid", "rightSide": 1000 },
        { "operator": "IS", "leftSide": "status-field-uuid", "rightSide": "active" },
        { "operator": "IS_WITHIN", "leftSide": "created-at-field-uuid", "lowerBound": "RELATIVE_DATE:THIS:MONTH", "upperBound": "PREDEFINED:TODAY" }
      ]
    }
  }
}

Authorizations

Softr-Api-KeyAPI key · headerrequired

Path Parameters

databaseIdstringrequired
tableIdstringrequired

Query Parameters

fieldNamesbooleandefault: false

If true, use field names as keys in the fields object instead of field IDs.

Body

application/json
filterobject
sortingobject[]
pagingobject

Response

application/json

A paginated list of matching records.

dataobject[]
metadataobject

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.