Gixo API
Try all nine module integrations in the Gixo for Platforms playground, with free deterministic fixtures, downloadable code examples and a Postman collection.
Start, poll, list and export Gixo work from your own systems: Quill articles, Lumen presentations, Arc proposals, Business documents, Lex drafts and Prism visuals. Every call runs as your Gixo account, through the same paths the app uses, so your plan, team workspace and access rules apply exactly as they do in Gixo.
OpenAPI 3 document (import it into Postman, Zapier, Make, n8n, Power Automate or Salesforce External Services): /api/v1/openapi.json
Keys and scopes
API access comes with a Gixo Enterprise plan. Create a key under Settings > Integrations and copy it when it is shown: Gixo stores only a hash of it. Send it on every request:
Authorization: Bearer gixo_live_<prefix>_<secret>
A key holds the scopes you pick when you create it, and reaches nothing else. {product}:read covers GET (status, list, fetch, export); {product}:write covers POST (start work) and includes read. A key works across products, but each call still needs that product's plan on the account: starting work in Lumen needs a Lumen plan.
| Scope | Reaches |
|---|---|
quill:read quill:write | /api/v1/quill/articles |
lumen:read lumen:write | /api/v1/lumen/presentations |
arc:read arc:write | /api/v1/arc/proposals |
business:read business:write | /api/v1/business/documents |
lex:read lex:write | /api/v1/lex/documents, /api/v1/lex/document-kinds |
prism:read prism:write | /api/v1/prism/visuals |
mcp | The Gixo MCP server at /mcp, where each tool applies its own product's plan |
No scope reaches billing, team management, publishing connections or administration. GET /api/v1/account works with any key and reports its scopes and, per product, whether your plan can start new work now.
The flow
Every product has the same shape. Generation is asynchronous:
POST /api/v1/{product}/{collection}starts the work and answers202 Acceptedwith the artifact'sidandstatusUrl, also sent as theLocationheader. (Prism renders immediately and answers201 Createdwith the saved visual.)GETthe status URL every few seconds untilstatusissucceededorfailed. It reportsqueued,processing,progressPercentandstageon the way.- Download it from one of the links in
exports, for exampleGET /api/v1/lumen/presentations/{id}/export/pptx. Add?body=markdownor?body=htmlto the status URL to receive a text artifact inline.
An artifact also reports reviewStatus: what Gixo's automated source review found when it checked the artifact's claims against its sources. succeeded says the artifact was generated; reviewStatus says whether to check it before relying on it.
reviewed: a review covered the artifact and found nothing to check.needs-review: the review found claims a person should check. Open the artifact in Gixo (appUrl) to see them.not-reviewed: no complete review covers the artifact as it stands. The review did not run or could not finish, the artifact is still generating, or it was edited after the review.not-applicable: there is nothing to review. The generation failed, or the product generates no claims of its own (Prism visuals are drawn from your data).
Only reviewed means a review passed. The same field appears in the MCP tools that read a saved Quill draft, an Arc proposal or a Lex document.
curl -X POST https://gixo.ai/api/v1/lumen/presentations \
-H "Authorization: Bearer $GIXO_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: q3-board-review-2026" \
-d '{"brief":"Q3 board update: revenue vs plan, churn, hiring, and the two decisions we need.","purpose":"board","slideCount":14}'
curl https://gixo.ai/api/v1/lumen/presentations/$ID \
-H "Authorization: Bearer $GIXO_API_KEY"
curl -o deck.pptx https://gixo.ai/api/v1/lumen/presentations/$ID/export/pptx \
-H "Authorization: Bearer $GIXO_API_KEY"
Products
| Product | Start (POST body) | Exports |
|---|---|---|
Quill/api/v1/quill/articles | title; optional format (BlogPost, HowToGuide, Listicle, Comparison and the other Quill formats), instructions, keywords, an editorial brief (audience, primaryKeyword, searchIntent, funnelStage, requiredTopics, questionsToAnswer and more), targetWordCount, language, sourcingMode, sourceText, includeImages | pdf, docx, html, markdown |
Lumen/api/v1/lumen/presentations | brief; optional title, purpose (general, pitch, board, sales, training), slideCount (3 to 60), sourceText (the deck then uses only your material) | pptx, pdf |
Arc/api/v1/arc/proposals | title, instructions; optional proposalKind, rfpText (attached as the buyer's RFP), targetWordCount | pdf, docx, html, markdown |
Business/api/v1/business/documents | instruction; optional documentType (brief, recommendation), sourceText, sourceTitle | pdf, docx, html, markdown |
Lex/api/v1/lex/documents | title, kind, parties; optional jurisdiction, governingLaw, term, customRequirements, referenceDocuments, posture, intakeAnswers. List kinds at /api/v1/lex/document-kinds and each kind's intake questions at /api/v1/lex/document-kinds/{kind}/intake. | pdf, docx, html, markdown |
Prism/api/v1/prism/visuals | kind (chart, diagram, flowchart, card), title, render: your data and settings, as the Prism editor takes them. No AI model reads or rewrites your numbers. | svg, png, pdf, pptx (editable), html, csv |
Each collection also lists your artifacts: GET /api/v1/{product}/{collection}?offset=0&limit=20, newest first, with nextOffset for the next page.
What the API does not do
- Lex drafts only. The API never approves a legal document, delivers it or sends it for signature: a person reviews every Lex draft in Gixo.
- Arc drafts stay in Gixo. The API never sends a proposal to a buyer.
- The Business API produces Business documents. An instruction that would make a deck, proposal or visual is refused with the path of that product's API.
- Stanza stories and Folio books are not part of v1.
Retries and idempotency
Send an Idempotency-Key header (up to 255 printable characters) on every POST. Retrying with the same key and the same body returns the first answer, with the same artifact id, instead of starting and paying for a second generation; the replay carries Idempotent-Replayed: true. The same key with a different body is refused with 422 IDEMPOTENCY_KEY_REUSED. Keys are remembered for 24 hours per account and product. A refused request (plan, validation) is not remembered, so you can retry it with the same key once the cause is fixed.
Errors
Every refusal has the same shape:
{ "error": "InvalidRequest", "message": "'deck' is not a deck purpose.", "code": "INVALID_REQUEST", "validValues": ["general", "pitch", "board", "sales", "training"] }
| Status | Code | Meaning |
|---|---|---|
| 400 | INVALID_REQUEST | The request is malformed or names something that is not valid; validValues lists the options when there are some. |
| 401 | INVALID_API_KEY, AUTH_REQUIRED | No key, or a key that is revoked, expired or belongs to a closed account. |
| 402 | PLAN_REQUIRED | The account's plan for this product cannot start this work now. |
| 403 | API_ACCESS_REQUIRED, API_KEY_SCOPE, SUBSCRIPTION_REQUIRED | The account has no Enterprise plan; the key lacks the scope this route needs; or the account has no plan for this product. |
| 404 | NOT_FOUND | No artifact with that id in this product that the account can open. A missing id and one you cannot open get the same answer. |
| 409 | NOT_READY, IDEMPOTENCY_IN_PROGRESS, CONFLICT | Export requested before the artifact succeeded; a retry arrived while the first request was still being admitted; or the work conflicts with its current state. |
| 422 | INTAKE_INCOMPLETE, IDEMPOTENCY_KEY_REUSED, VERIFICATION_REQUIRED | Lex intake answers are missing (listed in validValues); an Idempotency-Key was reused with a different body; or Business sources need review in Gixo first. |
| 429 | RATE_LIMITED | Too many requests. Back off and retry. |
Keys made before scopes
Keys created before scoped keys were introduced carry no scopes and keep the full access they were issued with. GET /api/v1/account reports them as fullAccess: true. Create a scoped key, move your integration to it, and revoke the old one.