Response Shape

The 200 envelope, field by field — answer, chart, follow-ups and the cost breakdown.

A 200 returns the reading plus a complete usage and cost breakdown. Billing and usage are nested under metadata.

#Response envelope

{
  "answer": "Based on your chart, the 10th house lord ...",
  "response": "…(same as answer)…",
  "birthChart": { "...": "computed chart" },
  "conversationId": "1a8cee6b-…",
  "followUps": ["…"],
  "metadata": {
    "cost": { "costUsd": 0.0253, "currency": "USD" },
    "usage": { "input_tokens": 12084, "output_tokens": 291,
                "cached_tokens": 0, "total_tokens": 12375 },
    "creditsUsed": 0.0253,
    "creditsRemaining": 49.97,
    "speed": "standard",
    "language": "en"
  },
  "success": true
}

#Field reference

answer / response
The reading, in the requested or detected language (both carry the same text).
birthChart
The computed chart the reading is grounded in — your citation surface (see Grounding).
conversationId
Echo it on the next request for multi-turn memory.
followUps
Suggested next questions you can surface in the UI.
metadata.cost.costUsd
Exact USD deducted from your wallet for this call.
metadata.usage
Token breakdown, including cached_tokens; reconciles to the charge at the published rates.
metadata.creditsRemaining
Wallet balance after this call.
metadata.speed / language
The tier and language actually used.

#Structured output

With "responseFormat": "json", the body also includes a structuredResponse object built from the reading — convenient when you render fields rather than prose. See Structured Outputs.

Note
A query answered from the cache — or served by a direct chart calculation without calling the reasoning engine — is charged a flat $0.01 and returns usage: {0,0,0}, because no tokens were generated. A short but novel question still reaches the engine and is billed at its tier's normal rate. Either way, metadata.cost.costUsd is always authoritative for what you paid. See Prompt Caching.