This page provides a scannable endpoint map. Use OpenAPI docs as the canonical request/response schema source.
--8<-- "snippets/start-api.md"
- Endpoint:
POST /api/v2/auth/login - Payload type:
application/x-www-form-urlencoded - Required fields:
username(email)password
Example:
curl -X POST http://localhost:8888/api/v2/auth/login \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "username=admin@example.com&password=admin"- Send access token as
Authorization: Bearer <access_token> - Access tokens include an
org_idclaim. Manager requests reject tokens whoseorg_idno longer matches the authenticated user's stored organisation. POST /api/v2/evaluaterequires either anX-API-Keyheader (recommended for service-to-service) or a valid Bearer token
- Users belong to exactly one organisation.
- The current organisation for manager requests comes from the authenticated user, not a request body parameter.
- Manager routes now scope rules, tested events, shadow, outcomes, users, roles, labels, user lists, field types, settings, analytics, API keys, backtesting history, and audit/history reads to the caller's organisation.
- Roles and labels are organisation-owned catalogs, so the same role/label names can exist in different organisations.
- User-role assignment is same-org only.
Refresh tokens are tracked server-side in the user_session table. To revoke a session:
curl -X POST http://localhost:8888/api/v2/auth/logout \
-H "Authorization: Bearer <access_token>" \
-H "Content-Type: application/json" \
-d '{"refresh_token": "<refresh_token>"}'After a successful logout, the refresh token is deleted from the database and any subsequent attempt to use it returns 401. Access tokens remain valid until their 30-minute expiry (stateless JWTs cannot be revoked).
Each call to POST /api/v2/auth/refresh deletes the submitted refresh token and issues a new one. A refresh token can only be used once. Presenting a previously-used or revoked refresh token returns 401 Session not found or already revoked.
| Method | Path | Auth | Notes |
|---|---|---|---|
POST |
/api/v2/auth/login |
No | OAuth2 form login |
POST |
/api/v2/auth/accept-invite |
No | Accept invitation token and set password |
POST |
/api/v2/auth/forgot-password |
No | Send password reset email (always generic response) |
POST |
/api/v2/auth/reset-password |
No | Reset password using one-time token |
POST |
/api/v2/auth/refresh |
No (refresh token in body) | Exchanges refresh token (rotation — one-time use) |
POST |
/api/v2/auth/logout |
Bearer + refresh token in body | Revokes refresh token server-side |
GET |
/api/v2/auth/me |
Bearer | Current user profile, including effective permission names |
| Method | Path | Auth | Notes |
|---|---|---|---|
GET |
/api/v2/rules |
Bearer + permission | List rules |
POST |
/api/v2/rules |
Bearer + permission | Create rule |
GET |
/api/v2/rules/{rule_id} |
Bearer + permission | Rule details |
GET |
/api/v2/rules/{rule_id}/revisions/{revision_number} |
Bearer + permission | Specific historical revision |
PUT |
/api/v2/rules/{rule_id} |
Bearer + permission | Update rule |
PUT |
/api/v2/rules/main-order |
Bearer + REORDER_RULES |
Replace the full ordered main-rule sequence |
DELETE |
/api/v2/rules/{rule_id} |
Bearer + DELETE_RULE |
Delete rule |
POST |
/api/v2/rules/{rule_id}/promote |
Bearer + PROMOTE_RULES |
Promote draft rule to active |
POST |
/api/v2/rules/{rule_id}/pause |
Bearer + PAUSE_RULES |
Pause active rule |
POST |
/api/v2/rules/{rule_id}/resume |
Bearer + PROMOTE_RULES |
Resume paused rule to active |
POST |
/api/v2/rules/{rule_id}/archive |
Bearer + MODIFY_RULE |
Archive rule |
POST |
/api/v2/rules/{rule_id}/rollback |
Bearer + MODIFY_RULE |
Create a new draft version from a historical revision (revision_number in body) |
POST |
/api/v2/rules/verify |
Bearer + permission | Verify rule source, extracted params, and advisory warnings for unseen fields |
POST |
/api/v2/rules/ai/draft |
Bearer + CREATE_RULE or MODIFY_RULE |
Generate an AI-assisted rule draft (`mode=create |
POST |
/api/v2/rules/ai/apply |
Bearer + CREATE_RULE or MODIFY_RULE |
Record that an AI draft was explicitly applied in the editor |
POST |
/api/v2/rules/test |
Bearer + permission | Test rule payload |
GET |
/api/v2/rules/{rule_id}/history |
Bearer + permission | Revision list |
POST |
/api/v2/rules/{rule_id}/shadow |
Bearer + MODIFY_RULE |
Deploy rule to shadow |
DELETE |
/api/v2/rules/{rule_id}/shadow |
Bearer + MODIFY_RULE |
Remove rule from shadow |
POST |
/api/v2/rules/{rule_id}/shadow/promote |
Bearer + PROMOTE_RULES |
Promote shadow rule to production |
POST |
/api/v2/rules/{rule_id}/rollout |
Bearer + PROMOTE_RULES |
Start or update a live traffic rollout for an active rule |
DELETE |
/api/v2/rules/{rule_id}/rollout |
Bearer + PROMOTE_RULES |
Remove a rollout |
POST |
/api/v2/rules/{rule_id}/rollout/promote |
Bearer + PROMOTE_RULES |
Promote rollout candidate to full production |
Rule lifecycle fields on rule responses:
status:draft,active,paused, orarchivedevaluation_lane:mainorallowlistexecution_order: integer serving order used by main rules; lower values run earliereffective_from: activation timestamp for active versionsapproved_by/approved_at: the user and timestamp recorded for the last promote/resume/auto-promote action. The field names are kept for API compatibility; ezrules does not have a separate approval workflow. Audit endpoints useaction,changed_by,changed, andto_statusfor event timelines.POST /api/v2/rulescreates draft rules.PUT /api/v2/rules/{id}saves edits as draft by default and requires promotion to reactivate.POST /api/v2/rules/{id}/pausemoves an active rule out of live production evaluation without archiving it.POST /api/v2/rules/{id}/resumereturns a paused rule toactiveand records fresh activation metadata.- Editing a paused rule keeps it paused; it does not silently reactivate.
- If runtime setting
auto_promote_active_rule_updatesis enabled for the caller's org, editing an already active rule keeps it active and updates production immediately, but the caller still needsPROMOTE_RULES. POST /api/v2/rules/{id}/rollbackrestores the selected historical revision's logic and description into a brand new draft version, preserving the full revision chain.- Rule audit entries (
GET /api/v2/audit/rules*) are event-log records. They includeaction(updated,reordered,promoted,paused,resumed,deactivated,rolled_back,deleted),changed_by,changed,execution_order, andto_statusto show lifecycle transitions such asdraft -> activeoractive -> paused; they do not exposeapproved_byorapproved_at. - Deleting a rule preserves its history so
GET /api/v2/audit/rules/{rule_id}remains available after deletion. - Rules with an active shadow deployment or rollout cannot be edited, paused, archived, deleted, directly promoted, resumed, or rolled back until the candidate deployment is removed or promoted.
- Allowlist rules are first-class production rules. They cannot be deployed to shadow or rollout.
POST /api/v2/rules/verify response fields:
valid:truewhen the rule compiles successfully;falsewhen syntax or referenced-list validation fails.params: extracted$fieldreferences used for JSON prefill and unseen-field warnings.warnings: advisory messages for referenced fields that have not yet been observed in traffic or rule-test payloads.referenced_lists: detected@user_listnames, even when validation fails.errors: structured validation failures withmessage,line,column,end_line, andend_column.
POST /api/v2/rules/ai/draft request fields:
prompt: natural-language rule request from the analyst.evaluation_lane:mainorallowlist.mode:createoredit; controls the required permission.current_logic/current_description: optional existing rule context, typically sent from edit mode.rule_id: optional current rule id for edit-mode audit attribution.
POST /api/v2/rules/ai/draft response fields:
generation_id: identifier for the generated draft, used when the UI later records explicit draft application.draft_logic: generated ezrules source.line_explanations: explanation objects withline_number,source, andexplanation.validation: the same structured validation shape returned byPOST /api/v2/rules/verify.repair_attempted: whether automatic repair was attempted after the initial generation.applyable:trueonly when the generated draft passed validation after bounded repair attempts.provider: configured AI backend provider name.
| Method | Path | Auth | Notes |
|---|---|---|---|
GET |
/api/v2/shadow |
Bearer + VIEW_RULES |
Current shadow config (rules + version) |
GET |
/api/v2/shadow/results |
Bearer + VIEW_RULES |
Recent shadow evaluation results (?limit=50) |
GET |
/api/v2/shadow/stats |
Bearer + VIEW_RULES |
Per-rule shadow vs production outcome comparison |
| Method | Path | Auth | Notes |
|---|---|---|---|
GET |
/api/v2/rollouts |
Bearer + VIEW_RULES |
Current rollout config (rules + traffic percent + version) |
GET |
/api/v2/rollouts/results |
Bearer + VIEW_RULES |
Recent rollout comparison records (?limit=50) |
GET |
/api/v2/rollouts/stats |
Bearer + VIEW_RULES |
Per-rule candidate vs control outcomes plus served split counts |
| Method | Path | Auth | Notes |
|---|---|---|---|
GET |
/api/v2/tested-events |
Bearer + VIEW_RULES |
Recent stored event evaluations with uploaded label_name, transaction lifecycle timestamps (first_effective_at, first_observed_at), raw payload, and triggered rules (?limit=50). Add include_referenced_fields=true to include each rule's referenced top-level fields. |
| Method | Path | Auth | Notes |
|---|---|---|---|
GET |
/api/v2/outcomes |
Bearer + permission | List allowed outcomes in severity order for the caller's org |
POST |
/api/v2/outcomes |
Bearer + permission | Create allowed outcome in the caller's org |
DELETE |
/api/v2/outcomes/{outcome_name} |
Bearer + permission | Delete outcome from the caller's org |
| Method | Path | Auth | Notes |
|---|---|---|---|
GET |
/api/v2/labels |
Bearer + permission | List labels in the caller's org |
POST |
/api/v2/labels |
Bearer + permission | Create label in the caller's org |
POST |
/api/v2/labels/bulk |
Bearer + permission | Create labels in bulk in the caller's org |
POST |
/api/v2/labels/mark-event |
Bearer + permission | Mark a canonical served transaction version in the caller's org; omitting event_version labels the current served version for that transaction_id |
POST |
/api/v2/labels/upload |
Bearer + permission | CSV upload for canonical served transaction versions in the caller's org (transaction_id,label_name or transaction_id,event_version,label_name) with row-level success/error reporting |
DELETE |
/api/v2/labels/{label_name} |
Bearer + permission | Delete label from the caller's org |
| Method | Path | Auth | Notes |
|---|---|---|---|
GET |
/api/v2/analytics/transaction-volume |
Bearer + permission | Time-series served-decision volume from the canonical evaluation ledger |
GET |
/api/v2/analytics/outcomes-distribution |
Bearer + permission | Served outcome trends from canonical per-rule evaluation results |
GET |
/api/v2/analytics/rules/{rule_id}/outcomes-distribution |
Bearer + VIEW_RULES |
Per-rule served outcome hit trends for the caller's org |
GET |
/api/v2/analytics/rule-activity |
Bearer + VIEW_RULES |
Most/least firing active rules for the caller's org; counts canonical served non-null outcomes and includes zero-hit active rules in the least-firing ranking |
GET |
/api/v2/analytics/labels-summary |
Bearer + permission | Total labeled summary for the caller's org |
GET |
/api/v2/analytics/labels-distribution |
Bearer + permission | Label trends for the caller's org |
GET |
/api/v2/analytics/labeled-transaction-volume |
Bearer + permission | Time-series labeled event volume for the caller's org |
GET |
/api/v2/analytics/rule-quality |
Bearer + VIEW_RULES + VIEW_LABELS |
Synchronous snapshot precision/recall report for configured curated pairs (includes freeze_at) |
POST |
/api/v2/analytics/rule-quality/reports |
Bearer + VIEW_RULES + VIEW_LABELS |
Return existing snapshot by filters, or generate a new one only when force_refresh=true |
GET |
/api/v2/analytics/rule-quality/reports/{report_id} |
Bearer + VIEW_RULES + VIEW_LABELS |
Poll async report status/result |
Rule quality query params:
min_support(default1)lookback_days(optional; defaults to runtime setting)force_refreshon report requests:falsereturns existing snapshot only,trueenqueues a new snapshotfreeze_atis returned in responses to indicate snapshot timestamp- Reports include only active curated pairs configured under Settings.
Rule activity query params:
aggregation(default6h; valid values1h,6h,12h,24h,30d)limit(default5; maximum rules returned per ranking)
Per-rule outcome distribution query params:
aggregation(default6h; valid values1h,6h,12h,24h,30d)rule_idpath param must resolve to a rule in the caller's organisation or the endpoint returns404
Dashboard analytics source of truth:
- Transaction volume, outcome distribution, rule activity, and per-rule outcome distribution use served
evaluation_decisionsjoined toevaluation_rule_results. - Time buckets are anchored on
evaluation_decisions.evaluated_at, so charts show when a decision was served rather than the event's business timestamp. - Label analytics and rule-quality endpoints use canonical
event_version_labelsjoined to served decisions and event labels; label chart buckets are anchored on served decision time.
| Method | Path | Auth | Notes |
|---|---|---|---|
GET |
/api/v2/alerts/rules |
Bearer + VIEW_ALERTS |
List outcome-threshold alert rules for the caller's org |
POST |
/api/v2/alerts/rules |
Bearer + MANAGE_ALERTS |
Create an alert rule such as CANCEL > 50 in a rolling window |
PATCH |
/api/v2/alerts/rules/{rule_id} |
Bearer + MANAGE_ALERTS |
Update an alert rule's threshold, window, cooldown, outcome, or enabled state |
GET |
/api/v2/alerts/incidents |
Bearer + VIEW_ALERTS |
List recent alert incidents for the caller's org |
POST |
/api/v2/alerts/incidents/{incident_id}/acknowledge |
Bearer + VIEW_ALERTS |
Acknowledge an open incident |
GET |
/api/v2/notifications |
Bearer + VIEW_ALERTS |
List in-app notifications with per-user read state |
GET |
/api/v2/notifications/unread-count |
Bearer + VIEW_ALERTS |
Return the caller's unread notification count |
POST |
/api/v2/notifications/{notification_id}/read |
Bearer + VIEW_ALERTS |
Mark one in-app notification as read for the caller |
POST |
/api/v2/notifications/read-all |
Bearer + VIEW_ALERTS |
Mark all visible in-app notifications as read for the caller |
Alert detection source of truth:
- Alert rules count canonical served
evaluation_decisionsbyresolved_outcome. - Evaluation-time detection is queued after the served decision is persisted; Celery beat also sweeps enabled alert rules as a repair loop.
- V1 delivers via the in-app notification channel. Notification channel and policy tables are intentionally separate so email, Slack, PagerDuty, and webhook channels can be added later.
| Method | Path | Auth | Notes |
|---|---|---|---|
GET |
/api/v2/settings/runtime |
Bearer + VIEW_ROLES |
Read runtime settings |
PUT |
/api/v2/settings/runtime |
Bearer + field-specific permission | Update runtime settings. MANAGE_PERMISSIONS covers general runtime settings; MANAGE_NEUTRAL_OUTCOME is required when changing neutral_outcome. |
GET |
/api/v2/settings/ai-authoring |
Bearer + VIEW_ROLES |
Read AI authoring provider settings for the caller's org |
PUT |
/api/v2/settings/ai-authoring |
Bearer + MANAGE_PERMISSIONS |
Update AI authoring provider/model/key settings for the caller's org |
GET |
/api/v2/settings/outcome-hierarchy |
Bearer + VIEW_ROLES |
Read ordered outcome severity hierarchy |
PUT |
/api/v2/settings/outcome-hierarchy |
Bearer + MANAGE_PERMISSIONS |
Replace ordered outcome severity hierarchy |
GET |
/api/v2/settings/rule-quality-pairs |
Bearer + VIEW_ROLES |
List configured curated outcome→label pairs |
GET |
/api/v2/settings/rule-quality-pairs/options |
Bearer + VIEW_ROLES |
List available outcomes and labels for pair creation in the caller's org |
POST |
/api/v2/settings/rule-quality-pairs |
Bearer + MANAGE_PERMISSIONS |
Create curated pair |
PUT |
/api/v2/settings/rule-quality-pairs/{pair_id} |
Bearer + MANAGE_PERMISSIONS |
Toggle pair active/inactive |
DELETE |
/api/v2/settings/rule-quality-pairs/{pair_id} |
Bearer + MANAGE_PERMISSIONS |
Delete curated pair |
Outcome hierarchy notes:
- Outcome hierarchy is ordered from highest severity to lowest severity.
POST /api/v2/evaluateuses this hierarchy to compute the singleresolved_outcomestored for each event.
Runtime settings notes:
GET /api/v2/settings/runtimereturns both stored values and fallback defaults forrule_quality_lookback_days,auto_promote_active_rule_updates,strict_mode_enabled,main_rule_execution_mode, andneutral_outcome.auto_promote_active_rule_updatesdefaults tofalse.strict_mode_enableddefaults tofalse, is org-scoped, and is guarded byMANAGE_PERMISSIONS.main_rule_execution_modedefaults toall_matchesand can be switched tofirst_matchfor the main rule lane only.neutral_outcomedefaults toRELEASEand must match an existing configured outcome; allowlist rules return it as!RELEASE.- Runtime settings responses also include
invalid_allowlist_rules, a list of existing allowlist rules that no longer comply with the selected neutral outcome. - Neutral-outcome changes are recorded in outcome audit history with action
neutral_outcome_updated. - Strict-mode changes are recorded in dedicated strict-mode audit history with actions
enabledanddisabled. - When
auto_promote_active_rule_updates=true, saving edits to an active rule requires bothMODIFY_RULEandPROMOTE_RULES.
AI authoring settings notes:
- Only
openaiis supported right now. enableddefaults totruefor orgs that have not saved an AI authoring setting.GET /api/v2/settings/ai-authoringreturnsprovider,supported_providers,enabled,model, andapi_key_configured.PUT /api/v2/settings/ai-authoringacceptsprovider,enabled,model, optionalapi_key, andclear_api_key.
| Method | Path | Auth | Notes |
|---|---|---|---|
GET |
/api/v2/users |
Bearer + permission | List users in the caller's org |
GET |
/api/v2/users/{user_id} |
Bearer + permission | Get user details in the caller's org |
POST |
/api/v2/users |
Bearer + permission | Create user in the caller's org |
POST |
/api/v2/users/invite |
Bearer + permission | Invite user into the caller's org and send activation link |
PUT |
/api/v2/users/{user_id} |
Bearer + permission | Update user in the caller's org |
DELETE |
/api/v2/users/{user_id} |
Bearer + permission | Delete user in the caller's org |
POST |
/api/v2/users/{user_id}/roles |
Bearer + permission | Assign role to user in the caller's org (cross-org role IDs return 404) |
DELETE |
/api/v2/users/{user_id}/roles/{role_id} |
Bearer + permission | Remove role from user in the caller's org |
GET |
/api/v2/roles/permissions |
Bearer + permission | List all available permissions |
GET |
/api/v2/roles |
Bearer + permission | List roles in the caller's org |
GET |
/api/v2/roles/{role_id} |
Bearer + permission | Get role details in the caller's org |
POST |
/api/v2/roles |
Bearer + permission | Create role in the caller's org |
PUT |
/api/v2/roles/{role_id} |
Bearer + permission | Update role in the caller's org |
DELETE |
/api/v2/roles/{role_id} |
Bearer + permission | Delete role from the caller's org |
GET |
/api/v2/roles/{role_id}/permissions |
Bearer + permission | Get role permissions in the caller's org |
PUT |
/api/v2/roles/{role_id}/permissions |
Bearer + permission | Update role permissions in the caller's org |
| Method | Path | Auth | Notes |
|---|---|---|---|
GET |
/api/v2/user-lists |
Bearer + permission | List user lists in the caller's org |
GET |
/api/v2/user-lists/{list_id} |
Bearer + permission | Get user list details in the caller's org |
POST |
/api/v2/user-lists |
Bearer + permission | Create user list in the caller's org |
PUT |
/api/v2/user-lists/{list_id} |
Bearer + permission | Update list metadata in the caller's org |
DELETE |
/api/v2/user-lists/{list_id} |
Bearer + permission | Delete list in the caller's org |
GET |
/api/v2/user-lists/{list_id}/entries |
Bearer + permission | Get list entries in the caller's org |
POST |
/api/v2/user-lists/{list_id}/entries |
Bearer + permission | Add one entry in the caller's org |
POST |
/api/v2/user-lists/{list_id}/entries/bulk |
Bearer + permission | Add entries in bulk in the caller's org |
DELETE |
/api/v2/user-lists/{list_id}/entries/{entry_id} |
Bearer + permission | Remove one entry from the caller's org list |
| Method | Path | Auth | Notes |
|---|---|---|---|
GET |
/api/v2/field-types |
Bearer + permission | List all configured field types for the caller's org |
GET |
/api/v2/field-types/observations |
Bearer + permission | List auto-discovered field observations for the caller's org |
POST |
/api/v2/field-types |
Bearer + permission | Create or update a field type config (upsert) in the caller's org, including required |
PUT |
/api/v2/field-types/{field_name} |
Bearer + permission | Update type, required, or datetime format for existing config in the caller's org |
DELETE |
/api/v2/field-types/{field_name} |
Bearer + permission | Delete a field type config from the caller's org |
Field type config note:
- Config payloads now include
required: bool. Whenrequired=true, live evaluation rejects events where that field is missing ornull.
| Method | Path | Auth | Notes |
|---|---|---|---|
GET |
/api/v2/features |
Bearer + VIEW_FEATURES |
List computed feature definitions for the caller's org |
POST |
/api/v2/features |
Bearer + MODIFY_FEATURES |
Create a draft feature definition |
PUT |
/api/v2/features/{feature_id} |
Bearer + MODIFY_FEATURES |
Update an unused or non-active feature definition |
POST |
/api/v2/features/{feature_id}/activate |
Bearer + MODIFY_FEATURES |
Activate a feature so rules can reference stat[entity.feature_name] |
POST |
/api/v2/features/{feature_id}/deprecate |
Bearer + MODIFY_FEATURES |
Deprecate an active feature |
DELETE |
/api/v2/features/{feature_id} |
Bearer + DELETE_FEATURE |
Delete a feature only when no rules reference it |
POST |
/api/v2/features/{feature_id}/preview |
Bearer + VIEW_FEATURES |
Compute the feature for a supplied event and as-of timestamp |
GET |
/api/v2/features/{feature_id}/dependencies |
Bearer + VIEW_FEATURES |
List rules that reference the feature |
Feature definition notes:
aggregation_typesupportscount,count_distinct,sum,avg,min,max,stddev, anddays_since_first_seen.window_secondsmust use a preset online window:600,3600,86400,604800,2592000, or7776000.- Rule logic references active features with
stat[entity.feature_name]; raw payload fields continue to use$field.
| Method | Path | Auth | Notes |
|---|---|---|---|
GET |
/api/v2/audit |
Bearer + permission | Summary for the caller's org |
GET |
/api/v2/audit/rules |
Bearer + permission | Rule event history (limit, offset, filters) with action, actor, timestamp, and status transition |
GET |
/api/v2/audit/rules/{rule_id} |
Bearer + permission | Full event history for one rule |
GET |
/api/v2/audit/config |
Bearer + permission | Config history (limit, offset, filters) |
GET |
/api/v2/audit/user-lists |
Bearer + permission | User-list history |
GET |
/api/v2/audit/outcomes |
Bearer + permission | Outcome history |
GET |
/api/v2/audit/labels |
Bearer + permission | Label history for the caller's org, including manual/CSV assignment details |
GET |
/api/v2/audit/users |
Bearer + permission | User-account history for the caller's org (limit, offset, filters) |
GET |
/api/v2/audit/roles |
Bearer + permission | Role/permission history for the caller's org (limit, offset, filters) |
GET |
/api/v2/audit/field-types |
Bearer + permission | Field type config history (limit, offset, field_name filter) |
GET |
/api/v2/audit/features |
Bearer + permission | Feature definition history (limit, offset, fd_id filter) |
GET |
/api/v2/audit/api-keys |
Bearer + permission | API key create/revoke history for the caller's org (limit, offset, filters) |
GET |
/api/v2/audit/ai-rule-authoring |
Bearer + permission | AI rule draft generation/application history for the caller's org (limit, offset, filters) |
GET |
/api/v2/audit/strict-mode |
Bearer + permission | Strict mode enable/disable history for the caller's org (limit, offset, filters) |
| Method | Path | Auth | Notes |
|---|---|---|---|
POST |
/api/v2/backtesting |
Bearer + permission | Trigger async backtest for a rule in the caller's org |
DELETE |
/api/v2/backtesting/{task_id} |
Bearer + permission | Cancel a queued or running backtest task and persist it as cancelled |
POST |
/api/v2/backtesting/{task_id}/retry |
Bearer + permission | Retry a failed/cancelled backtest using the stored logic snapshot |
GET |
/api/v2/backtesting/task/{task_id} |
Bearer + permission | Task status/result, including outcome counts/rates, eligible_records, skipped_records, warnings, plus label counts and quality metrics for labeled history |
GET |
/api/v2/backtesting/{rule_id} |
Bearer + permission | Backtest history for a rule visible to the caller's org |
Backtest task result note:
GET /api/v2/backtesting/task/{task_id}now returns both the legacy terminalstatus(PENDING,SUCCESS,FAILURE,CANCELLED) and a persistedqueue_status(pending,running,done,failed,cancelled) so UI clients can distinguish queued work from active execution.- Backtest history rows now persist
queue_status,completed_at, and the full result payload inresult_metrics, so completed jobs remain inspectable even after Celery result-backend entries age out. GET /api/v2/backtesting/task/{task_id}returns raw outcome counts/rates over the eligible comparison subset used by both stored and proposed logic.- Results now include
eligible_records,skipped_records, andwarningswhen historical records were excluded because a referenced field was missing/null or live normalization rules would have rejected the event. - When labeled historical events exist, it also returns
labeled_records,label_counts, and stored/proposed outcome→label quality summaries and pair metrics (precision,recall,f1,true_positive,false_positive,false_negative). - Backtest workers derive organisation context from the selected rule/request rather than a fixed app-wide org setting.
| Method | Path | Auth | Notes |
|---|---|---|---|
POST |
/api/v2/api-keys |
Bearer + MANAGE_API_KEYS |
Create API key (raw key returned once) |
GET |
/api/v2/api-keys |
Bearer + MANAGE_API_KEYS |
List active API keys (no raw key) |
DELETE |
/api/v2/api-keys/{gid} |
Bearer + MANAGE_API_KEYS |
Revoke API key |
| Method | Path | Auth | Notes |
|---|---|---|---|
POST |
/api/v2/evaluate |
API key or Bearer | Evaluate one event against active rules |
Evaluator storage note:
POST /api/v2/evaluatepersists append-only event versions, immutable served decisions, current transaction projections with first/current lifecycle timestamps, and per-rule results. Served decisions can then be reviewed viaGET /api/v2/tested-events.- Each non-duplicate response includes
event_version,event_version_id, andevaluation_id; exact duplicates return the original identifiers withevaluation_status=duplicate. - If required-field validation or strict rule lookup fails, the request returns
400and nothing is persisted.
- JSON endpoints use
application/json - CSV upload endpoint uses
multipart/form-data - Analytics
aggregationmust be one of:1h,6h,12h,24h,30d - Audit endpoints support pagination via
limitandoffset - Validation errors use HTTP
422withdetail
--8<-- "snippets/openapi-links.md"