STRIKE / BLOG

/v1/systemone reference: noul, choice and score explained

How to call Strike's /v1/systemone endpoint: the request shape, the three question types (noul, choice and score), the answer formats and the error codes, with examples.

/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 probability
  • probabilities: every option with its probability, summing to 1
  • confidence: 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 description
  • probabilities: 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.

See also

← All posts · Home