Skip to main content
POST /api/v1/skills/route takes a user’s message and answers with the skills to show the model for it, plus a routing_id that ties the run to that answer. It needs an API key and is on every plan. Every framework’s agent_config() makes these calls for you, so you need this page only to call the API directly. Setup is on Frameworks. What the model receives is on How skills reach the model.

Route a message

An optional X-Decimal-Route-Budget: <seconds> header, up to 30, says how long you’ll wait for the answer.

The answer

GET /api/v1/skills/menu returns the full_menu shape with no message to rank by. When something fell back, the answer adds degraded: true and a reason:

Errors

Errors has the body shape.

Load a skill’s text

It returns name, version, version_id, skill_id, description, body, truncated, total_chars, content_hash and content_hash_matches_body. content_hash names the version: it’s the SHA-256 of the full text. Copy it onto the trace rather than computing your own. This route doesn’t count loads: the limits on a run are the SDK’s.

Raw trace ingest: the manifest handshake

A load reports back through the trace. Without the SDK, that takes three calls:
  1. Register a manifest, once per agent version: POST /api/v1/manifests with manifest_hash (required), agent_name, version_label and components. Keep the manifest_id it returns.
  2. Route the message and put prompt_fragment in your system prompt. Keep the routing_id.
  3. Send the trace with POST /api/v1/traces:
From Python with no framework, decimalai.ingest_raw(payload) posts the same dict.