The Skillful Sardine API is a set of small operations for the work automations do all the time: parsing CSV, reshaping JSON, comparing lists, cleaning text, working with dates, reading PDFs and generating identifiers. Each operation does one thing, and every operation answers in the same shape, so a flow can rely on it.
How a call looks
Operations are POST calls with a JSON body, under the /v1 path. This call parses a small CSV file:
POST /v1/csv/parse
Content-Type: application/json
{"content": "name,city\nAna,Porto\n"}
What every response contains
Every response, successful or not, has the same three keys:
| Key | What it holds |
|---|---|
data |
The result of the operation. null when the call failed. |
errors |
A list of problems, each with a code, a message and, for invalid input, the field. null when the call worked. |
meta |
The request_id of the call, its timestamp and the API version. Quote the request_id when you ask for help. |
The call above answers:
{
"data": {
"headers": ["name", "city"],
"records": [{"name": "Ana", "city": "Porto"}],
"rows": [["Ana", "Porto"]],
"row_count": 1,
"warnings": []
},
"errors": null,
"meta": {
"request_id": "99fedbdb-61db-455f-b435-0f18f033540a",
"timestamp": "2026-10-20T15:53:06.512988Z",
"version": "2026-03-26"
},
"pagination": null
}
When something goes wrong
A problem with the input answers 400 (or 422 when a field is missing or has the wrong type) and says what to fix. Sending an empty CSV answers:
{
"data": null,
"errors": [{"code": "http_error", "message": "The CSV is empty. Send at least one row", "field": null}],
"meta": {"request_id": "55906c68-0028-4134-a0ab-ab375c91d251", "timestamp": "2026-10-20T15:53:06.516408Z", "version": "2026-03-26"},
"pagination": null
}
Every operation in the reference lists its fields, which ones are required and their defaults. Errors explains every status a call can answer.