Data Suitability Recipe API
The Data Suitability recipe is a guided flow over the AI Use Case endpoints. Everything it does, from creating the record to exporting an attestation, is available through the API in the same order the recipe follows: create the use case, bind its assets and standard, capture a baseline, move it through certification, generate the attestation, and export it. The recipe's saved progress is itself a resource, the use case's latest recipe run.
Tip
For complete API documentation, including request/response schemas, visit the API docs.
All endpoints use the base URL of your Qualytics deployment (e.g., https://your-instance.qualytics.io/api) and require a Personal API Token. Every call needs the Member role. Reading a use case needs the Viewer team permission on every datastore it binds; changing it needs Author on all of them, and Members can only change records they created; certifying or revoking needs the Manager role plus Editor on all of them, or the Admin role. See Permissions for the full matrix. Responses carry two flags, can_edit and can_certify, that tell you which of these the caller holds.
The Recipe Sequence
1. Create the Use Case
The Model step creates the record. Bindings can be sent at creation or added later.
Endpoint: POST /ai-use-cases
Permission: Author team permission on every datastore in datastore_ids. A record created with no bindings needs Author on at least one datastore anywhere.
| Field | Required | Description |
|---|---|---|
name |
Yes | Unique name, up to 255 characters. |
risk_tier |
No | Free text up to 100 characters. The recipe offers minimal, limited, and high. |
description |
No | What the model decides and who relies on it. |
datastore_ids |
No | The datastores the model reads. |
container_ids |
No | Containers inside the bound datastores. |
quality_check_ids |
No | Checks on the bound assets that pin the standard. Empty means every active check at generation time. |
crontab, timezone |
No | The certification expiry schedule. |
certification_expires_at |
No | A validity date for the certification. |
Example request
curl -X POST "https://your-instance.qualytics.io/api/ai-use-cases" \
-H "Authorization: Bearer YOUR_QUALYTICS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "Retail Credit Scoring v4",
"risk_tier": "high",
"description": "Scores retail credit applications; relied on by underwriting."
}'
Response (200 OK): the use case, with id, certification_state: "Draft", can_edit, and can_certify.
2. Bind Inputs and the Standard
The Inputs and Standard steps update the record. Fields you omit are left unchanged; an explicit null on a list clears it. Containers must belong to a bound datastore, and checks to a bound asset.
Endpoint: PATCH /ai-use-cases/{id}
Permission: Author team permission on every bound datastore, before and after the change; Members must own the record
Example request
curl -X PATCH "https://your-instance.qualytics.io/api/ai-use-cases/31" \
-H "Authorization: Bearer YOUR_QUALYTICS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"datastore_ids": [12, 14],
"container_ids": [145, 146, 201],
"quality_check_ids": [812, 813],
"crontab": "0 6 * * *",
"timezone": "America/New_York"
}'
Response (200 OK): the updated use case.
3. Capture the Baseline
The Baseline step snapshots the bound containers' quality scores, profile identifiers, and row counts. Capturing again replaces the referent and returns the record to Draft.
Endpoint: POST /ai-use-cases/{id}/baseline
Permission: Author team permission on every bound datastore; Members must own the record
Example request
curl -X POST "https://your-instance.qualytics.io/api/ai-use-cases/31/baseline" \
-H "Authorization: Bearer YOUR_QUALYTICS_TOKEN"
Response (200 OK): the use case with its baseline, including captured_at and the container count.
4. Move Through Certification
The Evidence step's transition buttons call one endpoint with the target state. Only the allowed transitions are accepted: Draft to InReview, InReview to Certified or back to Draft, Certified to Revoked, Expired to InReview, and Revoked to Draft. Expired can never be set directly. certification_expires_at is applied only when moving to Certified.
Endpoint: POST /ai-use-cases/{id}/certification
Permission: Certified and Revoked need the Manager role plus Editor on every bound datastore, or Admin. InReview and Draft need Author on every bound datastore, and Members must own the record.
Example requests
Submit for review:
curl -X POST "https://your-instance.qualytics.io/api/ai-use-cases/31/certification" \
-H "Authorization: Bearer YOUR_QUALYTICS_TOKEN" \
-H "Content-Type: application/json" \
-d '{ "state": "InReview" }'
Certify with a validity date:
curl -X POST "https://your-instance.qualytics.io/api/ai-use-cases/31/certification" \
-H "Authorization: Bearer YOUR_QUALYTICS_TOKEN" \
-H "Content-Type: application/json" \
-d '{ "state": "Certified", "certification_expires_at": "2027-09-14T23:59:59.999Z" }'
Response (200 OK): the use case with certification_state, certified_at, certified_by, and certification_expires_at.
5. Generate the Attestation
The Evidence step generates the immutable evidence record. The record must be Certified, a baseline must exist, and the bound containers must not have changed since the baseline.
Endpoint: POST /ai-use-cases/{id}/attestations
Permission: Author team permission on every bound datastore; Members must own the record
Example request
curl -X POST "https://your-instance.qualytics.io/api/ai-use-cases/31/attestations" \
-H "Authorization: Bearer YOUR_QUALYTICS_TOKEN"
Response (200 OK): the attestation, with id, created, supersedes_id, generated_by, and the full content.
6. Export the Attestation
The Complete step downloads the record as JSON or HTML.
Endpoint: GET /ai-use-cases/{id}/attestations/{attestation_id}/export?format=json|html
Permission: Viewer team permission on every bound datastore
Example request
curl -X GET "https://your-instance.qualytics.io/api/ai-use-cases/31/attestations/57/export?format=html" \
-H "Authorization: Bearer YOUR_QUALYTICS_TOKEN" \
-o attestation_31_57.html
Response (200 OK): the file, named attestation_{id}_{attestation_id}.{format}.
Recipe Runs
The recipe's saved progress is stored on the use case as its latest run. Reading it returns null when the record has never been opened in the recipe.
| Endpoint | Purpose | Permission |
|---|---|---|
GET /ai-use-cases/{id}/runs/latest |
The latest run: recipe_key, active_step, state, completed_at. |
Viewer on every bound datastore |
PUT /ai-use-cases/{id}/runs/latest |
Save progress: recipe_key (data-suitability), active_step, state, completed. Updates the open run, or starts a new one when the latest is complete. |
Author on every bound datastore; Members must own the record |
Reading Records and Evidence
| Endpoint | Purpose |
|---|---|
GET /ai-use-cases |
Page through the use cases you can see, with name, certification_state, deactivated, and sort parameters. Each row carries counts of bound datastores, containers, and checks, and the latest run. |
GET /ai-use-cases/{id} |
One use case with its bindings, baseline, latest run, and permission flags. |
GET /ai-use-cases/{id}/history |
Every saved version of the record, with the acting user. |
GET /ai-use-cases/{id}/attestations |
The attestation history, newest first. |
GET /ai-use-cases/{id}/attestations/as-of?date=... |
The attestation that was current on a date. |
GET /ai-use-cases/{id}/attestations/{attestation_id} |
One attestation with its content. |
GET /ai-use-cases/{id}/attestations/{attestation_id}/comparison |
The attestation compared with the current state: movement from baseline to attestation and from attestation to now, per container, plus the check set comparison. |
POST /ai-use-cases/{id}/evaluate |
Re-evaluate expiry, marking a lapsed certification Expired. This is what the expiry schedule calls; it needs the Manager role. |
DELETE /ai-use-cases/{id} |
Delete the record. Same permission as editing. |
All reads need the Viewer team permission on every bound datastore.
Error Responses
| Status Code | Description |
|---|---|
401 Unauthorized |
Missing or invalid API token. |
403 Forbidden |
The caller lacks the team permission on a bound datastore, does not own the record as a Member, or is not a Manager of the bound datastores when certifying. Also returned for bindings to datastores, containers, or checks the caller cannot access. |
404 Not Found |
No use case or attestation exists with the specified ID, or the caller cannot see it. Also returned when no attestation was current on the requested date. |
409 Conflict |
The name is already taken, or the certification transition is not allowed from the current state. |
422 Unprocessable Entity |
Invalid request body, such as a container or check outside the bound scope, an invalid schedule, a baseline with no bound containers, or an attestation requested before certification, before a baseline, or after the scope changed. |
Error response examples
409 Conflict (transition not allowed):
422 Unprocessable Entity (not certified yet):
422 Unprocessable Entity (scope changed):
{ "detail": "Cannot generate an attestation because the asset scope changed after baseline capture" }
403 Forbidden (certifying without the right):
Related
- AI Use Cases: the record, its lifecycle, and what an attestation contains.
- Permissions: the roles, team permissions, and ownership rule behind each call.
- How It Works: how the recipe saves its progress on the record.