---
title: Table Templates
url: https://anyrow.ai/docs/api/table-templates
canonical_url: https://anyrow.ai/docs/api/table-templates
---

# Table Templates

Reusable table schemas: browse, preview and create tables from them.

- [Browse table templates](https://anyrow.ai/docs/api/table-templates/project-list.md): `GET /v1/projects/{project_id}/table-templates`
- [Preview table template](https://anyrow.ai/docs/api/table-templates/project-get.md): `GET /v1/projects/{project_id}/table-templates/{template_id}`
- [Create table from template](https://anyrow.ai/docs/api/table-templates/use.md): `POST /v1/projects/{project_id}/table-templates/{template_id}/use`
- [Create table template](https://anyrow.ai/docs/api/table-templates/create.md): `POST /v1/table-templates`
- [List my table templates](https://anyrow.ai/docs/api/table-templates/list-mine.md): `GET /v1/table-templates/mine`
- [Update table template](https://anyrow.ai/docs/api/table-templates/update.md): `PATCH /v1/table-templates/{template_id}`
- [Delete table template](https://anyrow.ai/docs/api/table-templates/delete.md): `DELETE /v1/table-templates/{template_id}`

## The Table Template object

- `created_at` (integer, required): At least 0.
- `updated_at` (integer, required): At least 0.
- `id` (string, required): 1 to 48 characters.
- `category` (string, required): Up to 64 characters.
- `columns_json` (array of objects, required): 1 to 100 items.
  - `currency_code` (string, optional): Exactly 3 characters.
  - `default` (any, optional)
  - `description` (string, optional, nullable): Up to 256 characters.
  - `id` (string, required): 1 to 36 characters.
  - `instruction` (string, optional, nullable): Up to 512 characters.
  - `name` (string, required): 1 to 64 characters. Matches `^[\w\s.-]+$`.
  - `options` (array of strings, optional): Up to 500 items.
  - `required` (boolean, required): Defaults to `false`.
  - `searchable` (boolean, optional)
  - `type` (string, required): One of `array`, `boolean`, `currency`, `date`, `email`, `enum`, `multi_select`, `number`, `string`, `text`, `url`. Defaults to `string`.
- `creator_display_name` (string, required, nullable): Up to 101 characters.
- `creator_user_id` (string, required, nullable): Up to 48 characters.
- `description` (string, required, nullable): Up to 512 characters.
- `insert_mode` (string, required): One of `append`, `dedup`, `merge`, `replace`.
- `instruction` (string, required, nullable): Up to 512 characters.
- `merge_columns_json` (array of strings, required, nullable): At least 1 items.
- `name` (string, required): Up to 128 characters.
- `strictness` (string, required): One of `strict`, `balanced`, `flexible`.
- `usage_count` (integer, required): At least 0.

```json
{
  "created_at": 1711468800000,
  "updated_at": 1711468800000,
  "id": "ttmpl_01h5a3g8k9m2n4p6q8r0t2v4x6",
  "category": "string",
  "columns_json": [
    {
      "currency_code": "string",
      "description": "string",
      "id": "string",
      "instruction": "string",
      "name": "string",
      "options": [
        "string"
      ],
      "required": false,
      "searchable": true,
      "type": "string"
    }
  ],
  "creator_display_name": "string",
  "creator_user_id": "string",
  "description": "string",
  "insert_mode": "append",
  "instruction": "string",
  "merge_columns_json": [
    "string"
  ],
  "name": "string",
  "strictness": "strict",
  "usage_count": 42
}
```

## Browse table templates

`GET /v1/projects/{project_id}/table-templates`

Authentication: `Authorization: ApiKey {your_api_key}`.

### Path parameters

- `project_id` (string, required)

### Query parameters

- `cursor` (string, optional): Opaque cursor for forward pagination. Pass the nextCursor from the previous response with the same order. Takes precedence over page when both are sent.
- `page` (integer, optional): 1-based page number for offset pagination. Ignored when cursor is present. At least 1.
- `order` (string, optional): Sort keys, comma-separated, each `field[.asc|.desc][.nullsfirst|.nullslast]`; at most 3. Sortable: category, created_at, name, updated_at, usage_count. Default: category.desc. Nulls sort last ascending and first descending unless stated. Matches `^(?:category|created_at|name|updated_at|usage_count)(?:\.(?:asc|desc))?(?:\.(?:nullsfirst|nullslast))?(?:,(?:category|created_at|name|updated_at|usage_count)(?:\.(?:asc|desc))?(?:\.(?:nullsfirst|nullslast))?){0,2}$`.
- `filter` (string, optional): Filter expression `field.op.value`; `,` joins conditions with AND; group with `or(...)` and `and(...)`. Fields: category (enum: eq, ne, neq, in, nin, is); created_at (number: eq, ne, neq, gt, gte, lt, lte, in, nin, is); id (string: eq, ne, neq, like, ilike, in, nin, is); name (string: eq, ne, neq, like, ilike, in, nin, is). `like` is case-sensitive and `ilike` ignores ASCII case; `*` is the wildcard. `in`/`nin` take `(a,b)`; `is` takes `null` or `notnull`. At most 20 conditions, 3 nested groups, 100 in/nin values.
- `q` (string, optional): Free-text search over: name, description, creator_display_name. Whitespace-separated terms must all match. Up to 200 characters.
- `limit` (integer, optional): Maximum number of items per page. Defaults to 20, capped by the endpoint's maxLimit. Defaults to `20`. Between 1 and 100.

### Returns

200 `application/json`.

- `count` (integer, required): At least 0.
- `hasMore` (boolean, required)
- `limit` (integer, required): At least 1.
- `nextCursor` (string, required, nullable)
- `page` (integer, required, nullable): At least 1.
- `templates` (array of objects, required)
  - `created_at` (integer, required): At least 0.
  - `updated_at` (integer, required): At least 0.
  - `id` (string, required): 1 to 48 characters.
  - `category` (string, required): Up to 64 characters.
  - `columns_json` (array of objects, required): 1 to 100 items.
    - `currency_code` (string, optional): Exactly 3 characters.
    - `default` (any, optional)
    - `description` (string, optional, nullable): Up to 256 characters.
    - `id` (string, required): 1 to 36 characters.
    - `instruction` (string, optional, nullable): Up to 512 characters.
    - `name` (string, required): 1 to 64 characters. Matches `^[\w\s.-]+$`.
    - `options` (array of strings, optional): Up to 500 items.
    - `required` (boolean, required): Defaults to `false`.
    - `searchable` (boolean, optional)
    - `type` (string, required): One of `array`, `boolean`, `currency`, `date`, `email`, `enum`, `multi_select`, `number`, `string`, `text`, `url`. Defaults to `string`.
  - `creator_display_name` (string, required, nullable): Up to 101 characters.
  - `creator_user_id` (string, required, nullable): Up to 48 characters.
  - `description` (string, required, nullable): Up to 512 characters.
  - `insert_mode` (string, required): One of `append`, `dedup`, `merge`, `replace`.
  - `instruction` (string, required, nullable): Up to 512 characters.
  - `merge_columns_json` (array of strings, required, nullable): At least 1 items.
  - `name` (string, required): Up to 128 characters.
  - `strictness` (string, required): One of `strict`, `balanced`, `flexible`.
  - `usage_count` (integer, required): At least 0.

### Errors

- 404: `not_found`

Errors every endpoint can return: [Errors](https://anyrow.ai/docs/api/errors.md).

### Request

```ts title="Node.js"
import { AnyrowSDK } from "@anyrow/sdk"

const anyrow = new AnyrowSDK({
  baseURL: "https://api.anyrow.ai",
  headers: { Authorization: `ApiKey ${process.env.ANYROW_API_KEY}` },
})

const { data, error } = await anyrow.tableTemplate.projectList({
  params: {
    project_id: "{project_id}"
  },
})
```

```bash title="cURL"
curl 'https://api.anyrow.ai/v1/projects/{project_id}/table-templates' \
  -H 'Authorization: ApiKey {your_api_key}'
```

```js title="JavaScript"
const response = await fetch("https://api.anyrow.ai/v1/projects/{project_id}/table-templates", {
  headers: {
    Authorization: "ApiKey {your_api_key}",
  },
})
const data = await response.json()
```

```python title="Python"
import requests

response = requests.get(
    "https://api.anyrow.ai/v1/projects/{project_id}/table-templates",
    headers={
        "Authorization": "ApiKey {your_api_key}",
    },
)
print(response.json())
```

### Response

```json title="200"
{
  "count": 0,
  "hasMore": true,
  "limit": 1,
  "nextCursor": "string",
  "page": 1,
  "templates": [
    {
      "created_at": 1711468800000,
      "updated_at": 1711468800000,
      "id": "ttmpl_01h5a3g8k9m2n4p6q8r0t2v4x6",
      "category": "string",
      "columns_json": [
        {
          "currency_code": "string",
          "description": "string",
          "id": "string",
          "instruction": "string",
          "name": "string",
          "options": [
            "string"
          ],
          "required": false,
          "searchable": true,
          "type": "string"
        }
      ],
      "creator_display_name": "string",
      "creator_user_id": "string",
      "description": "string",
      "insert_mode": "append",
      "instruction": "string",
      "merge_columns_json": [
        "string"
      ],
      "name": "string",
      "strictness": "strict",
      "usage_count": 42
    }
  ]
}
```

## Preview table template

`GET /v1/projects/{project_id}/table-templates/{template_id}`

Authentication: `Authorization: ApiKey {your_api_key}`.

### Path parameters

- `project_id` (string, required)
- `template_id` (string, required)

### Returns

200 `application/json`.

- `created_at` (integer, required): At least 0.
- `updated_at` (integer, required): At least 0.
- `id` (string, required): 1 to 48 characters.
- `category` (string, required): Up to 64 characters.
- `columns_json` (array of objects, required): 1 to 100 items.
  - `currency_code` (string, optional): Exactly 3 characters.
  - `default` (any, optional)
  - `description` (string, optional, nullable): Up to 256 characters.
  - `id` (string, required): 1 to 36 characters.
  - `instruction` (string, optional, nullable): Up to 512 characters.
  - `name` (string, required): 1 to 64 characters. Matches `^[\w\s.-]+$`.
  - `options` (array of strings, optional): Up to 500 items.
  - `required` (boolean, required): Defaults to `false`.
  - `searchable` (boolean, optional)
  - `type` (string, required): One of `array`, `boolean`, `currency`, `date`, `email`, `enum`, `multi_select`, `number`, `string`, `text`, `url`. Defaults to `string`.
- `creator_display_name` (string, required, nullable): Up to 101 characters.
- `creator_user_id` (string, required, nullable): Up to 48 characters.
- `description` (string, required, nullable): Up to 512 characters.
- `insert_mode` (string, required): One of `append`, `dedup`, `merge`, `replace`.
- `instruction` (string, required, nullable): Up to 512 characters.
- `merge_columns_json` (array of strings, required, nullable): At least 1 items.
- `name` (string, required): Up to 128 characters.
- `strictness` (string, required): One of `strict`, `balanced`, `flexible`.
- `usage_count` (integer, required): At least 0.

### Errors

- 404: `not_found`, `table_not_found`

Errors every endpoint can return: [Errors](https://anyrow.ai/docs/api/errors.md).

### Request

```ts title="Node.js"
import { AnyrowSDK } from "@anyrow/sdk"

const anyrow = new AnyrowSDK({
  baseURL: "https://api.anyrow.ai",
  headers: { Authorization: `ApiKey ${process.env.ANYROW_API_KEY}` },
})

const { data, error } = await anyrow.tableTemplate.projectGet({
  params: {
    project_id: "{project_id}",
    template_id: "{template_id}"
  },
})
```

```bash title="cURL"
curl 'https://api.anyrow.ai/v1/projects/{project_id}/table-templates/{template_id}' \
  -H 'Authorization: ApiKey {your_api_key}'
```

```js title="JavaScript"
const response = await fetch("https://api.anyrow.ai/v1/projects/{project_id}/table-templates/{template_id}", {
  headers: {
    Authorization: "ApiKey {your_api_key}",
  },
})
const data = await response.json()
```

```python title="Python"
import requests

response = requests.get(
    "https://api.anyrow.ai/v1/projects/{project_id}/table-templates/{template_id}",
    headers={
        "Authorization": "ApiKey {your_api_key}",
    },
)
print(response.json())
```

### Response

```json title="200"
{
  "created_at": 1711468800000,
  "updated_at": 1711468800000,
  "id": "ttmpl_01h5a3g8k9m2n4p6q8r0t2v4x6",
  "category": "string",
  "columns_json": [
    {
      "currency_code": "string",
      "description": "string",
      "id": "string",
      "instruction": "string",
      "name": "string",
      "options": [
        "string"
      ],
      "required": false,
      "searchable": true,
      "type": "string"
    }
  ],
  "creator_display_name": "string",
  "creator_user_id": "string",
  "description": "string",
  "insert_mode": "append",
  "instruction": "string",
  "merge_columns_json": [
    "string"
  ],
  "name": "string",
  "strictness": "strict",
  "usage_count": 42
}
```

## Create table from template

`POST /v1/projects/{project_id}/table-templates/{template_id}/use`

Authentication: `Authorization: ApiKey {your_api_key}`.

### Path parameters

- `project_id` (string, required)
- `template_id` (string, required)

### Request body

Content type: `application/json` (required).

- `name` (string, required): 1 to 128 characters.
- `slug` (string, optional): 1 to 50 characters.

### Returns

201 `application/json`: created.

- `created_at` (integer, required): At least 0.
- `deleted_at` (integer, required, nullable): At least 0.
- `updated_at` (integer, required): At least 0.
- `id` (string, required): 1 to 48 characters.
- `project_id` (string, required): 1 to 48 characters.
- `name` (string, required): 1 to 128 characters.
- `slug` (string, required): 1 to 50 characters.
- `columns_json` (array of objects, required): 1 to 100 items.
  - `currency_code` (string, optional): Exactly 3 characters.
  - `default` (any, optional)
  - `description` (string, optional, nullable): Up to 256 characters.
  - `id` (string, required): 1 to 36 characters.
  - `instruction` (string, optional, nullable): Up to 512 characters.
  - `name` (string, required): 1 to 64 characters. Matches `^[\w\s.-]+$`.
  - `options` (array of strings, optional): Up to 500 items.
  - `required` (boolean, required): Defaults to `false`.
  - `searchable` (boolean, optional)
  - `type` (string, required): One of `array`, `boolean`, `currency`, `date`, `email`, `enum`, `multi_select`, `number`, `string`, `text`, `url`. Defaults to `string`.
- `instruction` (string, required, nullable): Up to 512 characters.
- `strictness` (string, required): One of `strict`, `balanced`, `flexible`.
- `insert_mode` (string, required): One of `append`, `dedup`, `merge`, `replace`.
- `merge_columns_json` (array of strings, required, nullable): At least 1 items.
- `default_sort` (string, required, nullable)
- `row_count` (integer, required): At least 0.
- `usage_count` (integer, required): At least 0.
- `data_version` (integer, required): At least 0.
- `fts_version` (integer, required): At least 0.
- `last_used_at` (integer, required, nullable): At least 0.

### Errors

- 404: `not_found`, `table_not_found`
- 409: `table_project_id_duplicate`

Errors every endpoint can return: [Errors](https://anyrow.ai/docs/api/errors.md).

### Request

```ts title="Node.js"
import { AnyrowSDK } from "@anyrow/sdk"

const anyrow = new AnyrowSDK({
  baseURL: "https://api.anyrow.ai",
  headers: { Authorization: `ApiKey ${process.env.ANYROW_API_KEY}` },
})

const { data, error } = await anyrow.tableTemplate.use({
  params: {
    project_id: "{project_id}",
    template_id: "{template_id}"
  },
  json: {
    name: "string",
    slug: "string"
  },
})
```

```bash title="cURL"
curl -X POST 'https://api.anyrow.ai/v1/projects/{project_id}/table-templates/{template_id}/use' \
  -H 'Authorization: ApiKey {your_api_key}' \
  -H 'Content-Type: application/json' \
  -d '{
  "name": "string",
  "slug": "string"
}'
```

```js title="JavaScript"
const response = await fetch("https://api.anyrow.ai/v1/projects/{project_id}/table-templates/{template_id}/use", {
  method: "POST",
  headers: {
    Authorization: "ApiKey {your_api_key}",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    "name": "string",
    "slug": "string"
  }),
})
const data = await response.json()
```

```python title="Python"
import requests

response = requests.post(
    "https://api.anyrow.ai/v1/projects/{project_id}/table-templates/{template_id}/use",
    headers={
        "Authorization": "ApiKey {your_api_key}",
    },
    json={
        "name": "string",
        "slug": "string",
    },
)
print(response.json())
```

### Response

```json title="201"
{
  "created_at": 1711468800000,
  "deleted_at": 1711468800000,
  "updated_at": 1711468800000,
  "id": "tbl_01h5a3g8k9m2n4p6q8r0t2v4x6",
  "project_id": "string",
  "name": "string",
  "slug": "string",
  "columns_json": [
    {
      "currency_code": "string",
      "description": "string",
      "id": "string",
      "instruction": "string",
      "name": "string",
      "options": [
        "string"
      ],
      "required": false,
      "searchable": true,
      "type": "string"
    }
  ],
  "instruction": "string",
  "strictness": "strict",
  "insert_mode": "append",
  "merge_columns_json": [
    "string"
  ],
  "default_sort": "string",
  "row_count": 42,
  "usage_count": 42,
  "data_version": 42,
  "fts_version": 42,
  "last_used_at": 1711468800000
}
```

## Create table template

`POST /v1/table-templates`

Authentication: `Authorization: ApiKey {your_api_key}`.

### Request body

Content type: `application/json` (required).

- `category` (string, required): 1 to 64 characters.
- `columns_json` (array of objects, required): 1 to 100 items.
  - `currency_code` (string, optional): Exactly 3 characters.
  - `default` (any, optional)
  - `description` (string, optional, nullable): Up to 256 characters.
  - `id` (string, required): 1 to 36 characters.
  - `instruction` (string, optional, nullable): Up to 512 characters.
  - `name` (string, required): 1 to 64 characters. Matches `^[\w\s.-]+$`.
  - `options` (array of strings, optional): Up to 500 items.
  - `required` (boolean, optional): Defaults to `false`.
  - `searchable` (boolean, optional)
  - `type` (string, optional): One of `array`, `boolean`, `currency`, `date`, `email`, `enum`, `multi_select`, `number`, `string`, `text`, `url`. Defaults to `string`.
- `description` (string, optional, nullable): Up to 512 characters.
- `insert_mode` (string, optional): One of `append`, `dedup`, `merge`, `replace`.
- `instruction` (string, optional, nullable): Up to 512 characters.
- `merge_columns_json` (array of strings, optional, nullable): At least 1 items.
- `name` (string, required): 1 to 128 characters.
- `strictness` (string, optional): One of `strict`, `balanced`, `flexible`.

### Returns

201 `application/json`: created.

- `created_at` (integer, required): At least 0.
- `updated_at` (integer, required): At least 0.
- `id` (string, required): 1 to 48 characters.
- `category` (string, required): Up to 64 characters.
- `columns_json` (array of objects, required): 1 to 100 items.
  - `currency_code` (string, optional): Exactly 3 characters.
  - `default` (any, optional)
  - `description` (string, optional, nullable): Up to 256 characters.
  - `id` (string, required): 1 to 36 characters.
  - `instruction` (string, optional, nullable): Up to 512 characters.
  - `name` (string, required): 1 to 64 characters. Matches `^[\w\s.-]+$`.
  - `options` (array of strings, optional): Up to 500 items.
  - `required` (boolean, required): Defaults to `false`.
  - `searchable` (boolean, optional)
  - `type` (string, required): One of `array`, `boolean`, `currency`, `date`, `email`, `enum`, `multi_select`, `number`, `string`, `text`, `url`. Defaults to `string`.
- `creator_display_name` (string, required, nullable): Up to 101 characters.
- `creator_user_id` (string, required, nullable): Up to 48 characters.
- `description` (string, required, nullable): Up to 512 characters.
- `insert_mode` (string, required): One of `append`, `dedup`, `merge`, `replace`.
- `instruction` (string, required, nullable): Up to 512 characters.
- `merge_columns_json` (array of strings, required, nullable): At least 1 items.
- `name` (string, required): Up to 128 characters.
- `strictness` (string, required): One of `strict`, `balanced`, `flexible`.
- `usage_count` (integer, required): At least 0.

### Errors

- 404: `not_found`

Errors every endpoint can return: [Errors](https://anyrow.ai/docs/api/errors.md).

### Request

```ts title="Node.js"
import { AnyrowSDK } from "@anyrow/sdk"

const anyrow = new AnyrowSDK({
  baseURL: "https://api.anyrow.ai",
  headers: { Authorization: `ApiKey ${process.env.ANYROW_API_KEY}` },
})

const { data, error } = await anyrow.tableTemplate.create({
  json: {
    category: "string",
    columns_json: [
      {
        currency_code: "string",
        description: "string",
        id: "string",
        instruction: "string",
        name: "string",
        options: [
          "string"
        ],
        required: false,
        searchable: true,
        type: "string"
      }
    ],
    description: "string",
    insert_mode: "append",
    instruction: "string",
    merge_columns_json: [
      "string"
    ],
    name: "string",
    strictness: "strict"
  },
})
```

```bash title="cURL"
curl -X POST 'https://api.anyrow.ai/v1/table-templates' \
  -H 'Authorization: ApiKey {your_api_key}' \
  -H 'Content-Type: application/json' \
  -d '{
  "category": "string",
  "columns_json": [
    {
      "currency_code": "string",
      "description": "string",
      "id": "string",
      "instruction": "string",
      "name": "string",
      "options": [
        "string"
      ],
      "required": false,
      "searchable": true,
      "type": "string"
    }
  ],
  "description": "string",
  "insert_mode": "append",
  "instruction": "string",
  "merge_columns_json": [
    "string"
  ],
  "name": "string",
  "strictness": "strict"
}'
```

```js title="JavaScript"
const response = await fetch("https://api.anyrow.ai/v1/table-templates", {
  method: "POST",
  headers: {
    Authorization: "ApiKey {your_api_key}",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    "category": "string",
    "columns_json": [
      {
        "currency_code": "string",
        "description": "string",
        "id": "string",
        "instruction": "string",
        "name": "string",
        "options": [
          "string"
        ],
        "required": false,
        "searchable": true,
        "type": "string"
      }
    ],
    "description": "string",
    "insert_mode": "append",
    "instruction": "string",
    "merge_columns_json": [
      "string"
    ],
    "name": "string",
    "strictness": "strict"
  }),
})
const data = await response.json()
```

```python title="Python"
import requests

response = requests.post(
    "https://api.anyrow.ai/v1/table-templates",
    headers={
        "Authorization": "ApiKey {your_api_key}",
    },
    json={
        "category": "string",
        "columns_json": [
            {
                "currency_code": "string",
                "description": "string",
                "id": "string",
                "instruction": "string",
                "name": "string",
                "options": [
                    "string",
                ],
                "required": False,
                "searchable": True,
                "type": "string",
            },
        ],
        "description": "string",
        "insert_mode": "append",
        "instruction": "string",
        "merge_columns_json": [
            "string",
        ],
        "name": "string",
        "strictness": "strict",
    },
)
print(response.json())
```

### Response

```json title="201"
{
  "created_at": 1711468800000,
  "updated_at": 1711468800000,
  "id": "ttmpl_01h5a3g8k9m2n4p6q8r0t2v4x6",
  "category": "string",
  "columns_json": [
    {
      "currency_code": "string",
      "description": "string",
      "id": "string",
      "instruction": "string",
      "name": "string",
      "options": [
        "string"
      ],
      "required": false,
      "searchable": true,
      "type": "string"
    }
  ],
  "creator_display_name": "string",
  "creator_user_id": "string",
  "description": "string",
  "insert_mode": "append",
  "instruction": "string",
  "merge_columns_json": [
    "string"
  ],
  "name": "string",
  "strictness": "strict",
  "usage_count": 42
}
```

## List my table templates

`GET /v1/table-templates/mine`

Authentication: `Authorization: ApiKey {your_api_key}`.

### Query parameters

- `cursor` (string, optional): Opaque cursor for forward pagination. Pass the nextCursor from the previous response with the same order. Takes precedence over page when both are sent.
- `page` (integer, optional): 1-based page number for offset pagination. Ignored when cursor is present. At least 1.
- `order` (string, optional): Sort keys, comma-separated, each `field[.asc|.desc][.nullsfirst|.nullslast]`; at most 3. Sortable: category, created_at, name, updated_at, usage_count. Default: category.desc. Nulls sort last ascending and first descending unless stated. Matches `^(?:category|created_at|name|updated_at|usage_count)(?:\.(?:asc|desc))?(?:\.(?:nullsfirst|nullslast))?(?:,(?:category|created_at|name|updated_at|usage_count)(?:\.(?:asc|desc))?(?:\.(?:nullsfirst|nullslast))?){0,2}$`.
- `filter` (string, optional): Filter expression `field.op.value`; `,` joins conditions with AND; group with `or(...)` and `and(...)`. Fields: category (enum: eq, ne, neq, in, nin, is); created_at (number: eq, ne, neq, gt, gte, lt, lte, in, nin, is); id (string: eq, ne, neq, like, ilike, in, nin, is); name (string: eq, ne, neq, like, ilike, in, nin, is). `like` is case-sensitive and `ilike` ignores ASCII case; `*` is the wildcard. `in`/`nin` take `(a,b)`; `is` takes `null` or `notnull`. At most 20 conditions, 3 nested groups, 100 in/nin values.
- `q` (string, optional): Free-text search over: name, description, creator_display_name. Whitespace-separated terms must all match. Up to 200 characters.
- `select` (string, optional): PostgREST-style sparse fieldset. Scalars comma-separated; relations embedded as name(fields); wildcard * selects all scalars. Docs: https://docs.postgrest.org/en/stable/references/api/resource_embedding.html Up to 500 characters.
- `limit` (integer, optional): Maximum number of items per page. Defaults to 20, capped by the endpoint's maxLimit. Defaults to `20`. Between 1 and 100.

### Returns

200 `application/json`.

- `count` (integer, required): At least 0.
- `hasMore` (boolean, required)
- `limit` (integer, required): At least 1.
- `nextCursor` (string, required, nullable)
- `page` (integer, required, nullable): At least 1.
- `templates` (array of objects, required)
  - `created_at` (integer, required): At least 0.
  - `updated_at` (integer, required): At least 0.
  - `id` (string, required): 1 to 48 characters.
  - `category` (string, required): Up to 64 characters.
  - `columns_json` (array of objects, required): 1 to 100 items.
    - `currency_code` (string, optional): Exactly 3 characters.
    - `default` (any, optional)
    - `description` (string, optional, nullable): Up to 256 characters.
    - `id` (string, required): 1 to 36 characters.
    - `instruction` (string, optional, nullable): Up to 512 characters.
    - `name` (string, required): 1 to 64 characters. Matches `^[\w\s.-]+$`.
    - `options` (array of strings, optional): Up to 500 items.
    - `required` (boolean, required): Defaults to `false`.
    - `searchable` (boolean, optional)
    - `type` (string, required): One of `array`, `boolean`, `currency`, `date`, `email`, `enum`, `multi_select`, `number`, `string`, `text`, `url`. Defaults to `string`.
  - `creator_display_name` (string, required, nullable): Up to 101 characters.
  - `creator_user_id` (string, required, nullable): Up to 48 characters.
  - `description` (string, required, nullable): Up to 512 characters.
  - `insert_mode` (string, required): One of `append`, `dedup`, `merge`, `replace`.
  - `instruction` (string, required, nullable): Up to 512 characters.
  - `merge_columns_json` (array of strings, required, nullable): At least 1 items.
  - `name` (string, required): Up to 128 characters.
  - `strictness` (string, required): One of `strict`, `balanced`, `flexible`.
  - `usage_count` (integer, required): At least 0.

### Errors

- 404: `not_found`

Errors every endpoint can return: [Errors](https://anyrow.ai/docs/api/errors.md).

### Request

```ts title="Node.js"
import { AnyrowSDK } from "@anyrow/sdk"

const anyrow = new AnyrowSDK({
  baseURL: "https://api.anyrow.ai",
  headers: { Authorization: `ApiKey ${process.env.ANYROW_API_KEY}` },
})

const { data, error } = await anyrow.tableTemplate.listMine({})
```

```bash title="cURL"
curl 'https://api.anyrow.ai/v1/table-templates/mine' \
  -H 'Authorization: ApiKey {your_api_key}'
```

```js title="JavaScript"
const response = await fetch("https://api.anyrow.ai/v1/table-templates/mine", {
  headers: {
    Authorization: "ApiKey {your_api_key}",
  },
})
const data = await response.json()
```

```python title="Python"
import requests

response = requests.get(
    "https://api.anyrow.ai/v1/table-templates/mine",
    headers={
        "Authorization": "ApiKey {your_api_key}",
    },
)
print(response.json())
```

### Response

```json title="200"
{
  "count": 0,
  "hasMore": true,
  "limit": 1,
  "nextCursor": "string",
  "page": 1,
  "templates": [
    {
      "created_at": 1711468800000,
      "updated_at": 1711468800000,
      "id": "ttmpl_01h5a3g8k9m2n4p6q8r0t2v4x6",
      "category": "string",
      "columns_json": [
        {
          "currency_code": "string",
          "description": "string",
          "id": "string",
          "instruction": "string",
          "name": "string",
          "options": [
            "string"
          ],
          "required": false,
          "searchable": true,
          "type": "string"
        }
      ],
      "creator_display_name": "string",
      "creator_user_id": "string",
      "description": "string",
      "insert_mode": "append",
      "instruction": "string",
      "merge_columns_json": [
        "string"
      ],
      "name": "string",
      "strictness": "strict",
      "usage_count": 42
    }
  ]
}
```

## Update table template

`PATCH /v1/table-templates/{template_id}`

Authentication: `Authorization: ApiKey {your_api_key}`.

### Path parameters

- `template_id` (string, required)

### Request body

Content type: `application/json` (required).

- `category` (string, optional): Up to 64 characters.
- `columns_json` (array of objects, optional): 1 to 100 items.
  - `currency_code` (string, optional): Exactly 3 characters.
  - `default` (any, optional)
  - `description` (string, optional, nullable): Up to 256 characters.
  - `id` (string, required): 1 to 36 characters.
  - `instruction` (string, optional, nullable): Up to 512 characters.
  - `name` (string, required): 1 to 64 characters. Matches `^[\w\s.-]+$`.
  - `options` (array of strings, optional): Up to 500 items.
  - `required` (boolean, optional): Defaults to `false`.
  - `searchable` (boolean, optional)
  - `type` (string, optional): One of `array`, `boolean`, `currency`, `date`, `email`, `enum`, `multi_select`, `number`, `string`, `text`, `url`. Defaults to `string`.
- `description` (string, optional, nullable): Up to 512 characters.
- `insert_mode` (string, optional): One of `append`, `dedup`, `merge`, `replace`.
- `instruction` (string, optional, nullable): Up to 512 characters.
- `merge_columns_json` (array of strings, optional, nullable): At least 1 items.
- `name` (string, optional): Up to 128 characters.
- `strictness` (string, optional): One of `strict`, `balanced`, `flexible`.

### Returns

200 `application/json`.

- `created_at` (integer, required): At least 0.
- `updated_at` (integer, required): At least 0.
- `id` (string, required): 1 to 48 characters.
- `category` (string, required): Up to 64 characters.
- `columns_json` (array of objects, required): 1 to 100 items.
  - `currency_code` (string, optional): Exactly 3 characters.
  - `default` (any, optional)
  - `description` (string, optional, nullable): Up to 256 characters.
  - `id` (string, required): 1 to 36 characters.
  - `instruction` (string, optional, nullable): Up to 512 characters.
  - `name` (string, required): 1 to 64 characters. Matches `^[\w\s.-]+$`.
  - `options` (array of strings, optional): Up to 500 items.
  - `required` (boolean, required): Defaults to `false`.
  - `searchable` (boolean, optional)
  - `type` (string, required): One of `array`, `boolean`, `currency`, `date`, `email`, `enum`, `multi_select`, `number`, `string`, `text`, `url`. Defaults to `string`.
- `creator_display_name` (string, required, nullable): Up to 101 characters.
- `creator_user_id` (string, required, nullable): Up to 48 characters.
- `description` (string, required, nullable): Up to 512 characters.
- `insert_mode` (string, required): One of `append`, `dedup`, `merge`, `replace`.
- `instruction` (string, required, nullable): Up to 512 characters.
- `merge_columns_json` (array of strings, required, nullable): At least 1 items.
- `name` (string, required): Up to 128 characters.
- `strictness` (string, required): One of `strict`, `balanced`, `flexible`.
- `usage_count` (integer, required): At least 0.

### Errors

- 403: `email_not_verified`, `forbidden`, `impersonation_forbidden`, `org_suspended`, `table_template_forbidden`
- 404: `not_found`, `table_template_not_found`

Errors every endpoint can return: [Errors](https://anyrow.ai/docs/api/errors.md).

### Request

```ts title="Node.js"
import { AnyrowSDK } from "@anyrow/sdk"

const anyrow = new AnyrowSDK({
  baseURL: "https://api.anyrow.ai",
  headers: { Authorization: `ApiKey ${process.env.ANYROW_API_KEY}` },
})

const { data, error } = await anyrow.tableTemplate.update({
  params: {
    template_id: "{template_id}"
  },
  json: {
    category: "string",
    columns_json: [
      {
        currency_code: "string",
        description: "string",
        id: "string",
        instruction: "string",
        name: "string",
        options: [
          "string"
        ],
        required: false,
        searchable: true,
        type: "string"
      }
    ],
    description: "string",
    insert_mode: "append",
    instruction: "string",
    merge_columns_json: [
      "string"
    ],
    name: "string",
    strictness: "strict"
  },
})
```

```bash title="cURL"
curl -X PATCH 'https://api.anyrow.ai/v1/table-templates/{template_id}' \
  -H 'Authorization: ApiKey {your_api_key}' \
  -H 'Content-Type: application/json' \
  -d '{
  "category": "string",
  "columns_json": [
    {
      "currency_code": "string",
      "description": "string",
      "id": "string",
      "instruction": "string",
      "name": "string",
      "options": [
        "string"
      ],
      "required": false,
      "searchable": true,
      "type": "string"
    }
  ],
  "description": "string",
  "insert_mode": "append",
  "instruction": "string",
  "merge_columns_json": [
    "string"
  ],
  "name": "string",
  "strictness": "strict"
}'
```

```js title="JavaScript"
const response = await fetch("https://api.anyrow.ai/v1/table-templates/{template_id}", {
  method: "PATCH",
  headers: {
    Authorization: "ApiKey {your_api_key}",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    "category": "string",
    "columns_json": [
      {
        "currency_code": "string",
        "description": "string",
        "id": "string",
        "instruction": "string",
        "name": "string",
        "options": [
          "string"
        ],
        "required": false,
        "searchable": true,
        "type": "string"
      }
    ],
    "description": "string",
    "insert_mode": "append",
    "instruction": "string",
    "merge_columns_json": [
      "string"
    ],
    "name": "string",
    "strictness": "strict"
  }),
})
const data = await response.json()
```

```python title="Python"
import requests

response = requests.patch(
    "https://api.anyrow.ai/v1/table-templates/{template_id}",
    headers={
        "Authorization": "ApiKey {your_api_key}",
    },
    json={
        "category": "string",
        "columns_json": [
            {
                "currency_code": "string",
                "description": "string",
                "id": "string",
                "instruction": "string",
                "name": "string",
                "options": [
                    "string",
                ],
                "required": False,
                "searchable": True,
                "type": "string",
            },
        ],
        "description": "string",
        "insert_mode": "append",
        "instruction": "string",
        "merge_columns_json": [
            "string",
        ],
        "name": "string",
        "strictness": "strict",
    },
)
print(response.json())
```

### Response

```json title="200"
{
  "created_at": 1711468800000,
  "updated_at": 1711468800000,
  "id": "ttmpl_01h5a3g8k9m2n4p6q8r0t2v4x6",
  "category": "string",
  "columns_json": [
    {
      "currency_code": "string",
      "description": "string",
      "id": "string",
      "instruction": "string",
      "name": "string",
      "options": [
        "string"
      ],
      "required": false,
      "searchable": true,
      "type": "string"
    }
  ],
  "creator_display_name": "string",
  "creator_user_id": "string",
  "description": "string",
  "insert_mode": "append",
  "instruction": "string",
  "merge_columns_json": [
    "string"
  ],
  "name": "string",
  "strictness": "strict",
  "usage_count": 42
}
```

## Delete table template

`DELETE /v1/table-templates/{template_id}`

Authentication: `Authorization: ApiKey {your_api_key}`.

### Path parameters

- `template_id` (string, required)

### Returns

200 `application/json`.

- `id` (string, required)

### Errors

- 403: `email_not_verified`, `forbidden`, `impersonation_forbidden`, `org_suspended`, `table_template_forbidden`
- 404: `not_found`, `table_template_not_found`

Errors every endpoint can return: [Errors](https://anyrow.ai/docs/api/errors.md).

### Request

```ts title="Node.js"
import { AnyrowSDK } from "@anyrow/sdk"

const anyrow = new AnyrowSDK({
  baseURL: "https://api.anyrow.ai",
  headers: { Authorization: `ApiKey ${process.env.ANYROW_API_KEY}` },
})

const { data, error } = await anyrow.tableTemplate.delete({
  params: {
    template_id: "{template_id}"
  },
})
```

```bash title="cURL"
curl -X DELETE 'https://api.anyrow.ai/v1/table-templates/{template_id}' \
  -H 'Authorization: ApiKey {your_api_key}'
```

```js title="JavaScript"
const response = await fetch("https://api.anyrow.ai/v1/table-templates/{template_id}", {
  method: "DELETE",
  headers: {
    Authorization: "ApiKey {your_api_key}",
  },
})
const data = await response.json()
```

```python title="Python"
import requests

response = requests.delete(
    "https://api.anyrow.ai/v1/table-templates/{template_id}",
    headers={
        "Authorization": "ApiKey {your_api_key}",
    },
)
print(response.json())
```

### Response

```json title="200"
{
  "id": "string"
}
```
