/v1/systemone reference: noul, choice and score explained
Strike exposes one endpoint for typed decisions, designed to be compatible with the Jev /v1/systemone request shape. This page covers everything you need to make a request and read the answer.
Preview: Strike's API currently runs in mock mode. Requests are validated as described here, and answers are placeholders.
Endpoint
POST https://api.strike-ai.eu/v1/systemone
Authorization: Bearer <STRIKE_API_KEY>
Content-Type: application/json
Request body
| Field | Type | Required | Description |
|---|---|---|---|
| model | string | yes | "strike-1" |
| state | string, object or array | yes | The content to evaluate: text, a record, a chat log… |
| questions | map of name → question | yes | The questions to answer. You choose each name, and answers come back under the same names. |
Every question has a type and instructions, and most also have criteria. instructions can be a string, or an object that holds the question plus data it refers to. Refer to fields by name in backticks, such as `ticket`.
noul: yes/no
Use noul when the answer is yes or no.
"is_urgent": {
"type": "noul",
"instructions": "Does the customer express time pressure?",
"criteria": {
"true": "An explicit deadline, or the service is blocked",
"false": "No time pressure expressed"
}
}
criteria is optional and describes what yes and no mean.
Answer:
"is_urgent": { "type": "noul", "noul": 0.9 }
noul is a value from 0 (no) to 1 (yes).
choice: one option from a set
Use choice for classification, routing and picking from a list.
"team": {
"type": "choice",
"instructions": "Which team should handle this ticket?",
"criteria": {
"billing": "Payments, refunds, invoices",
"technical": "Bugs, outages, integrations",
"other": null
}
}
criteria is required. It maps each option to a description, or to null if the name says enough.
Answer:
"team": {
"type": "choice",
"choice": "billing",
"probabilities": { "billing": 0.8, "technical": 0.15, "other": 0.05 },
"confidence": 0.7
}
choice: the option with the highest probabilityprobabilities: every option with its probability, summing to 1confidence: a 0–1 summary of how concentrated the distribution is
score: rate along levels
Use score for ordered scales such as severity, sentiment, quality or fit.
"frustration": {
"type": "score",
"instructions": "How frustrated is the customer?",
"criteria": ["Calm", "Frustrated", "Very angry"]
}
criteria is an ordered list of levels, from lowest to highest. Use at least two.
Answer:
"frustration": {
"type": "score",
"score": 1.1,
"legend": { "0": "Calm", "1": "Frustrated", "2": "Very angry" },
"probabilities": { "0": 0.1, "1": 0.7, "2": 0.2 },
"confidence": 0.5
}
score: the probability-weighted level. It can land between levels.legend: maps each level index back to its descriptionprobabilities: the probability of each level
(All values on this page are illustrative.)
A complete request
curl https://api.strike-ai.eu/v1/systemone \
-H "Authorization: Bearer $STRIKE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "strike-1",
"state": {
"ticket": {
"subject": "Charged twice",
"body": "My card was debited twice for order 1042. Please refund one."
}
},
"questions": {
"team": {
"type": "choice",
"instructions": "Which team should handle `ticket`?",
"criteria": { "billing": "Payments, refunds", "technical": "Bugs, outages", "other": null }
},
"is_urgent": { "type": "noul", "instructions": "Does `ticket` express time pressure?" },
"frustration": {
"type": "score",
"instructions": "How frustrated is the author of `ticket`?",
"criteria": ["Calm", "Frustrated", "Very angry"]
}
}
}'
The response contains model, an answers map keyed by your question names, and usage with token counts.
Python and JavaScript
import os, requests
r = requests.post(
"https://api.strike-ai.eu/v1/systemone",
headers={"Authorization": f"Bearer {os.environ['STRIKE_API_KEY']}"},
json={"model": "strike-1", "state": "…", "questions": {"is_spam": {"type": "noul", "instructions": "Is this spam?"}}},
timeout=30,
)
r.raise_for_status()
print(r.json()["answers"]["is_spam"]["noul"])
const r = await fetch("https://api.strike-ai.eu/v1/systemone", {
method: "POST",
headers: { Authorization: `Bearer ${process.env.STRIKE_API_KEY}`, "Content-Type": "application/json" },
body: JSON.stringify({ model: "strike-1", state: "…", questions: { is_spam: { type: "noul", instructions: "Is this spam?" } } }),
});
const { answers } = await r.json();
console.log(answers.is_spam.noul);
Errors
| Status | Code (typical) | Meaning |
|---|---|---|
| 401 | authentication_error | Missing or invalid API key |
| 422 | validation_error | The request failed validation. The body names the field. |
| 429 | (varies) | Rate limit reached. Retry with exponential backoff. |
| 529 | engine_unavailable or inference_overloaded | Engine not ready or inference failed |
| 404 | not_found | No retained record (e.g. DELETE /v1/retention/{request_id}) |
Validation limits (enforced today): choice requires 2–255 options; score requires 2–10 ordered levels.
To keep a request for debugging, send "options": { "retain": true }. Retained payloads are deleted after 30 days or earlier with DELETE /v1/retention/{request_id}.
Choosing a question type
- Is the answer yes or no? Use
noul. - Is it one label from a set? Use
choice. - Is it a position on an ordered scale? Use
score.
You can mix all three in one request. Each question is answered independently against the same state.