Stream one index run's progress
const url = 'http://localhost:8080/v1/admin/index-runs/example/events';const options = { method: 'GET', headers: {Authorization: 'Bearer <token>', 'X-Antares-Actor': '<X-Antares-Actor>'}};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request GET \ --url http://localhost:8080/v1/admin/index-runs/example/events \ --header 'Authorization: Bearer <token>' \ --header 'X-Antares-Actor: <X-Antares-Actor>'Server-Sent Events for a single run. The HTTP body is an SSE byte stream, not JSON; the response schema below describes one decoded frame, and the event field names which payload the frame’s data carries.
Framing rules, so the Go writer and the panel’s EventSource cannot drift:
retry: 3000is sent once when the stream opens. - A comment line:keepaliveevery 15 s. It is a comment, never anevent:, so it can never be mistaken for data.- Every frame carries a monotonic
id:. A reconnecting client sendsLast-Event-IDand the server replays from there. - The stream closes after
run.committedorrun.aborted. The panel must stop reconnecting on those two events. run.progressis emitted at most every 500 ms,run.skippedat most 200 times per run — the remainder is inGET /v1/admin/index-runs/{runId}/errors.
Role: viewer. The panel proxies this through its own route and adds the actor token there; the browser’s EventSource never sees an Antares credential.
Authorizations
Abschnitt betitelt „Authorizations“Parameters
Abschnitt betitelt „Parameters“Path Parameters
Abschnitt betitelt „Path Parameters“Index run identifier, a ULID with an ir_ prefix.
Header Parameters
Abschnitt betitelt „Header Parameters“The id: of the last frame the client processed. The server replays everything after it, so a reconnect never loses a run.skipped or a quota.warning.
Responses
Abschnitt betitelt „Responses“The event stream. Frames are event:/data:/id: triples as described above.
One decoded frame of GET /v1/admin/index-runs/{runId}/events. The HTTP body is an SSE byte stream; this schema describes a single event:/data: pair after parsing, which is what an EventSource handler and the Go writer must agree on.
object
The SSE event: name. It selects which schema data follows: run.snapshot → RunSnapshotEvent, run.progress → RunProgressEvent, run.sample → RunSampleEvent, run.skipped → RunSkippedEvent, run.embedding → RunEmbeddingEvent, run.committed → RunCommittedEvent, run.aborted → RunAbortedEvent.
Sent once, immediately on open, so a subscriber that arrived late renders the run’s current state without a polling request.
object
created — enqueued, nothing written yet. indexing — at least one batch landed. committed — sanity checks passed and the alias was swapped. aborted — the run failed or was superseded; the previous collection stayed live.
Emitted at most every 500 ms while batches are landing.
object
Throughput over the last few seconds, not over the whole run.
Seconds until the expected count is reached at the current rate. Absent when the run has no expectedCount.
Up to five freshly indexed products. This exists for one reason: the onboarding screen showing a merchant their own products flowing in, which is what turns “it is importing” into “it works”.
object
object
One skipped product, at most 200 per run. The remainder is only in GET /v1/admin/index-runs/{runId}/errors.
object
Why the product was skipped. validation_failed — a field failed its rule, most often a missing price in the channel’s default currency or a priceRange entry missing for a priced currency. currency_not_indexed — the product priced a currency the channel does not assign. price_context_budget_exceeded — more than 64 contexts or 128 context × currency families. price_context_unknown — the product referenced a context that is in no registry. search_backend_rejected — Typesense refused the document itself.
The second phase, after the alias swap. Keyword search is already live.
object
Terminal. The stream closes after this frame.
object
The live document count before the swap. The panel shows the delta, which is how a merchant notices a catalogue that halved.
The concrete collection the alias now points at.
Terminal. The stream closes after this frame; the previous index stayed live.
object
The problem code that ended the run, for example document_count_sanity_failed.
Headers
Abschnitt betitelt „Headers“Always no-cache, no-transform; a buffering proxy would destroy the stream.
contract_validation_failed — the OpenAPI request validator rejected the request before the handler ran — or invalid_request when the body is unreadable or is not valid JSON for the declared operation.
RFC 9457 problem details. type is always https://api.antares.commergy.de/problems/{code} and is built in exactly one place. type, code and title are stable and never localised; only detail is localised, and only where the registry marks the audience as merchant.
object
Absolute problem type URI. Stable identifier, never localised.
Stable English summary of the problem type.
The HTTP status code, repeated in the body.
Human-readable explanation of this occurrence. The only localised field; may be German or English depending on Accept-Language.
The request path this occurrence relates to.
The registry code, for example price_context_token_expired. This is what a client branches on; never branch on title or detail.
Present only for per-item validation failures, above all ingest batches.
object
Dotted path of the offending field inside the request body, for example prices.CHF.gross.
What is wrong with it, in English.
0-based index into the request’s products array. Present only for ingest batches, and the only way to map an error back to a product without echoing it.
Examplegenerated
{ "type": "example", "title": "example", "status": 1, "detail": "example", "instance": "example", "code": "example", "errors": [ { "field": "example", "message": "example", "productIndex": 1 } ]}unauthorized — the credential is missing, malformed, unknown or revoked. For /v1/admin this also covers an actor JWS that fails signature, exp or kid verification, and a kid that no key in the panel’s JWKS matches.
RFC 9457 problem details. type is always https://api.antares.commergy.de/problems/{code} and is built in exactly one place. type, code and title are stable and never localised; only detail is localised, and only where the registry marks the audience as merchant.
object
Absolute problem type URI. Stable identifier, never localised.
Stable English summary of the problem type.
The HTTP status code, repeated in the body.
Human-readable explanation of this occurrence. The only localised field; may be German or English depending on Accept-Language.
The request path this occurrence relates to.
The registry code, for example price_context_token_expired. This is what a client branches on; never branch on title or detail.
Present only for per-item validation failures, above all ingest batches.
object
Dotted path of the offending field inside the request body, for example prices.CHF.gross.
What is wrong with it, in English.
0-based index into the request’s products array. Present only for ingest batches, and the only way to map an error back to a product without echoing it.
Examplegenerated
{ "type": "example", "title": "example", "status": 1, "detail": "example", "instance": "example", "code": "example", "errors": [ { "field": "example", "message": "example", "productIndex": 1 } ]}forbidden — authenticated, but the actor’s role does not carry the permission this route needs, or the operation is one of the three that refuse an impersonated actor (billing checkout, portal link, key rotation).
RFC 9457 problem details. type is always https://api.antares.commergy.de/problems/{code} and is built in exactly one place. type, code and title are stable and never localised; only detail is localised, and only where the registry marks the audience as merchant.
object
Absolute problem type URI. Stable identifier, never localised.
Stable English summary of the problem type.
The HTTP status code, repeated in the body.
Human-readable explanation of this occurrence. The only localised field; may be German or English depending on Accept-Language.
The request path this occurrence relates to.
The registry code, for example price_context_token_expired. This is what a client branches on; never branch on title or detail.
Present only for per-item validation failures, above all ingest batches.
object
Dotted path of the offending field inside the request body, for example prices.CHF.gross.
What is wrong with it, in English.
0-based index into the request’s products array. Present only for ingest batches, and the only way to map an error back to a product without echoing it.
Examplegenerated
{ "type": "example", "title": "example", "status": 1, "detail": "example", "instance": "example", "code": "example", "errors": [ { "field": "example", "message": "example", "productIndex": 1 } ]}not_found — the addressed shop, channel, synonym, curation, index run, key or organization does not exist inside the caller’s organization. Deliberately indistinguishable from “exists but belongs to somebody else”.
RFC 9457 problem details. type is always https://api.antares.commergy.de/problems/{code} and is built in exactly one place. type, code and title are stable and never localised; only detail is localised, and only where the registry marks the audience as merchant.
object
Absolute problem type URI. Stable identifier, never localised.
Stable English summary of the problem type.
The HTTP status code, repeated in the body.
Human-readable explanation of this occurrence. The only localised field; may be German or English depending on Accept-Language.
The request path this occurrence relates to.
The registry code, for example price_context_token_expired. This is what a client branches on; never branch on title or detail.
Present only for per-item validation failures, above all ingest batches.
object
Dotted path of the offending field inside the request body, for example prices.CHF.gross.
What is wrong with it, in English.
0-based index into the request’s products array. Present only for ingest batches, and the only way to map an error back to a product without echoing it.
Examplegenerated
{ "type": "example", "title": "example", "status": 1, "detail": "example", "instance": "example", "code": "example", "errors": [ { "field": "example", "message": "example", "productIndex": 1 } ]}rate_limit_exceeded — the per-key or per-IP token bucket is exhausted.
RFC 9457 problem details. type is always https://api.antares.commergy.de/problems/{code} and is built in exactly one place. type, code and title are stable and never localised; only detail is localised, and only where the registry marks the audience as merchant.
object
Absolute problem type URI. Stable identifier, never localised.
Stable English summary of the problem type.
The HTTP status code, repeated in the body.
Human-readable explanation of this occurrence. The only localised field; may be German or English depending on Accept-Language.
The request path this occurrence relates to.
The registry code, for example price_context_token_expired. This is what a client branches on; never branch on title or detail.
Present only for per-item validation failures, above all ingest batches.
object
Dotted path of the offending field inside the request body, for example prices.CHF.gross.
What is wrong with it, in English.
0-based index into the request’s products array. Present only for ingest batches, and the only way to map an error back to a product without echoing it.
Examplegenerated
{ "type": "example", "title": "example", "status": 1, "detail": "example", "instance": "example", "code": "example", "errors": [ { "field": "example", "message": "example", "productIndex": 1 } ]}Headers
Abschnitt betitelt „Headers“Seconds until the bucket refills enough for one request.
internal_error — unhandled failure. detail is always generic; the cause goes to the log with a correlation id.
RFC 9457 problem details. type is always https://api.antares.commergy.de/problems/{code} and is built in exactly one place. type, code and title are stable and never localised; only detail is localised, and only where the registry marks the audience as merchant.
object
Absolute problem type URI. Stable identifier, never localised.
Stable English summary of the problem type.
The HTTP status code, repeated in the body.
Human-readable explanation of this occurrence. The only localised field; may be German or English depending on Accept-Language.
The request path this occurrence relates to.
The registry code, for example price_context_token_expired. This is what a client branches on; never branch on title or detail.
Present only for per-item validation failures, above all ingest batches.
object
Dotted path of the offending field inside the request body, for example prices.CHF.gross.
What is wrong with it, in English.
0-based index into the request’s products array. Present only for ingest batches, and the only way to map an error back to a product without echoing it.
Examplegenerated
{ "type": "example", "title": "example", "status": 1, "detail": "example", "instance": "example", "code": "example", "errors": [ { "field": "example", "message": "example", "productIndex": 1 } ]}