External APIs
Programmatic access to your Remix Labs files, snippets and remixes.
Your API key
Send this key in the X-API-Key header with every request. Treat it like a password.
Files
Upload a CSV file to the account, optionally into a folder. Returns the created file record.
Sent as the X-API-Key header.
| Name | Description |
|---|---|
file required form | The CSV file to upload. Max file size 50MB |
mime_type form | Override the detected MIME type. default: text/csv |
folder_id form | Upload into this folder instead of the account root. |
curl
curl -X POST "/api/v1/files" \ -H "X-API-Key: YOUR_API_KEY"
| Code | Description |
|---|---|
201 | {
"id": "file_8f3a1c2d",
"name": "customers.csv",
"mime_type": "text/csv",
"size_bytes": 182344,
"folder_id": null,
"created_at": "2026-09-30T12:04:21Z"
} |
400 | |
401 | |
403 | |
404 | |
409 | |
413 | |
415 | |
422 | |
429 |
List the account's uploaded files, newest first by default. Without `folder_id`, lists files at the account's root, not files in every folder.
Sent as the X-API-Key header.
| Name | Description |
|---|---|
folder_id query | Only files directly in this folder. |
page query | Page number, starting at 1. default: 1 |
limit query | Items per page. default: 20 |
sort_by query | Field to sort by. Available values: created_at, name, size_bytes default: created_at |
order query | Sort direction. Available values: desc, asc default: desc |
curl
curl -X GET "/api/v1/files" \ -H "X-API-Key: YOUR_API_KEY"
| Code | Description |
|---|---|
200 | {
"items": [
{
"id": "file_8f3a1c2d",
"name": "customers.csv",
"size_bytes": 182344,
"folder_id": null,
"created_at": "2026-09-30T12:04:21Z"
}
],
"page": 1,
"limit": 20,
"total": 1
} |
401 | |
403 | |
422 | |
429 |
Download an uploaded file's raw CSV content as an attachment.
Sent as the X-API-Key header.
| Name | Description |
|---|---|
file_id required path | The file's id. |
curl
curl -X GET "/api/v1/files/{file_id}/download" \ -H "X-API-Key: YOUR_API_KEY"
| Code | Description |
|---|---|
200 | binary file stream |
401 | |
403 | |
404 | |
422 | |
429 |
Permanently delete an uploaded file from the account.
Sent as the X-API-Key header.
| Name | Description |
|---|---|
file_id required path | The file's id. |
curl
curl -X DELETE "/api/v1/files/{file_id}" \ -H "X-API-Key: YOUR_API_KEY"
| Code | Description |
|---|---|
200 | { "id": "file_8f3a1c2d", "deleted": true } |
401 | |
403 | |
404 | |
422 | |
429 |
Folders
Create a folder at the root, or inside `parent_id`. Requires `files:write`.
Sent as the X-API-Key header.
| Name | Description |
|---|---|
name required form | The new folder's name. |
parent_id form | Create inside this folder instead of the account root. uuid |
curl
curl -X POST "/api/v1/folders" \ -H "X-API-Key: YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{}'
| Code | Description |
|---|---|
201 | {
"data": {
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"name": "string",
"parent_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"created_at": "2026-10-02T12:28:00.159Z",
"updated_at": "2026-10-02T12:28:00.159Z"
}
} |
400 | |
401 | |
403 | |
404 | |
409 | |
422 | |
429 |
List the account's folders at every level, newest first by default, each has its `parent_id`. Requires `files:read`. For one folder's direct contents (including the root), use `GET /v1/folders/contents`.
Sent as the X-API-Key header.
| Name | Description |
|---|---|
parent_id query | Only folders directly inside this folder. uuid |
page query | Page number, starting at 1. minimum: 1 default: 1 |
limit query | Items per page. minimum: 1, maximum: 100 default: 20 |
sort_by query | Field to sort by. Available values: created_at, updated_at default: created_at |
order query | Sort direction. Available values: asc, desc default: desc |
curl
curl -X GET "/api/v1/folders" \ -H "X-API-Key: YOUR_API_KEY"
| Code | Description |
|---|---|
200 | {
"data": [
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"name": "string",
"parent_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"created_at": "2026-10-02T12:28:00.182Z",
"updated_at": "2026-10-02T12:28:00.182Z"
}
],
"pagination": {
"page": 1,
"limit": 1,
"total": 0,
"total_pages": 0,
"has_next": true
}
} |
401 | |
403 | |
422 | |
429 |
The sub-folders and files directly inside a folder, or at the root. Requires `files:read`.
Sent as the X-API-Key header.
| Name | Description |
|---|---|
folder_id query | The folder to list; omit for the root. uuid |
curl
curl -X GET "/api/v1/folders/contents" \ -H "X-API-Key: YOUR_API_KEY"
| Code | Description |
|---|---|
200 | {
"data": {
"folder": {
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"name": "string",
"parent_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"created_at": "2026-10-02T12:28:00.186Z",
"updated_at": "2026-10-02T12:28:00.186Z"
},
"folders": [
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"name": "string",
"parent_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"created_at": "2026-10-02T12:28:00.186Z",
"updated_at": "2026-10-02T12:28:00.186Z"
}
],
"files": [
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"name": "string",
"folder_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"size_bytes": 0,
"num_rows": 0,
"num_columns": 0,
"index_mode": "string",
"frequency": "string",
"created_at": "2026-10-02T12:28:00.186Z"
}
]
}
} |
401 | |
403 | |
404 | |
422 | |
429 |
Permanently delete a folder. Requires `files:write`.
Sent as the X-API-Key header.
| Name | Description |
|---|---|
folder_id required path | The folder's id. uuid |
curl
curl -X DELETE "/api/v1/folders/{folder_id}" \ -H "X-API-Key: YOUR_API_KEY"
| Code | Description |
|---|---|
200 | {
"data": {
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"deleted": true
}
} |
401 | |
403 | |
404 | |
422 | |
429 |
Events
Cut the rows between `start_value` and `end_value` out of an uploaded file into a new event. Requires `events:write`. - `time_series` files: `start_value` / `end_value` are dates, plus `reference_column` (the date column) and `date_format` (e.g. `YYYY-MM-DD`). - `non_time_series` files: they are values of `reference_column`, plus `interval` (the step between values). A event must contain at least 12 rows.
Sent as the X-API-Key header.
| Name | Description |
|---|---|
source_file_id required form | The uploaded file to cut the event from. |
title required form | Title of the event. Must be unique on the account. |
description form | Optional description of the event. |
index_mode required form | How the source file is indexed. Available values: time_series, non_time_series |
start_value required form | First value of the range (inclusive). A date for `time_series` files, otherwise a value of `reference_column`. |
end_value required form | Last value of the range (inclusive). A date for `time_series` files, otherwise a value of `reference_column`. |
reference_column required form | Column that `start_value` and `end_value` refer to. |
date_format form | Date format of the reference column. `time_series` only. e.g. YYYY-MM-DD |
interval form | Step between consecutive rows. |
curl
curl -X POST "/api/v1/events" \ -H "X-API-Key: YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{}'
| Code | Description |
|---|---|
201 | {
"data": {
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"title": "First quarter",
"description": "Q1 daily sales",
"source_file_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"start_value": "2026-01-01",
"end_value": "2026-03-31",
"interval": "daily",
"index_mode": "time_series",
"reference_column": "date",
"created_at": "2026-10-02T11:46:41Z",
"updated_at": "2026-10-02T11:46:41Z"
}
} |
400 | |
401 | |
403 | |
404 | |
409 | |
422 | |
429 |
List the account's events, newest first by default. Requires `events:read`.
Sent as the X-API-Key header.
| Name | Description |
|---|---|
page query | Page number, starting at 1. Minimum 1 default: 1 |
limit query | Items per page. Minimum 1, maximum 100 default: 20 |
sort_by query | Field to sort by. Available values: created_at, updated_at default: created_at |
order query | Sort direction. Available values: desc, asc default: desc |
curl
curl -X GET "/api/v1/events" \ -H "X-API-Key: YOUR_API_KEY"
| Code | Description |
|---|---|
200 | {
"data": [
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"title": "First quarter",
"description": "Q1 daily sales",
"source_file_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"start_value": "2026-01-01",
"end_value": "2026-03-31",
"interval": "daily",
"index_mode": "time_series",
"created_at": "2026-10-02T11:46:41Z",
"updated_at": "2026-10-02T11:46:41Z"
}
],
"pagination": {
"page": 1,
"limit": 20,
"total": 1,
"total_pages": 1,
"has_next": false
}
} |
401 | |
403 | |
422 | |
429 |
Download an event's rows as CSV, named after the event's title. Requires `events:read`.
Sent as the X-API-Key header.
| Name | Description |
|---|---|
event_id required path | The event's id. UUID |
curl
curl -X GET "/api/v1/events/{event_id}/download" \ -H "X-API-Key: YOUR_API_KEY"
| Code | Description |
|---|---|
200 | binary file stream |
401 | |
403 | |
404 | |
422 | |
429 |
Permanently delete an event. Requires `events:write`. Also deletes every remix that uses this event, exactly as in the web app. The source file is kept.
Sent as the X-API-Key header.
| Name | Description |
|---|---|
event_id required path | The event's id. UUID |
curl
curl -X DELETE "/api/v1/events/{event_id}" \ -H "X-API-Key: YOUR_API_KEY"
| Code | Description |
|---|---|
200 | {
"data": {
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"deleted": true
}
} |
401 | |
403 | |
404 | |
422 | |
429 |
Remixes
Create a remix from one or more sources and queue its first run. Requires `remixes:write`. The server validates each source, maps columns by position unless you send `column_mapping`, then creates the remix. The first error stops the call and no remix is created. Creation returns once the run is queued, so the remix starts as `in_process`; poll `GET /v1/remixes/{remix_id}/status` until it is `synced` or `failed`. - A source is an uploaded file (`file`), a snippet (`snippet`) or another remix's finished output (`remix_output`). - Give `column_mapping` on every source together with `axis_column`, or omit all of them to map columns by position.
Sent as the X-API-Key header.
| Name | Description |
|---|---|
name required form | Name of the remix. Must be unique on the account. |
index_mode required form | How the sources are indexed: by date (`time_series`) or by a numeric step (`non_time_series`). Available values: time_series, non_time_series |
axis_interval required form | Step between consecutive rows on the remix's axis. Can be the source's own step or any coarser one; `POST /sources/inspect/` lists them. time_series: D (daily), MS (monthly)… · non_time_series: a number such as 1 or 0.5 |
axis_column form | Name of the axis column in the remix. Give it together with `column_mapping` on every source, or omit all of them to let the server map columns by position. |
sources required form | The sources to combine, as a JSON array. At least one. Each source: source_type (file | snippet | remix_output), source_id (uuid), reference_column (required for files: the date column, or the step column for non_time_series), date_format (time_series files, e.g. YYYY-MM-DD), column_mapping (optional: { output_column: source_column }). |
{
"name": "Q1 sales forecast",
"index_mode": "time_series",
"axis_interval": "D",
"axis_column": "event_time",
"sources": [
{
"source_type": "file",
"source_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"reference_column": "date",
"date_format": "YYYY-MM-DD",
"column_mapping": {
"event_time": "date",
"revenue": "sales",
"traffic": "visits"
}
},
{
"source_type": "snippet",
"source_id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"column_mapping": {
"event_time": "date",
"revenue": "sales",
"traffic": "visits"
}
}
]
}`column_mapping` is optional. Give it on every source together with `axis_column`, or remove all of them to let the server map columns by position.
curl
curl -X POST "/api/v1/remixes" \ -H "X-API-Key: YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{}'
| Code | Description |
|---|---|
201 | {
"data": {
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"name": "Q1 sales forecast",
"status": "in_process",
"index_mode": "time_series",
"axis_column": "event_time",
"axis_interval": "D",
"output": null,
"last_executed_at": null,
"created_at": "2026-10-02T12:28:00.159Z",
"updated_at": "2026-10-02T12:28:00.159Z"
}
} |
400 | |
401 | |
403 | |
404 | |
409 | |
422 | |
429 |
List the account's remixes, newest first by default. Requires `remixes:read`. Filter with `status`: `synced` (output is current), `out_of_sync` (changed since the last run), `in_process` (running) or `failed`.
Sent as the X-API-Key header.
| Name | Description |
|---|---|
status query | Only remixes with this status. Available values: synced, out_of_sync, in_process, failed |
page query | Page number, starting at 1. Minimum 1 default: 1 |
limit query | Items per page. Minimum 1, maximum 100 default: 20 |
sort_by query | Field to sort by. Available values: created_at, updated_at default: created_at |
order query | Sort direction. Available values: desc, asc default: desc |
curl
curl -X GET "/api/v1/remixes" \ -H "X-API-Key: YOUR_API_KEY"
| Code | Description |
|---|---|
200 | {
"data": [
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"name": "Monthly revenue",
"status": "synced",
"index_mode": "time_series",
"axis_column": "date",
"axis_interval": "monthly",
"output": {
"file_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"name": "Monthly revenue.csv",
"size": 20480,
"shape": [120, 6]
},
"last_executed_at": "2026-10-02T11:46:41Z",
"created_at": "2026-10-01T09:12:07Z",
"updated_at": "2026-10-02T11:46:41Z"
}
],
"pagination": {
"page": 1,
"limit": 20,
"total": 1,
"total_pages": 1,
"has_next": false
}
} |
401 | |
403 | |
422 | |
429 |
A remix's status and state. Requires `remixes:read`. `state` holds the remix's axis and window, its column names and its inputs (datasets, groups, functions) with the settings you can act on. Row indices, preprocessing settings and per-input ranges are not included.
Sent as the X-API-Key header.
| Name | Description |
|---|---|
remix_id required path | The remix's id, as returned by `POST /v1/remixes` or `GET /v1/remixes`. uuid |
curl
curl -X GET "/api/v1/remixes/{remix_id}" \ -H "X-API-Key: YOUR_API_KEY"
| Code | Description |
|---|---|
200 | {
"data": {
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"name": "string",
"created_at": "2026-10-02T12:28:00.159Z",
"updated_at": "2026-10-02T12:28:00.159Z",
"status": "synced",
"run": {
"last_completed_at": "2026-10-02T12:28:00.159Z",
"completed_runs": 0,
"output_ready": true
},
"state": {
"index_mode": "time_series",
"axis": {
"column": "string",
"interval": "string",
"type": "string"
},
"window": {
"start": 0,
"end": 0
},
"range_auto_adjustment": true,
"columns": ["string"],
"inputs": [
{
"expression": "string"
}
]
}
}
} |
401 | |
403 | |
404 | |
422 | |
429 |
Lightweight status for polling after a create. Requires `remixes:read`. `status` is `in_process` until the first run finishes, then `synced` or `failed`; `run.output_ready` is true once a successful run produced rows. A failed run carries no reason.
Sent as the X-API-Key header.
| Name | Description |
|---|---|
remix_id required path | The remix's id, as returned by `POST /v1/remixes` or `GET /v1/remixes`. uuid |
curl
curl -X GET "/api/v1/remixes/{remix_id}/status" \ -H "X-API-Key: YOUR_API_KEY"
| Code | Description |
|---|---|
200 | {
"data": {
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"status": "synced",
"run": {
"last_completed_at": "2026-10-02T12:28:00.159Z",
"completed_runs": 0,
"output_ready": true
}
}
} |
401 | |
403 | |
404 | |
422 | |
429 |
Run the checks `POST /v1/remixes` runs, without creating anything. Requires `remixes:write`. Send the request you intend to create. The response shows how each source's columns would be mapped, and `request` holds your body with `column_mapping` and `axis_column` filled in, ready to send to create. A successful preview does not guarantee create: a name already in use, the remix quota, the minimum number of data points, and the size after preprocessing are only checked when the remix is created and run.
Sent as the X-API-Key header.
| Name | Description |
|---|---|
name required form | Name of the remix. Must be unique on the account. |
index_mode required form | How the sources are indexed: by date (`time_series`) or by a numeric step (`non_time_series`). Available values: time_series, non_time_series |
axis_interval required form | Step between consecutive rows on the remix's axis. Can be the source's own step or any coarser one; `POST /sources/inspect/` lists them. time_series: D (daily), MS (monthly)… · non_time_series: a number such as 1 or 0.5 |
axis_column form | Name of the axis column in the remix. Give it together with `column_mapping` on every source, or omit all of them to let the server map columns by position. |
sources required form | The sources to combine, as a JSON array. At least one. Each source: source_type (file | snippet | remix_output), source_id (uuid), reference_column (required for files: the date column, or the step column for non_time_series), date_format (time_series files, e.g. YYYY-MM-DD), column_mapping (optional: { output_column: source_column }). |
{
"name": "Q1 sales forecast",
"index_mode": "time_series",
"axis_interval": "D",
"axis_column": "event_time",
"sources": [
{
"source_type": "file",
"source_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"reference_column": "date",
"date_format": "YYYY-MM-DD",
"column_mapping": {
"event_time": "date",
"revenue": "sales",
"traffic": "visits"
}
},
{
"source_type": "snippet",
"source_id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"column_mapping": {
"event_time": "date",
"revenue": "sales",
"traffic": "visits"
}
}
]
}`column_mapping` is optional. Give it on every source together with `axis_column`, or remove all of them to let the server map columns by position.
curl
curl -X POST "/api/v1/remixes/preview" \ -H "X-API-Key: YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{}'
| Code | Description |
|---|---|
200 | {
"data": {
"axis_column": "event_time",
"columns": ["event_time", "revenue", "traffic"],
"sources": [
{
"source_index": 0,
"source_type": "file",
"source_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"detected_interval": "D",
"column_mapping": {
"event_time": "date",
"revenue": "sales",
"traffic": "visits"
}
}
],
"request": {
"name": "Q1 sales forecast",
"index_mode": "time_series",
"axis_interval": "D",
"axis_column": "event_time",
"sources": [
{
"source_type": "file",
"source_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"reference_column": "date",
"date_format": "YYYY-MM-DD",
"column_mapping": {
"event_time": "date",
"revenue": "sales",
"traffic": "visits"
}
},
{
"source_type": "snippet",
"source_id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"column_mapping": {
"event_time": "date",
"revenue": "sales",
"traffic": "visits"
}
}
]
}
}
} |
400 | |
401 | |
403 | |
404 | |
422 | |
429 |
Download the output of a remix's last run as CSV, named after the remix. Requires `remixes:read`. A remix that has never run has no output (404).
Sent as the X-API-Key header.
| Name | Description |
|---|---|
remix_id required path | The remix's id, as returned by `POST /v1/remixes` or `GET /v1/remixes`. uuid |
curl
curl -X GET "/api/v1/remixes/{remix_id}/download" \ -H "X-API-Key: YOUR_API_KEY"
| Code | Description |
|---|---|
200 | binary file stream |
401 | |
403 | |
404 | |
422 | |
429 |
Permanently delete a remix, with its output and its internal working files, exactly as in the web app. Requires `remixes:write`. The files and snippets it was built from are kept.
Sent as the X-API-Key header.
| Name | Description |
|---|---|
remix_id required path | The remix's id, as returned by `POST /v1/remixes` or `GET /v1/remixes`. uuid |
curl
curl -X DELETE "/api/v1/remixes/{remix_id}" \ -H "X-API-Key: YOUR_API_KEY"
| Code | Description |
|---|---|
200 | {
"data": {
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"deleted": true
}
} |
401 | |
403 | |
404 | |
422 | |
429 |
Remix: Settings and runs
Rename a remix, set its window, or switch range auto-adjustment. Requires `remixes:write`. Send only the fields to change. - `window` uses the remix's own axis values: ISO 8601 date-times for a `time_series` remix, numbers otherwise. Send `start` and `end` together. - `range_auto_adjustment` switches automatic range adjustment on or off. - A remix that is running cannot be edited until the run finishes. The edit does not re-run the remix; call `POST /v1/remixes/{remix_id}/run` when its output should reflect it.
Sent as the X-API-Key header.
| Name | Description |
|---|---|
remix_id required path | The remix's id, as returned by `POST /v1/remixes` or `GET /v1/remixes`. uuid |
name form | New name for the remix. Must be unique on the account. |
window form | The remix's new window as `{ "start": ..., "end": ... }`. ISO 8601 date-times for a `time_series` remix, numbers otherwise. e.g. {"start": "2026-01-01T00:00:00Z", "end": "2026-03-31T00:00:00Z"} |
range_auto_adjustment form | Switch automatic range adjustment on or off. true or false |
{
"name": "Q1 revenue"
}curl
curl -X PATCH "/api/v1/remixes/{remix_id}" \ -H "X-API-Key: YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{}'
| Code | Description |
|---|---|
200 | {
"data": {
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"name": "Q1 revenue",
"created_at": "2026-10-02T12:28:00.159Z",
"updated_at": "2026-10-02T12:28:00.159Z",
"status": "synced",
"run": {
"last_completed_at": "2026-10-02T12:28:00.159Z",
"completed_runs": 1,
"output_ready": true
},
"state": {
"index_mode": "time_series",
"axis": {
"column": "event_time",
"interval": "D",
"type": "datetime"
},
"window": {
"start": "2026-01-01T00:00:00Z",
"end": "2026-03-31T00:00:00Z"
},
"range_auto_adjustment": true,
"columns": ["event_time", "revenue", "traffic"]
}
}
} |
400 | |
401 | |
403 | |
404 | |
409 | |
422 | |
429 |
Queue a new run of a remix, replacing its current output when the run finishes. Requires `remixes:write`. The run is asynchronous: the response says `in_process`, and `GET /v1/remixes/{remix_id}/status` shows when it becomes `synced` or `failed`. Edits never start a run on their own.
Sent as the X-API-Key header.
| Name | Description |
|---|---|
remix_id required path | The remix's id, as returned by `POST /v1/remixes` or `GET /v1/remixes`. uuid |
curl
curl -X POST "/api/v1/remixes/{remix_id}/run" \ -H "X-API-Key: YOUR_API_KEY"
| Code | Description |
|---|---|
200 | {
"data": {
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"status": "in_process",
"run": {
"last_completed_at": "2026-10-02T12:28:00.159Z",
"completed_runs": 1,
"output_ready": true
}
}
} |
400 | |
401 | |
403 | |
404 | |
422 | |
429 |
Replace every column and which dataset columns feed it. Requires `remixes:write`. List every column, the axis column included: each needs at least one dataset with a column for it, and `dataset_id` is a dataset's input id from the remix's state.
Sent as the X-API-Key header.
| Name | Description |
|---|---|
remix_id required path | The remix's id, as returned by `POST /v1/remixes` or `GET /v1/remixes`. uuid |
axis_column form | Name of the axis column. It must also be listed in `columns`. |
columns required form | Every column of the remix, as a JSON array. At least one. Each column: name, and sources: [{ dataset_id (uuid), column }] with at least one entry. |
{
"axis_column": "event_time",
"columns": [
{
"name": "event_time",
"sources": [
{
"dataset_id": "9e1f7f6a-5d1a-4c8e-9a21-0c1d2e3f4a5b",
"column": "date"
},
{
"dataset_id": "5c2e6bd0-9a2b-4f4a-b1c7-0e8d9f1a2b3c",
"column": "day"
}
]
},
{
"name": "revenue",
"sources": [
{
"dataset_id": "9e1f7f6a-5d1a-4c8e-9a21-0c1d2e3f4a5b",
"column": "sales"
},
{
"dataset_id": "5c2e6bd0-9a2b-4f4a-b1c7-0e8d9f1a2b3c",
"column": "income"
}
]
}
]
}curl
curl -X PUT "/api/v1/remixes/{remix_id}/mapping" \ -H "X-API-Key: YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{}'
| Code | Description |
|---|---|
200 | {
"data": {
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"name": "Q1 revenue",
"created_at": "2026-10-02T12:28:00.159Z",
"updated_at": "2026-10-02T12:28:00.159Z",
"status": "synced",
"run": {
"last_completed_at": "2026-10-02T12:28:00.159Z",
"completed_runs": 1,
"output_ready": true
},
"state": {
"index_mode": "time_series",
"axis": {
"column": "event_time",
"interval": "D",
"type": "datetime"
},
"window": {
"start": "2026-01-01T00:00:00Z",
"end": "2026-03-31T00:00:00Z"
},
"range_auto_adjustment": true,
"columns": ["event_time", "revenue", "traffic"]
}
}
} |
400 | |
401 | |
403 | |
404 | |
409 | |
422 | |
429 |
Remixes: Inputs
Add one input, chosen by `type`. Requires `remixes:write`. `input_id` in the response is the new input's id. - `dataset`: a file, snippet or remix output, with the same source settings as creation, checked against the remix's own index mode and interval. `column_mapping` is required and must map the remix's axis column and at least one data column. With range auto adjustment on, a dataset reaching past the window widens it, which resets the range settings of the remix's functions. - `group`: an empty group to hold datasets, groups and functions. - `function`: a function of `sub_type`, applying to everything before it in its container. `GET /v1/remixes/{remix_id}/function-defaults?sub_type=...` with the same `parent_id` and `previous_sibling_id` describes its settings. Every example shows both placement fields; Where it goes below explains them. Where it goes: two fields; send both, using `null` where the list says so. - `parent_id`: what to put it inside. A group's id, or for a function also a dataset's id. `null` is the top level of the remix. - `previous_sibling_id`: which input it comes right after, among the inputs inside `parent_id`. To put it... - first in the remix (dataset or group): `parent_id: null`, `previous_sibling_id: null` - at the top level, right after an input: `parent_id: null`, `previous_sibling_id:` that input's id - first inside a group (dataset or group): `parent_id:` the group's id, `previous_sibling_id: null` - inside a group, right after one of its inputs: `parent_id:` the group's id, `previous_sibling_id:` that input's id - first among a dataset's functions (function): `parent_id:` the dataset's id, `previous_sibling_id: null` - right after one of a dataset's functions (function): `parent_id:` the dataset's id, `previous_sibling_id:` that function's id `null` always means first. A function can be first only inside a dataset: at the top level or in a group it transforms everything before it, so give it a `previous_sibling_id` there. To put a function at the end of a dataset, give the dataset's last function. Ids come from `state.inputs` in `GET /v1/remixes/{remix_id}`, where every input shows its own `parent_id` and `previous_sibling_id`.
Sent as the X-API-Key header.
| Name | Description |
|---|---|
remix_id required path | The remix's id, as returned by `POST /v1/remixes` or `GET /v1/remixes`. uuid |
type required form | What kind of input to add. Available values: dataset, group, function |
parent_id required form | What to put it inside: a group's id, or for a function also a dataset's id. `null` is the top level of the remix. null, or a quoted id such as "3fa85f64-..." |
previous_sibling_id required form | Which input it comes right after, among the inputs inside `parent_id`. `null` always means first. null, or a quoted id such as "3fa85f64-..." |
source_type form | `dataset` only. What the dataset is made from. Available values: file, snippet, remix_output |
source_id form | `dataset` only. The file's, snippet's or remix's id. uuid |
reference_column form | `dataset` only. Column holding the dates or index values. Needed for files. |
date_format form | `dataset` only. Date format of the reference column, for `time_series` remixes. e.g. YYYY-MM-DD |
column_mapping form | `dataset` only, and required there. Maps the remix's axis column and at least one data column to source columns. e.g. {"x_axis": "x", "signal": "strength"} |
sub_type form | `function` only. The function type. Available values: interpolation, extrapolation, generation, cropping, cropping_data, scaling, scaling_data, normalization, vertical_translation, reverse_horizontal, reverse_horizontal_data, flip_vertical, flip_data_vertical |
params form | `function` only. Settings for the function; get the defaults and bounds from `GET /v1/remixes/{remix_id}/function-defaults/`. |
{
"type": "dataset",
"parent_id": null,
"previous_sibling_id": null,
"source_type": "file",
"source_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"reference_column": "x",
"column_mapping": {
"x_axis": "x",
"signal": "strength"
}
}`parent_id: null` puts it at the top level; `previous_sibling_id: null` puts it first there.
curl
curl -X POST "/api/v1/remixes/{remix_id}/inputs/" \ -H "X-API-Key: YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{}'
| Code | Description |
|---|---|
201 | {
"data": {
"remix": {
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"name": "Signal comparison",
"created_at": "2026-10-09T11:53:02.966Z",
"updated_at": "2026-10-09T11:53:02.966Z",
"status": "synced",
"run": {
"last_completed_at": "2026-10-09T11:53:02.966Z",
"completed_runs": 1,
"output_ready": true
},
"state": {
"index_mode": "non_time_series",
"axis": {
"column": "x_axis",
"interval": "1",
"type": "numeric"
},
"window": {
"start": 0,
"end": 100
},
"range_auto_adjustment": true,
"columns": [
"x_axis",
"signal"
],
"expression": "((\"sales.csv\" -> scaling_data) * \"Events\"(\"promo.csv\" + \"holidays.csv\")) -> normalization",
"inputs": [
{
"id": "9e1f7f6a-5d1a-4c8e-9a21-0c1d2e3f4a5b",
"type": "dataset",
"parent_id": null,
"previous_sibling_id": null
}
]
}
},
"input_id": "5c2e6bd0-9a2b-4f4a-b1c7-0e8d9f1a2b3c"
}
} |
400 | |
401 | |
403 | |
404 | |
409 | |
422 | |
429 |
Change a dataset's or group's `name` and `operator`, or a function's `params`. Requires `remixes:write`. Function settings not sent keep their current values; a function's `sub_type` cannot change. `GET /v1/remixes/{remix_id}/inputs/{input_id}/settings` shows a function's current settings and their bounds.
Sent as the X-API-Key header.
| Name | Description |
|---|---|
remix_id required path | The remix's id, as returned by `POST /v1/remixes` or `GET /v1/remixes`. uuid |
input_id required path | The id of a dataset, group or function in the remix, from `state.inputs` in `GET /v1/remixes/{remix_id}`. |
name form | Datasets and groups only. New name. |
operator form | Datasets and groups only. How this input combines with the one before it. e.g. add, multiply, or subtract |
params form | Functions only. Settings to change; settings not sent keep their current values. Bounds come from `GET /v1/remixes/{remix_id}/inputs/{input_id}/settings/`. |
{
"name": "Holiday traffic"
}curl
curl -X PATCH "/api/v1/remixes/{remix_id}/inputs/{input_id}/" \ -H "X-API-Key: YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{}'
| Code | Description |
|---|---|
200 | {
"data": {
"remix": {
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"name": "Signal comparison",
"created_at": "2026-10-09T11:53:02.966Z",
"updated_at": "2026-10-09T11:53:02.966Z",
"status": "synced",
"run": {
"last_completed_at": "2026-10-09T11:53:02.966Z",
"completed_runs": 1,
"output_ready": true
},
"state": {
"index_mode": "non_time_series",
"axis": {
"column": "x_axis",
"interval": "1",
"type": "numeric"
},
"window": {
"start": 0,
"end": 100
},
"range_auto_adjustment": true,
"columns": [
"x_axis",
"signal"
],
"expression": "((\"sales.csv\" -> scaling_data) * \"Events\"(\"promo.csv\" + \"holidays.csv\")) -> normalization",
"inputs": [
{
"id": "9e1f7f6a-5d1a-4c8e-9a21-0c1d2e3f4a5b",
"type": "dataset",
"parent_id": null,
"previous_sibling_id": null
}
]
}
}
}
} |
400 | |
401 | |
403 | |
404 | |
409 | |
422 | |
429 |
Remove a dataset, group or function. Requires `remixes:write`. Removing a dataset removes its functions and segment moves. After a removal, every operator is reset by position, as after a move.
Sent as the X-API-Key header.
| Name | Description |
|---|---|
remix_id required path | The remix's id, as returned by `POST /v1/remixes` or `GET /v1/remixes`. uuid |
input_id required path | The id of a dataset, group or function in the remix, from `state.inputs` in `GET /v1/remixes/{remix_id}`. |
children query | Groups only, and required for them: delete the group's children, or keep them one level up. Available values: delete, keep |
curl
curl -X DELETE "/api/v1/remixes/{remix_id}/inputs/{input_id}/" \ -H "X-API-Key: YOUR_API_KEY"
| Code | Description |
|---|---|
200 | {
"data": {
"remix": {
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"name": "Signal comparison",
"created_at": "2026-10-09T11:53:02.966Z",
"updated_at": "2026-10-09T11:53:02.966Z",
"status": "synced",
"run": {
"last_completed_at": "2026-10-09T11:53:02.966Z",
"completed_runs": 1,
"output_ready": true
},
"state": {
"index_mode": "non_time_series",
"axis": {
"column": "x_axis",
"interval": "1",
"type": "numeric"
},
"window": {
"start": 0,
"end": 100
},
"range_auto_adjustment": true,
"columns": [
"x_axis",
"signal"
],
"expression": "((\"sales.csv\" -> scaling_data) * \"Events\"(\"promo.csv\" + \"holidays.csv\")) -> normalization",
"inputs": [
{
"id": "9e1f7f6a-5d1a-4c8e-9a21-0c1d2e3f4a5b",
"type": "dataset",
"parent_id": null,
"previous_sibling_id": null
}
]
}
}
}
} |
400 | |
401 | |
403 | |
404 | |
409 | |
422 | |
429 |
Move a dataset, group or function to a new place; see Where it goes. Requires `remixes:write`. After a move, every operator is reset by position: the first input of each container has none and the rest `add`. Where it goes: two fields; send both, using `null` where the list says so. - `parent_id`: what to put it inside. A group's id, or for a function also a dataset's id. `null` is the top level of the remix. - `previous_sibling_id`: which input it comes right after, among the inputs inside `parent_id`. To put it... - first in the remix (dataset or group): `parent_id: null`, `previous_sibling_id: null` - at the top level, right after an input: `parent_id: null`, `previous_sibling_id:` that input's id - first inside a group (dataset or group): `parent_id:` the group's id, `previous_sibling_id: null` - inside a group, right after one of its inputs: `parent_id:` the group's id, `previous_sibling_id:` that input's id - first among a dataset's functions (function): `parent_id:` the dataset's id, `previous_sibling_id: null` - right after one of a dataset's functions (function): `parent_id:` the dataset's id, `previous_sibling_id:` that function's id `null` always means first. A function can be first only inside a dataset: at the top level or in a group it transforms everything before it, so give it a `previous_sibling_id` there. To put a function at the end of a dataset, give the dataset's last function. Ids come from `state.inputs` in `GET /v1/remixes/{remix_id}`, where every input shows its own `parent_id` and `previous_sibling_id`.
Sent as the X-API-Key header.
| Name | Description |
|---|---|
remix_id required path | The remix's id, as returned by `POST /v1/remixes` or `GET /v1/remixes`. uuid |
input_id required path | The id of a dataset, group or function in the remix, from `state.inputs` in `GET /v1/remixes/{remix_id}`. |
parent_id required form | What to put it inside: a group's id, or for a function also a dataset's id. `null` is the top level of the remix. null, or a quoted id such as "3fa85f64-..." |
previous_sibling_id required form | Which input it comes right after, among the inputs inside `parent_id`. `null` always means first. null, or a quoted id such as "3fa85f64-..." |
{}`parent_id: null` puts it at the top level; `previous_sibling_id: null` puts it first there.
curl
curl -X POST "/api/v1/remixes/{remix_id}/inputs/{input_id}/move/" \ -H "X-API-Key: YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{}'
| Code | Description |
|---|---|
200 | {
"data": {
"remix": {
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"name": "Signal comparison",
"created_at": "2026-10-09T11:53:02.966Z",
"updated_at": "2026-10-09T11:53:02.966Z",
"status": "synced",
"run": {
"last_completed_at": "2026-10-09T11:53:02.966Z",
"completed_runs": 1,
"output_ready": true
},
"state": {
"index_mode": "non_time_series",
"axis": {
"column": "x_axis",
"interval": "1",
"type": "numeric"
},
"window": {
"start": 0,
"end": 100
},
"range_auto_adjustment": true,
"columns": [
"x_axis",
"signal"
],
"expression": "((\"sales.csv\" -> scaling_data) * \"Events\"(\"promo.csv\" + \"holidays.csv\")) -> normalization",
"inputs": [
{
"id": "9e1f7f6a-5d1a-4c8e-9a21-0c1d2e3f4a5b",
"type": "dataset",
"parent_id": null,
"previous_sibling_id": null
}
]
}
}
}
} |
400 | |
401 | |
403 | |
404 | |
409 | |
422 | |
429 |
The settings a function of `sub_type` would be added with at that place, each with the bounds and choices accepted for it. Requires `remixes:read`. Send the same `parent_id` and `previous_sibling_id` you will add the function with: its range comes from the inputs before it. At least one is required, as a function cannot be the first input of the top level. Send the values back as `params` when adding the function. For a function that already exists, use `GET /v1/remixes/{remix_id}/inputs/{input_id}/settings`.
Sent as the X-API-Key header.
| Name | Description |
|---|---|
remix_id required path | The remix's id, as returned by `POST /v1/remixes` or `GET /v1/remixes`. uuid |
sub_type required query | Function type, e.g. `interpolation` or `scaling_data`. Available values: interpolation, extrapolation, generation, cropping, cropping_data, scaling, scaling_data, normalization, vertical_translation, reverse_horizontal, reverse_horizontal_data, flip_vertical, flip_data_vertical |
parent_id query | The dataset or group the function would go inside, e.g. `0b6f2f8e-5d7a-4c0e-9a51-2a9f6c1d7e40`; leave it out for the top level. |
previous_sibling_id query | The input the function would come right after, e.g. `func-5e6f7a8b`; leave it out to put it first inside the dataset given as `parent_id`. Required at the top level and inside a group. |
curl
curl -X GET "/api/v1/remixes/{remix_id}/function-defaults/" \ -H "X-API-Key: YOUR_API_KEY"
| Code | Description |
|---|---|
200 | {
"data": {
"sub_type": "interpolation",
"default_model": "linear",
"models": [
{
"model": "linear",
"settings": {
"additionalProp1": {}
}
}
]
}
} |
400 | |
401 | |
403 | |
404 | |
422 | |
429 |
A function's current settings, each with the bounds and choices accepted for it where it sits now. Requires `remixes:read`. `input_id` must be a function; its type and place come from the remix. Send changed values as `params` to `PATCH /v1/remixes/{remix_id}/inputs/{input_id}/`.
Sent as the X-API-Key header.
| Name | Description |
|---|---|
remix_id required path | The remix's id, as returned by `POST /v1/remixes` or `GET /v1/remixes`. uuid |
input_id required path | The id of a dataset, group or function in the remix, from `state.inputs` in `GET /v1/remixes/{remix_id}`. |
curl
curl -X GET "/api/v1/remixes/{remix_id}/inputs/{input_id}/settings/" \ -H "X-API-Key: YOUR_API_KEY"
| Code | Description |
|---|---|
200 | {
"data": {
"sub_type": "interpolation",
"default_model": "linear",
"models": [
{
"model": "linear",
"settings": {
"additionalProp1": {}
}
}
]
}
} |
400 | |
401 | |
403 | |
404 | |
422 | |
429 |
Remixes: Ranges and Segments
Move segments of a dataset's data to other places along the axis. Requires `remixes:write`. Take each segment you move from `GET /v1/remixes/{remix_id}/range`.
Sent as the X-API-Key header.
| Name | Description |
|---|---|
remix_id required path | The remix's id, as returned by `POST /v1/remixes` or `GET /v1/remixes`. uuid |
dataset_id required path | The id of a dataset in the remix, from `state.inputs` in `GET /v1/remixes/{remix_id}`; not its source file's id. |
from required form | The segment to move, as listed by the range or segments endpoints. e.g. {"start": "2026-03-02T00:00:00Z", "end": "2026-03-05T00:00:00Z"} |
to required form | Where the segment goes along the axis. e.g. {"start": "2026-03-09T00:00:00Z", "end": "2026-03-12T00:00:00Z"} |
{
"from": {
"start": "2026-03-02T00:00:00Z",
"end": "2026-03-05T00:00:00Z"
},
"to": {
"start": "2026-03-09T00:00:00Z",
"end": "2026-03-12T00:00:00Z"
}
}curl
curl -X POST "/api/v1/remixes/{remix_id}/datasets/{dataset_id}/transitions/" \ -H "X-API-Key: YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{}'
| Code | Description |
|---|---|
200 | {
"data": {
"remix": {
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"name": "Signal comparison",
"created_at": "2026-10-12T08:19:29.600Z",
"updated_at": "2026-10-12T08:19:29.600Z",
"status": "synced",
"run": {
"last_completed_at": "2026-10-12T08:19:29.600Z",
"completed_runs": 1,
"output_ready": true
},
"state": {
"index_mode": "time_series",
"axis": {
"column": "event_time",
"interval": "D",
"type": "datetime"
},
"window": {
"start": "2026-01-01T00:00:00Z",
"end": "2026-03-31T00:00:00Z"
},
"range_auto_adjustment": true,
"columns": [
"event_time",
"revenue",
"traffic"
]
}
}
}
} |
400 | |
401 | |
403 | |
404 | |
409 | |
422 | |
429 |
The remix's window and, for each dataset, its segments: the stretches of its data. Requires `remixes:read`. Read a segment from here before moving it: a move's `from` is one of these segments.
Sent as the X-API-Key header.
| Name | Description |
|---|---|
remix_id required path | The remix's id, as returned by `POST /v1/remixes` or `GET /v1/remixes`. uuid |
curl
curl -X GET "/api/v1/remixes/{remix_id}/range/" \ -H "X-API-Key: YOUR_API_KEY"
| Code | Description |
|---|---|
200 | {
"data": {
"window": {
"start": "2026-01-01T00:00:00Z",
"end": "2026-03-31T00:00:00Z"
},
"datasets": [
{
"dataset_id": "9e1f7f6a-5d1a-4c8e-9a21-0c1d2e3f4a5b",
"segments": [
{
"start": "2026-03-02T00:00:00Z",
"end": "2026-03-05T00:00:00Z"
}
]
}
]
}
} |
400 | |
401 | |
403 | |
404 | |
422 | |
429 |
A dataset's whole axis split into windows. Requires `remixes:read`. Window `0` is the remix window itself; data in the other windows lies outside the remix's range.
Sent as the X-API-Key header.
| Name | Description |
|---|---|
remix_id required path | The remix's id, as returned by `POST /v1/remixes` or `GET /v1/remixes`. uuid |
dataset_id required path | The id of a dataset in the remix, from `state.inputs` in `GET /v1/remixes/{remix_id}`; not its source file's id. |
curl
curl -X GET "/api/v1/remixes/{remix_id}/datasets/{dataset_id}/windows/" \ -H "X-API-Key: YOUR_API_KEY"
| Code | Description |
|---|---|
200 | {
"data": {
"dataset_id": "9e1f7f6a-5d1a-4c8e-9a21-0c1d2e3f4a5b",
"windows": [
{
"window": -1,
"start": "2025-10-01T00:00:00Z",
"end": "2025-12-31T00:00:00Z"
},
{
"window": 0,
"start": "2026-01-01T00:00:00Z",
"end": "2026-03-31T00:00:00Z"
}
]
}
} |
400 | |
401 | |
403 | |
404 | |
422 | |
429 |
The dataset's segments inside one window, after its segment moves are applied. Requires `remixes:read`. Use it to find the segments you can move.
Sent as the X-API-Key header.
| Name | Description |
|---|---|
remix_id required path | The remix's id, as returned by `POST /v1/remixes` or `GET /v1/remixes`. uuid |
dataset_id required path | The id of a dataset in the remix, from `state.inputs` in `GET /v1/remixes/{remix_id}`; not its source file's id. |
window required path | Which window, as listed by the windows endpoint: `0` is the remix's own range, `-1`, `-2`, ... come before it and `1`, `2`, ... after it. |
curl
curl -X GET "/api/v1/remixes/{remix_id}/datasets/{dataset_id}/windows/{window}/segments/" \ -H "X-API-Key: YOUR_API_KEY"
| Code | Description |
|---|---|
200 | {
"data": {
"dataset_id": "9e1f7f6a-5d1a-4c8e-9a21-0c1d2e3f4a5b",
"window": 0,
"segments": [
{
"start": "2026-03-02T00:00:00Z",
"end": "2026-03-05T00:00:00Z"
}
]
}
} |
400 | |
401 | |
403 | |
404 | |
422 | |
429 |