Tables with the API
Create tables, manage their columns, and add, edit and delete rows in batches.
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.