Quickstart
Three steps, about five minutes: a key, a first call to check it works, and a finished document you can open in the Studio.
#Make your first document
Create a key
In the app, open Settings → API and create a key. It's shown once — copy it somewhere safe, then put it in your shell:
Shellexport ATTRIA_API_KEY="attria_sk_…"Check it works
GET /v1/mesays which workspace the key acts as. A200means you're ready.curl "https://app.attria.io/api/v1/me" \ -H "Authorization: Bearer $ATTRIA_API_KEY"const res = await fetch("https://app.attria.io/api/v1/me", { headers: { Authorization: `Bearer ${process.env.ATTRIA_API_KEY}`, }, }); const me = await res.json();import os, requests res = requests.get( "https://app.attria.io/api/v1/me", headers={ "Authorization": f"Bearer {os.environ['ATTRIA_API_KEY']}", }, timeout=30, ) me = res.json()Response200{ "workspace": { "id": "6f1c2a9e-3b7d-4e0a-9c51-2d8e7f4a1b30", "name": "Acme Marketing", "timezone": "Europe/Lisbon" }, "member": { "id": "b0e4d7c2-91a3-4f68-8d25-7c3e1a9f0b44", "role": "owner" }, "key": { "id": "3a9d5e17-c2b8-4f0e-a6d1-94e2b7c8f013", "name": "Claude Code", "prefix": "attria_sk_Ab12Cd", "created_at": "2026-09-27T14:02:11.000Z" } }Ask for a document
Send the Documents director a message with every fact the deck needs — it uses only what you give it and your workspace's brand.
auto: truetells it to decide the rest instead of asking first. The call waits until the deck is written, usually 20 to 60 seconds.curl -X POST "https://app.attria.io/api/v1/studio/document/turns" \ -H "Authorization: Bearer $ATTRIA_API_KEY" \ -H "Content-Type: application/json" \ -H "Idempotency-Key: $(uuidgen)" \ -d '{ "message": "A 10-slide seed pitch deck for Northwind, a B2B freight marketplace. Traction: $412k ARR, +38% QoQ, 3 enterprise logos. Raising $4M.", "auto": true }'const res = await fetch("https://app.attria.io/api/v1/studio/document/turns", { method: "POST", headers: { Authorization: `Bearer ${process.env.ATTRIA_API_KEY}`, "Content-Type": "application/json", "Idempotency-Key": crypto.randomUUID(), }, body: JSON.stringify({ message: "A 10-slide seed pitch deck for Northwind, a B2B freight marketplace. Traction: $412k ARR, +38% QoQ, 3 enterprise logos. Raising $4M.", auto: true, }), }); const turn = await res.json();import os, uuid, requests res = requests.post( "https://app.attria.io/api/v1/studio/document/turns", headers={ "Authorization": f"Bearer {os.environ['ATTRIA_API_KEY']}", "Idempotency-Key": str(uuid.uuid4()), }, json={ "message": "A 10-slide seed pitch deck for Northwind, a B2B freight marketplace. Traction: $412k ARR, +38% QoQ, 3 enterprise logos. Raising $4M.", "auto": True, }, timeout=900, # a turn that waits can take minutes ) turn = res.json()Response200{ "id": "1e0f…", "object": "studio.turn", "status": "completed", "studio": "document", "artifact": { "id": "a3c2…", "type": "document", "name": "Northwind — Seed pitch", "url": "https://app.attria.io/studio/documents/a3c2…", "public_url": null }, "conversation_id": "c81b…", "message": "Here's a 10-slide seed deck for Northwind. I led with traction — it's your strongest proof.", "created_at": "2026-09-27T18:02:11Z", "completed_at": "2026-09-27T18:02:52Z" }Open
artifact.urlto see it in the Studio. It's a normal document in your workspace — share it, or keep shaping it.
#Keep shaping it
A turn is one message in a conversation. To change the deck, send another turn with its artifact_id — like typing the next message in the Studio:
curl -X POST "https://app.attria.io/api/v1/studio/document/turns" \
-H "Authorization: Bearer $ATTRIA_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{
"artifact_id": "a3c2d1e0-5b4a-4c3d-8e2f-1a0b9c8d7e6f",
"message": "Move the traction slide to second, and add a slide on the team."
}'const res = await fetch("https://app.attria.io/api/v1/studio/document/turns", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.ATTRIA_API_KEY}`,
"Content-Type": "application/json",
"Idempotency-Key": crypto.randomUUID(),
},
body: JSON.stringify({
artifact_id: "a3c2d1e0-5b4a-4c3d-8e2f-1a0b9c8d7e6f",
message: "Move the traction slide to second, and add a slide on the team.",
}),
});
const turn = await res.json();import os, uuid, requests
res = requests.post(
"https://app.attria.io/api/v1/studio/document/turns",
headers={
"Authorization": f"Bearer {os.environ['ATTRIA_API_KEY']}",
"Idempotency-Key": str(uuid.uuid4()),
},
json={
"artifact_id": "a3c2d1e0-5b4a-4c3d-8e2f-1a0b9c8d7e6f",
"message": "Move the traction slide to second, and add a slide on the team.",
},
timeout=900, # a turn that waits can take minutes
)
turn = res.json()Leave out auto and the director may answer status: "needs_input" with questions or an outline, as it does in the app. Studio turns shows how to reply.
#Next
- Studio turns — questions, outlines, and each Studio's timing.
- Jobs & streaming — progress events and background work.
- MCP & agents — give Claude or Cursor the whole API.
- API reference — every endpoint.