Tables with the API

Create tables, manage their columns, and add, edit and delete rows in batches.

By YalangoUpdated October 7, 2026

Reading needs a key with the tables:read scope. Every change needs tables:write.

Columns and rows have numeric ids

Each column has a numeric column_id, and each row a numeric row_id. Row values are keyed by column id, not by column name, so renaming a column never breaks your data. Get the ids from GET /v1/tables/{tableDocId}:

{
  "table": {
    "doc_id": "Lm3nQ8rT2wXyZ5aB7cD9",
    "id": 30918273645,
    "name": "Ser and estar",
    "description": "",
    "source_ISO_639-1": "en",
    "target_ISO_639-1": "es",
    "privacy": "private",
    "number_of_rows": 2,
    "columns": [
      { "column_id": 481920, "name": "Pronoun" },
      { "column_id": 736104, "name": "Ser" }
    ],
    "created_timestamp": "2026-10-02T09:12:00.000Z",
    "last_updated_timestamp": "2026-10-02T09:12:00.000Z"
  }
}

Create a table

curl -X POST https://yalango.com/api/v1/tables \
  -H "Authorization: Bearer yal_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Ser and estar",
    "target_ISO_639-1": "es",
    "source_ISO_639-1": "en",
    "columns": ["Pronoun", "Ser", "Estar"]
  }'

name (up to 100 characters) and target_ISO_639-1 are required. columns defaults to two columns, and a table can have at most 50. Tables created through the API are private.

PATCH /v1/tables/{tableDocId} changes name and description. The language is fixed when the table is created.

Change columns

PATCH /v1/tables/{tableDocId}/columns takes any combination of these, checks all of them, and then applies them together:

curl -X PATCH https://yalango.com/api/v1/tables/Lm3nQ8rT2wXyZ5aB7cD9/columns \
  -H "Authorization: Bearer yal_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "add": ["Notes"],
    "rename": [{ "column_id": 481920, "name": "Person" }],
    "delete": [736104],
    "order": [481920]
  }'
  • add - new column names. They are placed after the existing columns.
  • rename - column ids and their new names.
  • delete - column ids to remove. The column's value is cleared from every row, and this cannot be undone.
  • order - every remaining column id, in the new order. Leave out new and deleted columns.

Read rows

curl "https://yalango.com/api/v1/tables/Lm3nQ8rT2wXyZ5aB7cD9/rows?limit=100" \
  -H "Authorization: Bearer yal_your_key_here"
{
  "rows": [
    { "row_id": 512, "values": { "481920": "yo", "736104": "soy" } }
  ],
  "next_cursor": null
}

Rows come back in display order, up to 500 per page.

Write rows

POST /v1/tables/{tableDocId}/rows adds, edits and deletes up to 100 rows in one request. Either all of it is applied or none of it:

curl -X POST https://yalango.com/api/v1/tables/Lm3nQ8rT2wXyZ5aB7cD9/rows \
  -H "Authorization: Bearer yal_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "add": [
      { "values": { "481920": "tú", "736104": "eres" } }
    ],
    "update": [
      { "row_id": 512, "values": { "736104": "soy (yo)" } }
    ],
    "delete": [513]
  }'
{ "added_row_ids": [514], "updated": 1, "deleted": 1 }
  • New rows are added at the end, and their ids are returned in the order you sent them.
  • On an update, only the cells you send change.
  • A value is a string of up to 2,000 characters. Sending a key that is not a column id returns 400 invalid_column.
  • A table can have up to 5,000 rows through the API.

This endpoint accepts an Idempotency-Key header, so a retried request does not add the same rows twice.

Delete a table

DELETE /v1/tables/{tableDocId} deletes the table and all of its rows, and removes it from any folder. This cannot be undone.

Limits

The free plan allows 100 tables. Going over returns 402 quota_exceeded. Yalango Premium removes the limit.

Was this article helpful?
0

Comments

Sign in to join the conversation.