> **Building with AI coding agents?** Install the authstack plugin with one command. This equips your agent with accurate Scalekit implementation patterns.
>
> **Recommended** (the `-y` flags skip prompts, so the command runs without an interactive terminal):
> ```bash
> npx -y @scalekit-inc/cli setup -y
> ```
>
> Global:
> ```bash
> npm install -g @scalekit-inc/cli
> scalekit setup -y
> ```
>
> Supports Claude Code, Cursor, GitHub Copilot, Codex + skills for other Agent Skills-compatible agents in `~/.agents/skills`.
> Skills: integrate-agentkit, implement-saaskit, add-mcp-oauth, implement-sso, implement-scim.
> [Full setup guide](https://docs.scalekit.com/dev-kit/build-with-ai/)

---

# Connect AI agents to Baserow

The Baserow connector lets your AI agent act in each user's Baserow account. Each user connects their own Baserow access token once, and Scalekit sends it with every call, so your agent never handles credentials. It comes with 14 tools.

**Authentication:** Bearer Token
**Categories:** Databases, Productivity
**Tools:** 14: 5 read, 7 write, 2 destructive
**Users sign in with:** Access token
**Built by:** Scalekit connector
**Try it:** [Playground in the Scalekit dashboard](https://app.scalekit.com/ws/signup?sk_intent=playground&provider=BASEROW)

## Setup

1. ### Install the SDK

   **Node.js**

   ```bash
   npm install @scalekit-sdk/node dotenv
   ```

   **Python**

   ```bash
   pip install scalekit-sdk-python python-dotenv
   ```

2. ### Set your credentials

   Add your Scalekit credentials to your `.env` file. Find values in **[app.scalekit.com](https://app.scalekit.com)** > **Developers** > **API Credentials**.

   ```sh title=".env"
   SCALEKIT_ENVIRONMENT_URL=<your-environment-url>
   SCALEKIT_CLIENT_ID=<your-client-id>
   SCALEKIT_CLIENT_SECRET=<your-client-secret>
   ```

3. ### Create the Baserow connection

   In **AgentKit > Connections**, create a Baserow connection. The name you give it is the `connection_name` your code passes. See [Configure connections](/agentkit/connections/).

4. ### Authorize a user and make your first call

   **Node.js** (`quickstart.mts`)

   ```typescript
   import { ScalekitClient } from '@scalekit-sdk/node'
   import 'dotenv/config'
   import { createInterface } from 'node:readline/promises'

   const scalekit = new ScalekitClient(
     process.env.SCALEKIT_ENVIRONMENT_URL,
     process.env.SCALEKIT_CLIENT_ID,
     process.env.SCALEKIT_CLIENT_SECRET,
   )
   const actions = scalekit.actions

   const connector = 'baserow'
   const identifier = 'user_123'

   // Generate an authorization link for the user
   const { link } = await actions.getAuthorizationLink({ connectionName: connector, identifier })
   console.log('Authorize Baserow:', link)
   const rl = createInterface({ input: process.stdin, output: process.stdout })
   await rl.question('Press Enter after authorizing...')
   rl.close()

   // Make your first call
   const result = await actions.executeTool({
     connector,
     identifier,
     toolName: 'baserow_check_token',
     toolInput: {},
   })
   console.log(result)
   ```

   ```bash
   npx tsx quickstart.mts
   ```

   **Python** (`quickstart.py`)

   ```python
   import os
   from scalekit import ScalekitClient
   from dotenv import load_dotenv
   load_dotenv()

   scalekit_client = ScalekitClient(
       env_url=os.getenv("SCALEKIT_ENVIRONMENT_URL"),
       client_id=os.getenv("SCALEKIT_CLIENT_ID"),
       client_secret=os.getenv("SCALEKIT_CLIENT_SECRET"),
   )
   actions = scalekit_client.actions

   connection_name = "baserow"
   identifier = "user_123"

   # Generate an authorization link for the user
   link_response = actions.get_authorization_link(
       connection_name=connection_name,
       identifier=identifier,
   )
   print("Authorize Baserow:", link_response.link)
   input("Press Enter after authorizing...")

   # Make your first call
   result = actions.execute_tool(
       tool_input={},
       tool_name="baserow_check_token",
       connection_name=connection_name,
       identifier=identifier,
   )
   print(result)
   ```

   ```bash
   python quickstart.py
   ```

   Each user opens the link once and enters their Baserow credentials there. See [Authorize a user](/agentkit/tools/authorize/) for the full flow and statuses.

## Tools

Pass the exact name to `execute_tool`, with an input like each tool's example. To ask for a tool that's missing, use the [request form](https://scalekitsupport.portal.usepylon.com/forms/request-a-connector-tool).

**Node.js**

```typescript
const result = await actions.executeTool({
  toolName: 'baserow_check_token',
  toolInput: {},
  connector: 'baserow',
  identifier: 'user_123',
})
```

**Python**

```python
result = actions.execute_tool(
    tool_name="baserow_check_token",
    tool_input={},
    connection_name="baserow",
    identifier="user_123",
)
```

`result.data` is the app's response as JSON, and `result.execution_id` (`executionId` in Node.js) is the ID of the call.

### `baserow_check_token`

Check Database Token · Read-only

Check whether the connected database token is valid.
Returns an empty 200 response when the token is valid and a 403 error when it is not.
Use baserow_list_tables to see which tables the token can reach.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs: none.

Example input: `{}`

### `baserow_get_row`

Get Table Row · Read-only

Get one row from a table by its id.
Returns the row with its id, order and one value per field.
Use this when you know the row id; use baserow_list_rows to search.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `row_id` (`integer`, required): ID of the row (the row's id value, not its position). Example: 42.
- `table_id` (`integer`, required): ID of the Baserow table. Get it from baserow_list_tables. Example: 1234.
- `user_field_names` (`boolean`, optional): Set true to use field names (for example Name) as keys in the request and response. Leave empty to use Baserow's internal keys such as field_123. Use baserow_list_fields to see both.

Example input: `{"row_id":42,"table_id":1234}`

### `baserow_list_fields`

List Table Fields · Read-only

List the fields (columns) of a table.
Returns each field's id, name, type, primary flag and type-specific settings such as select options.
Use this before creating or updating rows to learn field names, ids and types.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `table_id` (`integer`, required): ID of the Baserow table. Get it from baserow_list_tables. Example: 1234.

Example input: `{"table_id":1234}`

### `baserow_list_rows`

List Table Rows · Read-only

List rows in a table, with optional search, filters, ordering and field selection.
Returns a page of rows plus count, next and previous page links.
Use this to browse or search a table; use baserow_get_row when you already know the row id.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `table_id` (`integer`, required): ID of the Baserow table. Get it from baserow_list_tables. Example: 1234.
- `exclude` (`string`, optional): Comma-separated fields to leave out of the response. Example: Notes.
- `filters` (`string`, optional): Filter tree as a JSON string. Example: {"filter_type": "AND", "filters": [{"type": "equal", "field": "Status", "value": "Open"}], "groups": []}. Use field names only when user_field_names is true, otherwise field ids.
- `include` (`string`, optional): Comma-separated fields to return; all other fields are left out. Example: Name,Status.
- `order_by` (`string`, optional): Comma-separated fields to sort by. Prefix a field with - for descending order. Uses field names when user_field_names is true, otherwise field_<id> keys. Example: -Created,Name.
- `page` (`integer`, optional): Page number to return, starting at 1. Example: 2.
- `search` (`string`, optional): Return only rows with a value that matches this text. Example: acme.
- `size` (`integer`, optional): Number of rows per page, from 1 to 200. Example: 50.
- `user_field_names` (`boolean`, optional): Set true to use field names (for example Name) as keys in the request and response. Leave empty to use Baserow's internal keys such as field_123. Use baserow_list_fields to see both.
- `view_id` (`integer`, optional): Apply the filters and sorts of this view. Example: 55.

Example input: `{"table_id":1234}`

### `baserow_list_tables`

List Tables · Read-only

List every table the database token can access.
Returns each table's id, name, order and database_id.
Use this first to find a table_id for the field and row tools.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs: none.

Example input: `{}`

### `baserow_batch_create_rows`

Batch Create Table Rows · Write

Create up to 200 rows in a table in one request.
Returns the created rows in the same order as the request, each with its id.
Use this for bulk inserts; use baserow_create_row for a single row.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `items` (`array`, required): List of row objects to create, from 1 to 200. Each object uses the same keys as baserow_create_row. Example: [{"Name": "Acme"}, {"Name": "Globex"}].
- `table_id` (`integer`, required): ID of the Baserow table. Get it from baserow_list_tables. Example: 1234.
- `before` (`integer`, optional): Place the new rows before the row with this id. Leave empty to add them at the end. Example: 42.
- `user_field_names` (`boolean`, optional): Set true to use field names (for example Name) as keys in the request and response. Leave empty to use Baserow's internal keys such as field_123. Use baserow_list_fields to see both.

Example input: `{"items":[{"Name":"Acme"},{"Name":"Globex"}],"table_id":1234}`

### `baserow_batch_update_rows`

Batch Update Table Rows · Write

Update up to 200 rows in a table in one request.
Returns the updated rows in the same order as the request.
Use this for bulk edits; use baserow_update_row for a single row.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `items` (`array`, required): List of row objects to update, from 1 to 200. Each object must include the row's id plus the fields to change, using the same keys as baserow_update_row. Example: [{"id": 1, "Active": false}, {"id": 2, "Active": true}].
- `table_id` (`integer`, required): ID of the Baserow table. Get it from baserow_list_tables. Example: 1234.
- `user_field_names` (`boolean`, optional): Set true to use field names (for example Name) as keys in the request and response. Leave empty to use Baserow's internal keys such as field_123. Use baserow_list_fields to see both.

Example input: `{"items":[{"id":1,"Active":false},{"id":2,"Active":true}],"table_id":1234}`

### `baserow_create_field`

Create Table Field · Write

Create a new field (column) in a table.
Returns the created field with its id, name, type and settings, plus any related fields that changed.
Use this to add a column; use baserow_list_fields to inspect existing ones.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `name` (`string`, required): Name of the new field. Must be unique within the table. Example: Status.
- `table_id` (`integer`, required): ID of the Baserow table. Get it from baserow_list_tables. Example: 1234.
- `type` (`string`, required): Field type to create. One of: text, long_text, url, email, number, rating, boolean, date, last_modified, last_modified_by, created_on, created_by, duration, link_row, file, single_select, multiple_select, phone_number, formula, count, rollup, lookup, multiple_collaborators, uuid, autonumber, password, form_view_edit_row, button, ai. Example: single_select. One of: `text`, `long_text`, `url`, `email`, `number`, `rating`, `boolean`, `date`, `last_modified`, `last_modified_by`, `created_on`, `created_by`, `duration`, `link_row`, `file`, `single_select`, `multiple_select`, `phone_number`, `formula`, `count`, `rollup`, `lookup`, `multiple_collaborators`, `uuid`, `autonumber`, `password`, `form_view_edit_row`, `button`, `ai`.
- `field_options` (`object`, optional): Type-specific settings merged into the request body, as a JSON object. For example a single_select field takes select_options (a list of value and color pairs), a number field takes number_decimal_places, and a link_row field takes link_row_table_id. Leave empty for a plain field. Example: {"select_options": [{"value": "Open", "color": "light-green"}]}.

Example input: `{"name":"<name>","table_id":1234,"type":"text"}`

### `baserow_create_row`

Create Table Row · Write

Create a new row in a table.
Returns the created row with its id, order and field values.
Use this to add one row; use baserow_batch_create_rows for several rows in one call.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `row` (`object`, required): Row values as a JSON object keyed by field name (when user_field_names is true) or by field_<id> (otherwise). Omitted fields keep their default or stay unchanged. Link row fields take a list of row ids, single select fields take an option id or value, and multiple select fields take a list of them. Example: {"Name": "Acme", "Active": true}.
- `table_id` (`integer`, required): ID of the Baserow table. Get it from baserow_list_tables. Example: 1234.
- `before` (`integer`, optional): Place the new row before the row with this id. Leave empty to add it at the end. Example: 42.
- `user_field_names` (`boolean`, optional): Set true to use field names (for example Name) as keys in the request and response. Leave empty to use Baserow's internal keys such as field_123. Use baserow_list_fields to see both.

Example input: `{"row":{"Name":"Acme","Active":true},"table_id":1234}`

### `baserow_move_row`

Move Table Row · Write

Move a row to a new position in a table.
Returns the moved row with its updated order.
Use this to reorder rows; leave before_id empty to move the row to the end.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `row_id` (`integer`, required): ID of the row (the row's id value, not its position). Example: 42.
- `table_id` (`integer`, required): ID of the Baserow table. Get it from baserow_list_tables. Example: 1234.
- `before_id` (`integer`, optional): Move the row before the row with this id. Leave empty to move it to the end. Example: 42.
- `user_field_names` (`boolean`, optional): Set true to use field names (for example Name) as keys in the request and response. Leave empty to use Baserow's internal keys such as field_123. Use baserow_list_fields to see both.

Example input: `{"row_id":42,"table_id":1234}`

### `baserow_update_row`

Update Table Row · Write

Update fields on an existing row.
Returns the updated row with its id, order and field values.
Use this to change one row; use baserow_batch_update_rows for several rows in one call.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `row` (`object`, required): Row values as a JSON object keyed by field name (when user_field_names is true) or by field_<id> (otherwise). Omitted fields keep their default or stay unchanged. Link row fields take a list of row ids, single select fields take an option id or value, and multiple select fields take a list of them. Example: {"Name": "Acme", "Active": true}. Only the fields you include are changed.
- `row_id` (`integer`, required): ID of the row (the row's id value, not its position). Example: 42.
- `table_id` (`integer`, required): ID of the Baserow table. Get it from baserow_list_tables. Example: 1234.
- `user_field_names` (`boolean`, optional): Set true to use field names (for example Name) as keys in the request and response. Leave empty to use Baserow's internal keys such as field_123. Use baserow_list_fields to see both.

Example input: `{"row":{"Name":"Acme","Active":true},"row_id":42,"table_id":1234}`

### `baserow_upload_file_via_url`

Upload File From URL · Write

Upload a file to Baserow by having Baserow download it from a public URL.
Returns the stored file with its name, url, size, mime type and thumbnails.
Use the returned name to fill a file field in baserow_create_row or baserow_update_row.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `url` (`string`, required): Public URL of the file for Baserow to download. Example: https://example.com/logo.png.

Example input: `{"url":"<url>"}`

### `baserow_batch_delete_rows`

Batch Delete Table Rows · Destructive

Delete up to 200 rows from a table in one request.
Returns an empty 204 response on success.
Use baserow_delete_row for a single row.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `items` (`array`, required): IDs of the rows to delete, from 1 to 200. Example: [1, 2, 3].
- `table_id` (`integer`, required): ID of the Baserow table. Get it from baserow_list_tables. Example: 1234.

Example input: `{"items":[1,2,3],"table_id":1234}`

### `baserow_delete_row`

Delete Table Row · Destructive

Delete a row from a table.
Returns an empty 204 response on success.
Use baserow_batch_delete_rows to delete several rows in one call.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `row_id` (`integer`, required): ID of the row (the row's id value, not its position). Example: 42.
- `table_id` (`integer`, required): ID of the Baserow table. Get it from baserow_list_tables. Example: 1234.

Example input: `{"row_id":42,"table_id":1234}`

## Related

Other Databases connectors ([all 22](/agentkit/connectors/?category=databases)):

- [Snowflake](/agentkit/connectors/snowflake/): Scalekit connector, OAuth, 42 tools
- [AWS Redshift](/agentkit/connectors/redshift/): Scalekit connector, Trusted identity provider, 10 tools
- [Google BigQuery](/agentkit/connectors/bigquery/): Scalekit connector, OAuth, 47 tools


---

## More Scalekit documentation

| Resource | What it contains | When to use it |
|----------|-----------------|----------------|
| [/llms.txt](/llms.txt) | Structured index with routing hints per product area | Start here — find which documentation set covers your topic before loading full content |
| [/llms-full.txt](/llms-full.txt) | Complete documentation for all Scalekit products in one file | Use when you need exhaustive context across multiple products or when the topic spans several areas |
| [sitemap-0.xml](https://docs.scalekit.com/sitemap-0.xml) | Full URL list of every documentation page | Use to discover specific page URLs you can fetch for targeted, page-level answers |
