DSAIL Quickstarts Guides Compare REST MCP tools Errors Legal Support

REST API reference

Every route of the hosted DSAIL service, rendered from its published OpenAPI document, so an agent can read the contract before connecting.

Base URL: https://agents.jaxon.ai. Every request and response is JSON. Every error is one envelope — {ok: false, error: {code, message, docs, ...}, versions} — and error.docs is the page on this site that resolves it (see Errors).

Authentication: the header x-jaxon-credential, which takes either of two credentials. An evaluation credential comes with no sign-up from POST /v1/credentials/evaluation; the response's credential field is the token, shown once. It is scoped to compile, check and the prompt pack, and capped. A production API key is issued to a signed-in account, by dsail_issue_api_key from a connected chat or by POST /v1/credentials/api-key; it reaches the rulesets that account holds, and is likewise shown once. Every route that takes a credential lists the refusals it can answer with: 401 with no credential or one not recognised, 403 for an operation the credential may not perform, and 429 once an evaluation credential reaches its cap.

The document below is rendered from the published OpenAPI specification. The specification itself is GET https://agents.jaxon.ai/openapi.json, and a copy ships inside the dsail Python package as dsail.contract.openapi().

GET /health

Health

Response 200:

GET /v1/account

Entitlement and usage position — the enforced one since TJP-623 — plus the terms version and vocabulary version applicable to this tier

Response 200:

Response 401: the error envelope. CREDENTIAL_REQUIRED or CREDENTIAL_INVALID: no x-jaxon-credential header, or one that is not recognised, was revoked or has expired. The header takes an evaluation credential or a production API key; a signed-in caller needs neither.

POST /v1/approvals

Save under a name and bind a human approval to an exact ruleset hash

Request body:

Response 200:

Response 400: the error envelope. The body did not match the contract, that is not a content hash, or name is not a usable ruleset name — in which case nothing was saved and no approval was recorded.

Response 401: the error envelope. CREDENTIAL_REQUIRED or CREDENTIAL_INVALID: no x-jaxon-credential header, or one that is not recognised, was revoked or has expired. The header takes an evaluation credential or a production API key; a signed-in caller needs neither.

Response 403: the error envelope. CREDENTIAL_SCOPE: an evaluation credential may not perform this operation. A production API key may.

Response 404: the error envelope. The hash is not stored, so there is nothing to approve.

Response 413: the error envelope. approver or note exceeded the published ceiling.

POST /v1/check

Validate a claim dictionary and solve it, in one call

Request body:

Response 200:

Every rule in the ruleset with every assertion's own result, and nothing combined on top of them. Pure over its inputs: no timestamps, no durations, no request id, so the same ruleset and claim dictionary always produce the same bytes — through either door.

Response 400: the error envelope. The request body did not match the contract (shape, not content).

Response 401: the error envelope. CREDENTIAL_REQUIRED or CREDENTIAL_INVALID: no x-jaxon-credential header, or one that is not recognised, was revoked or has expired. The header takes an evaluation credential or a production API key; a signed-in caller needs neither.

Response 402: the error envelope. ENTITLEMENT_EXCEEDED: the account's check allowance for this period is used up. The error carries tier, used, limit_value, period and upgrade_url.

Response 404: the error envelope. No stored ruleset for that hash.

Response 413: the error envelope. A complexity budget was exceeded.

Response 422: the error envelope. The claim dictionary was rejected. Every failing field is named.

Response 429: the error envelope. EVALUATION_LIMIT: an evaluation credential reached its daily or lifetime cap. A production API key is not subject to it.

Response 500: the error envelope. The engine and the manifest disagree about which assertions this ruleset states, so no results are offered. Deliberately not a partial answer.

Response 503: the error envelope. ENGINE_BUSY: the solver was busy with other requests for longer than a call may wait. Nothing was charged; retry after retry_after_ms (also sent as Retry-After).

POST /v1/compile

Compile a ruleset; get its hash, manifest and validation contract

Request body:

Response 200:

Response 400: the error envelope. The request body did not match the contract (shape, not content).

Response 401: the error envelope. CREDENTIAL_REQUIRED or CREDENTIAL_INVALID: no x-jaxon-credential header, or one that is not recognised, was revoked or has expired. The header takes an evaluation credential or a production API key; a signed-in caller needs neither.

Response 413: the error envelope. A complexity budget was exceeded.

Response 422: the error envelope. The source did not compile. The error carries diagnostics and the grammar as a hint.

Response 429: the error envelope. EVALUATION_LIMIT: an evaluation credential reached its daily or lifetime cap. A production API key is not subject to it.

Response 503: the error envelope. ENGINE_BUSY: the solver was busy with other requests for longer than a call may wait. Nothing was charged; retry after retry_after_ms (also sent as Retry-After).

POST /v1/credentials/api-key

Issue a production REST API key for the caller's own project (TJP-623). The token appears once.

Grade three, for a caller who has already proved the account is theirs.

Authenticated by whatever the caller already holds — the connector's OAuth subject through the MCP door, or an existing credential here — and issued into that caller's own namespace. There is deliberately no route that issues one to the bearer of a link.

Request body:

Response 200:

Response 401: the error envelope. CREDENTIAL_REQUIRED or CREDENTIAL_INVALID: no x-jaxon-credential header, or one that is not recognised, was revoked or has expired. The header takes an evaluation credential or a production API key; a signed-in caller needs neither.

Response 403: the error envelope. CREDENTIAL_SCOPE: an evaluation credential may not issue a production key, or the account already holds as many production API keys as its tier permits.

POST /v1/credentials/evaluation

Obtain an evaluation credential: no sign-up, scoped to compile and check, capped, expiring (TJP-621)

Request body:

Response 200:

An evaluation credential, minted on request with no human gate (TJP-621). The token is shown here and nowhere else — the service stores only its hash. Send it as the x-jaxon-credential header. It is scoped to compile, check and the prompt pack, capped per day and over its lifetime, and expires; every response it produces carries x-jaxon-credential-grade: evaluation.

Response 400: the error envelope. This deployment does not require credentials, so it issues none.

Response 429: the error envelope. Too many evaluation credentials were issued from this network today. The message is an upgrade prompt.

GET /v1/flags

This deployment's own feature flags (not the platform's)

Response 200:

Response 401: the error envelope. CREDENTIAL_REQUIRED or CREDENTIAL_INVALID: no x-jaxon-credential header, or one that is not recognised, was revoked or has expired. The header takes an evaluation credential or a production API key; a signed-in caller needs neither.

POST /v1/prompt-pack

Prompt pack for source you have not compiled yet

Request body:

Response 200:

Response 400: the error envelope. The request body or a path parameter did not match the contract.

Response 401: the error envelope. CREDENTIAL_REQUIRED or CREDENTIAL_INVALID: no x-jaxon-credential header, or one that is not recognised, was revoked or has expired. The header takes an evaluation credential or a production API key; a signed-in caller needs neither.

Response 404: the error envelope. No stored ruleset for that hash.

Response 413: the error envelope. A complexity budget was exceeded.

Response 422: the error envelope. The source did not compile.

Response 429: the error envelope. EVALUATION_LIMIT: an evaluation credential reached its daily or lifetime cap. A production API key is not subject to it.

GET /v1/prompt-pack/{ruleset_hash}

Extraction prompts, claim schema and validation contract for a ruleset

Response 200:

Response 400: the error envelope. That is not a content hash (64 lowercase hex characters).

Response 401: the error envelope. CREDENTIAL_REQUIRED or CREDENTIAL_INVALID: no x-jaxon-credential header, or one that is not recognised, was revoked or has expired. The header takes an evaluation credential or a production API key; a signed-in caller needs neither.

Response 404: the error envelope. No stored ruleset for that hash.

Response 422: the error envelope. The stored source no longer compiles under this engine.

Response 429: the error envelope. EVALUATION_LIMIT: an evaluation credential reached its daily or lifetime cap. A production API key is not subject to it.

GET /v1/rulesets

List named rulesets, with what each one decides

Response 200:

Every named ruleset saved for this connection, with enough per row to render a library without a second call.

Response 401: the error envelope. CREDENTIAL_REQUIRED or CREDENTIAL_INVALID: no x-jaxon-credential header, or one that is not recognised, was revoked or has expired. The header takes an evaluation credential or a production API key; a signed-in caller needs neither.

Response 403: the error envelope. CREDENTIAL_SCOPE: an evaluation credential may not perform this operation. A production API key may.

POST /v1/rulesets

Store a named revision of a ruleset

Request body:

Response 200:

Response 400: the error envelope. The name or the body did not match the contract.

Response 401: the error envelope. CREDENTIAL_REQUIRED or CREDENTIAL_INVALID: no x-jaxon-credential header, or one that is not recognised, was revoked or has expired. The header takes an evaluation credential or a production API key; a signed-in caller needs neither.

Response 403: the error envelope. CREDENTIAL_SCOPE: an evaluation credential may not perform this operation. A production API key may.

Response 404: the error envelope. The parent_hash given is not stored, so no revision can cite it.

Response 413: the error envelope. A complexity budget was exceeded.

Response 422: the error envelope. The source did not compile.

GET /v1/rulesets/{name}

Load a named ruleset with its full contract, revision chain and approvals

Response 200:

A stored ruleset, in the shape a compile of it would return plus what the store knows about it. This is how a saved ruleset is SHOWN — re-compiling remembered source produces a different object the moment the two disagree, and an approval follows the stored bytes.

Response 400: the error envelope. That is not a usable ruleset name.

Response 401: the error envelope. CREDENTIAL_REQUIRED or CREDENTIAL_INVALID: no x-jaxon-credential header, or one that is not recognised, was revoked or has expired. The header takes an evaluation credential or a production API key; a signed-in caller needs neither.

Response 403: the error envelope. CREDENTIAL_SCOPE: an evaluation credential may not perform this operation. A production API key may.

Response 404: the error envelope. No ruleset by that name.

Response 422: the error envelope. The stored source no longer compiles under this engine.

POST /v1/rulesets/{name}/copies

Copy one of your rulesets into another of your workspaces

Request body:

Response 200:

POST /v1/teams

Create a team with a ruleset library of its own

Request body:

Response 200:

POST /v1/teams/{team_id}/invitations

Invite somebody by email. The link comes back once.

Request body:

Response 200:

GET /v1/teams/{team_id}/members

Who is in this team, and who administers it

Response 200:

DELETE /v1/teams/{team_id}/members/{member}

Remove a member and revoke the keys they issued for this team

Response 200:

POST /v1/teams/{team_id}/members/{member}/role

Make a member an administrator, or return them to a member

Request body:

Response 200:

GET /v1/units

Which unit standards are loaded and what this project added

Response 200:

Response 401: the error envelope. CREDENTIAL_REQUIRED or CREDENTIAL_INVALID: no x-jaxon-credential header, or one that is not recognised, was revoked or has expired. The header takes an evaluation credential or a production API key; a signed-in caller needs neither.

GET /v1/units/bridge

Whether one unit converts to another, and by what factor

Response 200:

Response 400: the error envelope. Both unit names are required.

Response 401: the error envelope. CREDENTIAL_REQUIRED or CREDENTIAL_INVALID: no x-jaxon-credential header, or one that is not recognised, was revoked or has expired. The header takes an evaluation credential or a production API key; a signed-in caller needs neither.

POST /v1/units/converters

Add a converter to this project's unit library

Request body:

Response 200:

Response 400: the error envelope. The converter did not match the contract. A factor is required and is never inferred.

Response 401: the error envelope. CREDENTIAL_REQUIRED or CREDENTIAL_INVALID: no x-jaxon-credential header, or one that is not recognised, was revoked or has expired. The header takes an evaluation credential or a production API key; a signed-in caller needs neither.

Response 403: the error envelope. CREDENTIAL_SCOPE: an evaluation credential may not perform this operation. A production API key may.

Response 413: the error envelope. attribution exceeded the ceiling.

GET /v1/vocabulary

The application-domain vocabulary: level one, level-two terms with provenance, version history, K and the promotion rule (TJP-642)

Response 200:

The application-domain vocabulary as a machine-readable, versioned document. Level one is closed and published in full; level two lists every term that is currently in the vocabulary, with its provenance (seeded for cold start, or promoted by K distinct external accounts). Unpromoted proposals are not here — they are counts, not vocabulary.

GET /v1/workspaces

Every workspace you may work in, and which one is in use

Response 200:

POST /v1/workspaces/current

Work in a different team, or in your own workspace

Request body:

Response 200:

GET /version

Version

Response 200: