List Specs
List every Spec in your workspace with its schema, published version, and links. A Spec and the schema it runs on are two records with two different IDs.
A Spec is the authoring document behind /specs/{id} in the app. Publishing a Spec *materializes* it onto a schema, which is what pipelines actually run. The two are separate records with separate IDs: the ID in the Spec editor URL is not the schema ID, and vice versa.
/specs/... browser URL and look it up under /v1/schemas/{id}, you will get a 404 — not because the Spec is missing, but because that endpoint is keyed on schema IDs. Use schema_id below to cross over, or spec_id on GET /v1/schemas to cross back.search filters by name, case-insensitively; % and _ in the query are treated literally, so searching order_ matches only names containing that exact text. Pagination is keyset-based: the opaque cursor encodes the last row's creation time and id, keeping pages stable while Specs are being created, and pagination.total reflects the filtered count before the cursor is applied, so it stays constant across pages.
/v1/specsQuery parameters
next_cursor.desc (default) or asc, by creation time.List Specs
curl -H "Authorization: Bearer $TALONIC_API_KEY" \
"https://api.talonic.com/v1/specs?limit=20"Response
Response fields
/specs/{id} editor URL.Response
{
"data": [
{
"id": "e2144027-39c0-44e8-a196-72be1e360749",
"name": "Order Intake V25",
"description": null,
"schema_id": "2e3ddf8c-b9ab-4934-bb11-a371e9c5d7a8",
"version": 3,
"materialized_version": 3,
"materialized_at": "2026-04-25T14:30:00.000Z",
"field_count": 60,
"node_count": 7,
"created_at": "2026-04-20T09:12:00.000Z",
"updated_at": "2026-04-25T14:30:00.000Z",
"links": {
"self": "/v1/specs/e2144027-39c0-44e8-a196-72be1e360749",
"versions": "/v1/specs/e2144027-39c0-44e8-a196-72be1e360749/versions",
"schema": "/v1/schemas/2e3ddf8c-b9ab-4934-bb11-a371e9c5d7a8",
"rail": "/v1/schemas/2e3ddf8c-b9ab-4934-bb11-a371e9c5d7a8/rail",
"dashboard": "https://app.talonic.com/specs/e2144027-39c0-44e8-a196-72be1e360749"
}
}
],
"pagination": { "total": 6, "limit": 20, "has_more": false, "next_cursor": null }
}Each row's links object carries the useful next hops: versions for the publish history and — once the Spec has been published — schema and rail on the schema-keyed side of the API, plus dashboard, a deep link into the Spec editor for humans. field_count and node_count are cheap summary counters; node_count counts rail stages as authored, which is not the number of executable phases — the compiled plan lives on Get a Spec.
Specs are read-only over the API. Authoring happens in the Spec editor, which re-converges the live schema on every publish — an API write would be overwritten by the next one.
Frequently asked questions
Why does my Spec ID return 404 on /v1/schemas/{id}?+
/specs/... editor URL is the Spec ID; /v1/schemas/{id} is keyed on schema IDs. Call GET /v1/specs/{spec_id} and use the schema_id it returns, or list schemas and match on their spec_id field.My Spec is published to v3, but the schema reports version 1. Why?+
version on a schema is the legacy schema-version counter, which a Spec-authored schema never advances. The Spec's own published version is version on this endpoint, spec_version on GET /v1/schemas, and the full history is at GET /v1/specs/{id}/versions.What is the difference between version and materialized_version?+
version is the published head — what the editor shows. materialized_version is the version whose configuration is currently live on the schema, i.e. what a run executes. They are normally identical; materialized_version lags when a publish was refused by the acknowledgement gate or a stale activation no-opped.Can I create or edit a Spec through this API?+
PUT /v1/schemas/{id}/rail, which edits the rail on the schema side and cannot change extraction model settings.