---
title: "POST /v1/tables/actions/write-rows"
method: POST
path: "/v1/tables/actions/write-rows"
tags: ["tables-controller"]
---

# POST /v1/tables/actions/write-rows

`POST /v1/tables/actions/write-rows`

## Request

- Base URL: `https://api.xtiles.app`
- URL: `https://api.xtiles.app/v1/tables/actions/write-rows`
- Auth: HTTP bearer

## Headers

- `API-Version` string

## Request body

- WriteTableRowsRequest
  - `url` string, required
  - `operations` TableRowOperation[], required
    - `op` 'create' | 'update' | 'delete'
    - `row_id` string
    - `values` object
  - `allow_new_options` boolean: Default false. When true, a label that a select or multiselect column does not have yet is added to that column as a new option, and the cell is written with it; the response then lists the options this call created in `created_options`. A label within one or two letters (or only case/spacing, or two adjacent letters swapped) of an existing option is still refused with `did_you_mean` — a near-duplicate option is never created by a row write. An existing option shorter than four characters counts only an exact match regardless of case or a swap (`Bgu` next to `Bug`), so `P2` next to `P1` is created. When two options are equally near, `did_you_mean` is null and the error names them all. Labels whose numbers differ (`Sprint 12` / `Sprint 13`) are not near-misses. Priority and other system-owned option lists never accept new options. In a multiselect labels are separated by commas, so a comma inside a new label is escaped as `\,` (`Lviv\, Ukraine` is one label `Lviv, Ukraine`) and a backslash as `\\`; a select reads the same escapes. An empty label is refused. A new label is at most 200 characters and may not contain control characters (line breaks, tabs), and one call adds at most 50 new options; an operation past either limit is refused as `invalid`. The same new label in several cells of one call is created once; a later spelling of it that differs only in case, spacing or a typo is refused with `did_you_mean` naming the first. Options are created before the rows that use them; this is not a transaction, so if creating one fails, the operation that needed it is `failed`, later operations are `skipped`, and options already created stay.

## Response `200`

OK

---

[API](https://skmtc.dev/xtiles/apis/xtiles-public-api.md) · [All operations](https://skmtc.dev/xtiles/apis/xtiles-public-api/llms.txt) · [OpenAPI document](https://skmtc.dev/xtiles/apis/xtiles-public-api/revisions/6fe0c7e0a69f?raw)
