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. Thecode 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, aswebhook_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.