Skip to content

Draft text

Settings module

POST/aurora/draftaurora.draft

Drafts an SOP, advance packet, email, day sheet or change order description in the org's verbiage library. Facts the context lacks are marked as gaps, never invented. The draft is returned, not saved or sent. Requires `Idempotency-Key`; a replay returns the original response. A rule that refuses the request returns 422 with `refusal` and `reason`.

  • Requires the capability home.dashboard.read.
  • OAuth scopes: home.
  • Send an Idempotency-Key header. A replay with the same key returns the original response.
  • Error statuses: 400, 401, 409, 422, 429. Errors are RFC 9457 problem details.

Request body: AuroraDraftRequest

aurora.draft: AuroraDraftRequest
FieldTypeRequiredDescription
kind"sop" | "advance_packet" | "email" | "day_sheet" | "change_order_description"YesWhat to draft.
instructionsstringYesWhat the draft should say.Constraints: length 1 to 4000
contextarray of objectNoRecords to draft from, read with the caller's permissions.
verbiagearray of objectNoThe org's verbiage library entries to apply.
{
  "kind": "sop",
  "instructions": "Write the load-in SOP for the main stage.",
  "context": [
    {
      "collection": "venues",
      "id": "0192f1e2-7c3a-7b4d-9e8f-1a2b3c4d5e6f"
    }
  ],
  "verbiage": [
    {
      "term": "loading dock",
      "preferred": "Dock"
    }
  ]
}

Response 200: AuroraResult

aurora.draft: AuroraResult
FieldTypeRequiredDescription
outcome"answer" | "no_answer" | "failed"Yesanswer, no_answer (the data does not support an answer; `missing` says why) or failed (the model call failed and was logged).
ai_generatedtrueYesAlways true: the content is AI-generated and is labeled so (EU AI Act Article 50).
request_idstring (uuid) | nullYesIdentifier of the logged AI request; null when no model was called.
modelstring | nullYesModel that answered.Constraints: length 1 to 100
missingstring | nullYesWhat the data lacks, for no_answer.Constraints: length 1 to 500
failure_codestring | nullYesWhy the request failed.Constraints: length 1 to 64
answerobjectNoThe feature's answer for outcome answer, shaped per operation; null otherwise.
suggestionsarray of AuroraProposalYesChanges stored for confirmation.
{
  "outcome": "answer",
  "ai_generated": true,
  "request_id": "0192f1e2-7c3a-7b4d-9e8f-1a2b3c4d5e6f",
  "model": "claude-sonnet-5-5",
  "missing": "No budget lines exist yet.",
  "failure_code": "model_error",
  "answer": {
    "text": "One permit is blocked: Fire Marshal Permit.",
    "citations": []
  },
  "suggestions": [
    {
      "suggestion_id": "0192f1e2-7c3a-7b4d-9e8f-1a2b3c4d5e6f",
      "operation_id": "savedViews.create",
      "summary": "Save the view Blocked Miami Permits."
    }
  ]
}

Code samples

curl -X POST "$XOS_BASE_URL/aurora/draft" \
  -H "Authorization: Bearer $XOS_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{"kind":"sop","instructions":"Write the load-in SOP for the main stage.","context":[{"collection":"venues","id":"0192f1e2-7c3a-7b4d-9e8f-1a2b3c4d5e6f"}],"verbiage":[{"term":"loading dock","preferred":"Dock"}]}'
const { data } = await xos.aurora.draft({
    "kind": "sop",
    "instructions": "Write the load-in SOP for the main stage.",
    "context": [
      {
        "collection": "venues",
        "id": "0192f1e2-7c3a-7b4d-9e8f-1a2b3c4d5e6f"
      }
    ],
    "verbiage": [
      {
        "term": "loading dock",
        "preferred": "Dock"
      }
    ]
  });
response = xos.aurora.draft({"kind": "sop", "instructions": "Write the load-in SOP for the main stage.", "context": [{"collection": "venues", "id": "0192f1e2-7c3a-7b4d-9e8f-1a2b3c4d5e6f"}], "verbiage": [{"term": "loading dock", "preferred": "Dock"}]})
xos aurora draft --data '{"kind":"sop","instructions":"Write the load-in SOP for the main stage.","context":[{"collection":"venues","id":"0192f1e2-7c3a-7b4d-9e8f-1a2b3c4d5e6f"}],"verbiage":[{"term":"loading dock","preferred":"Dock"}]}'