Build a sequence of spreadsheet-like row operations on JSON arrays. Works like a mini data pipeline — operations execute in order, each transforming the output of the previous step.
Keep rows matching a condition expression.
FILTER {{ age >= 18 }}
FILTER {{ status === "active" }}Create a new column from an expression.
ADD COLUMN fullName = {{ firstName + " " + lastName }}
ADD COLUMN tax = {{ salary * 0.1 }}Rename a column, preserving row field order.
RENAME COLUMN firstName TO first_nameDelete one or more columns from all rows.
REMOVE COLUMN tempId, debugFlagSort rows by a field. Default direction is ASC. Nulls sort to end.
SORT BY age DESC
SORT BY name ASCKeep only the first occurrence per unique key combination.
DEDUPLICATE BY email
DEDUPLICATE BY firstName, lastNameSwitch to DSL mode for a text-based interface. One operation per line, comments start with #.
# Clean up user data
FILTER {{ age >= 18 }}
REMOVE COLUMN tempId, debugFlag
ADD COLUMN fullName = {{ firstName + " " + lastName }}
SORT BY fullName ASC
DEDUPLICATE BY emailExpressions use {{ }} syntax and support field references, arithmetic, string concatenation, and comparisons:
{{ age >= 18 }} — boolean comparison{{ firstName + " " + lastName }} — string concatenation{{ price * quantity }} — arithmetic| Name | Type | Default | Description |
|---|---|---|---|
| Mode | enum | document-row | document-row treats an object document as one formula row. array-path edits each item in a selected nested array.
document-row array-path |
| Source Array | path-picker | | Select the nested array whose items should be edited as tabular rows. |
| Operations | tabular-operations | [] | Build a sequence of spreadsheet-like row operations. Switch to DSL mode for a text-based interface. |
Apply tabular operations to the items array and calculate each item's line total.1{2 "order_id": "ord_1049",3 "customer": {4 "name": "Maya Chen",5 "email": "maya@example.com"6 },7 "items": [8 {9 "sku": "tee_black_m",10 "qty": 2,11 "price": "24.00"12 },13 {14 "sku": "cap_white",15 "qty": 1,16 "price": "18.00"17 }18 ],19 "payments": [20 {21 "status": "failed",22 "amount": 6623 },24 {25 "status": "paid",26 "amount": 6627 }28 ]29}ADD COLUMN line_total = {{ qty * price }}
1{2 "order_id": "ord_1049",3 "customer": {4 "name": "Maya Chen",5 "email": "maya@example.com"6 },7 "items": [8 {9 "sku": "tee_black_m",10 "qty": 2,11 "price": "24.00",12 "line_total": 4813 },14 {15 "sku": "cap_white",16 "qty": 1,17 "price": "18.00",18 "line_total": 1819 }20 ],21 "payments": [22 {23 "status": "failed",24 "amount": 6625 },26 {27 "status": "paid",28 "amount": 6629 }30 ]31}curl -X POST https://your-domain.com/api/v1/utilities/structure.tabular-ops \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"inputs":{"primary":{"order_id":"ord_1049","customer":{"name":"Maya Chen","email":"maya@example.com"},"items":[{"sku":"tee_black_m","qty":2,"price":"24.00"},{"sku":"cap_white","qty":1,"price":"18.00"}],"payments":[{"status":"failed","amount":66},{"status":"paid","amount":66}]}},"config":{"mode":"array-path","sourcePath":"items","operations":[{"type":"addColumn","name":"line_total","formula":"{{ qty * price }}"}]}}'1{2 "order_id": "ord_1049",3 "customer": {4 "name": "Maya Chen",5 "email": "maya@example.com"6 },7 "items": [8 {9 "sku": "tee_black_m",10 "qty": 2,11 "price": "24.00",12 "line_total": 4813 },14 {15 "sku": "cap_white",16 "qty": 1,17 "price": "18.00",18 "line_total": 1819 }20 ],21 "payments": [22 {23 "status": "failed",24 "amount": 6625 },26 {27 "status": "paid",28 "amount": 6629 }30 ]31}