Skip to main content

Endpoints

Over REST, authenticate with the x-api-key header against https://api.seltz.ai. The SDKs speak gRPC to grpc.seltz.ai; pass your API key to the client constructor and it is sent on every call.

SDK methods

Each SDK method maps to exactly one RPC, and each returns its response message whole rather than one field of it — get() gives you .monitor and .run_state, list() gives you .monitors and .has_more.
stream_records / streamRecords is server-streaming gRPC and has no REST equivalent. Poll GET /v1/monitors/{monitor_id}/records instead when you are working over REST.

Paging

Cursors are ids, exclusive at both ends. limit defaults to 100 and caps at 1000. has_more is a response field, true when items remain. Not every listing takes both cursors: list also filters: name for an exact name and status for a MonitorStatus. list_records and list_run_records take include_content, which is true unless you set it and omits document content when false. There is no cursor token — the id is the cursor. Store the id of the last item you handled and pass it back. has_more is authoritative: a page can hold fewer items than limit, so a short page does not mean the end of the data.
Every int64 crosses the REST surface as a string — record_id and run_id included. In TypeScript they are bigint; converting one to Number silently corrupts it.

Enum spelling

The same enum value is spelled three ways depending on where you read it. So -d '{"status": "paused"}' over cURL and status=MonitorStatus.MONITOR_STATUS_PAUSED in Python do exactly the same thing.

Run status

A run reports one of four outcomes. run.completed is sent for both completed and partial. A skipped run sends no webhook.

Cadence

The cadence is a count and a single unit: s, m, h, d (24 hours) or w (7 days). A bare number is seconds. 6h, 2d, 1w, 90m and 3600 are all valid. Compound expressions are not allowed. 1h30m is rejected. Use the smaller unit instead: 90m. The floor is one hour and the ceiling is 366 days. A cadence outside that range is rejected with INVALID_REQUEST; it is not clamped to the nearest legal value, so the create or update does not take effect. What is promised is one run per cadence period, completing within that period. The position of the run within the period is not guaranteed and may move between periods. Do not depend on a fixed clock time or a fixed offset from the previous run.

Limits

Exceeding the search-request limit rejects the request with INVALID_REQUEST. Visibility covers runs as well as records: after 30 days, a run and the records it committed are no longer returned, and reading the run by id gives NOT_FOUND. Visibility and deduplication are different clocks — see Concepts.

Errors

Every failure carries the same body. The code is a stable name and is the field to branch on; the message is prose and can change.
Over gRPC the same failures arrive as status codes rather than as this body. A taken name is ALREADY_EXISTS.
Leaving an argument out and passing null are different things across every endpoint. Out means “keep what is there”. null means “no value” — on a filter that is the same as leaving it out, and on the webhook it removes it.

Webhook secret

The webhook secret is returned once, in the create response, as webhook_secret, and never again. Removing and re-adding a webhook does not issue a new one, and there is currently no way to rotate it. It is a whsec_-prefixed Standard Webhooks secret, so pass it to the library for your language unchanged — the prefix and the encoding are part of what the library reads.