/decide on every form submission, a compliance portal that displays current rule explanations, or a custom authoring pipeline.
Base URL: https://api.aethis.ai/api/v1/public/
Decision endpoints (no auth required) are safe to call client-side from a browser or mobile app.Authoring endpoints require an
x-api-key header and should be called from your server.
Authentication
Scopes
API keys carry a set of scopes. Each authoring endpoint requires a specific scope; a key without that scope receives403 Forbidden.
| Scope | Grants |
|---|---|
decide | POST /decide on private rulesets |
rulesets:read | GET /rulesets, GET /rulesets/{id}/schema |
rulesets:explain | GET /rulesets/{id}/explain, POST /rulesets/{id}/explain-failure |
rulesets:source | GET /rulesets/{id}/source (DSL export) |
rulesets:write | PATCH /rulesets/{id}/visibility, POST /rulesets/{id}/archive |
projects:read | GET /projects, /status, /guidance list/export |
projects:write | All project authoring: sources, tests, guidance, field/section discovery, generate, publish |
rulebooks:read | GET /rulebooks (your tenant’s listing), /schema, /explain, /graph |
rulebooks:write | Rulebook CRUD, /activate, /archive, PATCH /rulebooks/{id}/visibility |
/decide, /schema, /explain on public rulesets) require no scope and accept anonymous requests. GET /rulebooks/ also accepts anonymous requests: without a key it returns the cross-tenant public catalogue (rulebooks with visibility=public and status=active); with a key it returns your tenant’s rulebooks as before.
Rate-limit tiers
Keys are assigned a daily-quota tier. Counters reset at UTC midnight. A 429 is returned withRetry-After: 86400.
| Tier | /decide | /rulesets/* | /projects/* |
|---|---|---|---|
| Anonymous (no key) | 500/day per IP | 500/day per IP | — |
free | 500 | 500 | 500 |
starter | 10,000 | 500 | 100 |
pro | 100,000 | 5,000 | 500 |
support@aethis.ai to upgrade.
Decision envelope
Every/decide response includes audit fields (decision_id, inputs_hash, engine_version, ruleset_version) for reproducible replay without the server echoing your inputs. See Decision envelope → for the full contract.
Evaluate eligibility
No API key required.ruleset_id— the published ruleset to evaluate againstfield_values— map of field names to values (types must match the ruleset schema)include_trace(optional) — whentrue, returns atraceobject showing how each criterion was evaluated and the source clause it referencesinclude_explanation(optional) — whentrue, returns a structuredexplanationobject: gate-level checklist (groups[].criteria[].status), the supporting facts that proved each satisfied criterion (supporting_facts), the satisfied requirement name (decision_path), and any provided fields the ruleset never references (unused_facts— useful for catching field-name typos). See Debug a /decide for the full payload shape.
eligible— all criteria satisfiednot_eligible— one or more criteria failedundetermined— the engine could not reach a decision (missing field, discretionary clause, or case outside compiled rules)
Inspect a ruleset
notes (each FieldNoteOut: { note_text, source, metadata }) is the
structured guidance the ruleset author attached during /fields/discover.
Conversational front-ends (e.g. a paralegal bot) typically render
metadata.type='why' notes when the user asks “why are you asking this?”
and draw on metadata.type='legal_background' notes for edge-case
follow-ups. Older bundles return "notes": [] — treat the array as
optional.
weight is the question-ordering hint used by the constraint solver (higher = less preferred to
ask). Used by /decide’s optimal_path to surface cheap questions before
expensive ones when multiple ways to satisfy the ruleset exist.
Author rules
Authoring is invite-only private beta (request access). API key required; do all authoring server-side. Pass anX-Anthropic-Key header on generation requests — used for that request only, never stored.
Step 1 — Create a project
Step 2 — Generate and test
generate-and-test.
Incremental refine (minimal edit)
Bothgenerate and generate-and-test accept an optional mode body. mode: "refine" seeds generation from the section’s active ruleset and makes the minimal edit to fix failing tests, instead of re-authoring the section from scratch. Omitting the body (or mode: "fresh") is the default from-scratch behaviour.
seed_ruleset_id may be supplied to refine from a specific ruleset; when omitted, the section’s active ruleset is used.
Step 3 — Publish
/decide using the returned ruleset_id.
Error responses
| Code | Meaning |
|---|---|
200 | OK |
201 | Created (project or ruleset) |
202 | Accepted — generation queued, poll /status |
422 | Validation error — wrong field type, missing required field, or invalid ruleset ID |
429 | Rate limit exceeded |
404 | Ruleset or project not found |
Date fields take an ISO "YYYY-MM-DD" string or an integer ordinal on ruleset evaluations (ISO accepted since engine 0.31.0). Rulebook evaluations (rulebook_id) still require ordinals. See Date field values.Full endpoint reference
All endpoints with schemas, parameter details, and example responses: API Reference →Help improve this pageIf something here is unclear or missing an example, use the feedback button at the bottom of the page.Found a bug? Open a GitHub issue. Evaluating Aethis for a regulated workflow? Contact us directly.