This page documents the canonical HTTP contract for this endpoint.
Returns an object with columns and operation_run. Column creation is immediate; values for existing rows are populated by a durable asynchronous projection backfill. Poll operation_run.operation_run_id with Get operation run. Admission is not proof that backfill has finished. Progress belongs to the operation receipt; do not infer it from a column status flag.
The HTTP model accepts items[].materialize, but initial backfill admission is attempted after creation regardless of that value. items[].isHidden is ignored when all items use the same source column and preserved when they use different source-column IDs. Projection creation does not consume normal enrichment-run credits. If backfill admission fails after columns were created, the route returns 503 with columnIds; inspect those IDs before retrying column creation.
Path parameters
table_idrequiredstring
Target table ID.
| Name | Type | Description |
|---|---|---|
| table_idrequired | string | Target table ID. |
Body parameters
itemsrequiredarray
Projection definitions to create. At least one new projection is required. An empty array returns 400.
items[].keyrequiredstring
Requested destination column key. Existing or repeated keys are suffixed to make them unique when possible.
items[].labelrequiredstring
Destination column label.
items[].sourceColumnIdrequiredstring
Source JSON column ID.
items[].pathrequiredstring
JSON path/key to extract.
items[].dataType· optionalstring
Destination data type (default text).
items[].format· optionalobject
Optional projection value-format configuration; preserved by both HTTP adapter paths.
items[].isHidden· optionalboolean
Whether the created projection column is hidden. Ignored for single-source requests and preserved for requests using different source-column IDs.
items[].materialize· optionalboolean
Accepted, but currently ignored by the HTTP handler; the initial backfill is enqueued after creation regardless of this value.
afterColumnId· optionalstring
Optional insertion anchor (place after column).
beforeColumnId· optionalstring
Optional insertion anchor (place before column).
| Name | Type | Description |
|---|---|---|
| itemsrequired | array | Projection definitions to create. At least one new projection is required. An empty array returns 400. |
| items[].keyrequired | string | Requested destination column key. Existing or repeated keys are suffixed to make them unique when possible. |
| items[].labelrequired | string | Destination column label. |
| items[].sourceColumnIdrequired | string | Source JSON column ID. |
| items[].pathrequired | string | JSON path/key to extract. |
| items[].dataType | string | Destination data type (default text). |
| items[].format | object | Optional projection value-format configuration; preserved by both HTTP adapter paths. |
| items[].isHidden | boolean | Whether the created projection column is hidden. Ignored for single-source requests and preserved for requests using different source-column IDs. |
| items[].materialize | boolean | Accepted, but currently ignored by the HTTP handler; the initial backfill is enqueued after creation regardless of this value. |
| afterColumnId | string | Optional insertion anchor (place after column). |
| beforeColumnId | string | Optional insertion anchor (place before column). |
Errors
| Status | Meaning |
|---|---|
| 401 | Invalid API key or missing auth. |
| 403 | Missing columns:write scope or table access denied. |
| 400 | The referenced source column ID was not found in the table. |
| 404 | Table not found. |
| 409 | A projection key conflicted during insertion. |
| 422 | The projection request body does not match the request model. |
| 503 | Columns were created but backfill admission failed; inspect returned columnIds before retrying. |
