Utvecklare

API-referens

Varje slutpunkt här tar JSON över HTTPS och en API-nyckel i Authorization-huvudet. En nyckel fungerar i en arbetsyta och når bara de slutpunkter som dess behörigheter tillåter.

Uppdaterad 1 oktober 2026

API:t är detsamma som Gradiently-appen använder, så en nyckel ser samma data och går igenom samma kontroller som dess skapare skulle göra i appen, begränsad till en arbetsyta och till sina behörigheter. En nyckel som anropar en slutpunkt som ingen av dess behörigheter täcker får 403.

Bas-URL och autentisering

Alla sökvägar nedan ligger under https://gradiently.design. Skicka din nyckel som bearer-token med varje förfrågan. Förfrågningskroppar är JSON med Content-Type: application/json, utom uppladdningar.

bash
curl https://gradiently.design/api/marks/mine \
  -H "Authorization: Bearer gr_live_…"
  • En nyckel är alltid bunden till den arbetsyta den skapades i. Du behöver inte ange arbetsytan; om du skickar X-Workspace eller ?workspace= måste det vara nyckelns egen, annars misslyckas förfrågan med 403.
  • Förfrågningskroppar kontrolleras strikt: ett fält som slutpunkten inte känner till ger 422.
  • Svaren är JSON om inget annat anges (bilder, omdirigeringar och strömmen från Designer). Felmeddelanden till API-nycklar är på engelska.
  • En nyckel agerar som sin skapare. Designer och varumärken den skapar tillhör arbetsytan; Marks den säkrar innehas av dess skapare.

Arbetsyta

MetodSökvägBehörighetVad den gör
GET/api/meworkspaces:read och designs:readDu, nyckelns arbetsyta och dess varumärken.
GET/api/workspacesworkspaces:readNyckelns arbetsyta och din roll.
GET/api/workspaces/:idworkspaces:readEn arbetsyta.
GET/api/workspaces/:id/membersworkspaces:readMedlemmar med namn, e-post och roll.
GET/api/workspaces/:id/auditworkspaces:readArbetsytans granskningslogg.
POST/api/workspaces/:id/invitesmembers:writeMejlar en inbjudan som gäller i sju dagar.
json
GET /api/me

{
  "viewer": { "id": "…", "name": "Ada Moss", "handle": "ada", "workspaceId": "…" },
  "workspaces": [{ "id": "…", "name": "Hearth", "role": "owner" }],
  "activeWorkspaceId": "…",
  "personalities": [{ "id": "…", "slug": "hearth", "name": "Hearth", "markId": "…" }]
}
Förkortat. Varumärken kallas personalities i API:t.
json
POST /api/workspaces/:id/invites
{ "email": "sam@example.com", "role": "editor" }

{ "id": "…", "expiresInDays": 7 }
role är admin, editor eller viewer. Personen måste verifiera samma e-postadress innan inbjudan accepteras.

Varumärken

MetodSökvägBehörighetVad den gör
GET/api/personalitiesdesigns:readArbetsytans varumärken, som { items }.
POST/api/personalitiespersonalities:writeSkapar ett varumärke.
PATCH/api/personalities/:idpersonalities:writeByter namn på ett varumärke, anger dess Mark, profil eller stil.
DELETE/api/personalities/:idpersonalities:writeRaderar ett varumärke och dess designer. En arbetsyta behåller minst ett.
GET/api/personalities/:id/designsdesigns:readEtt varumärkes designer, den senaste först.
GET/api/personalities/:id/branddesigns:readEtt varumärkes typsnitt, logotyper och sparade färger. En nyckel kan läsa dem, aldrig ändra dem.
json
POST /api/personalities
{ "name": "Hearth Bakery", "markId": "…" }

PATCH /api/personalities/:id
{ "profile": { "about": "A neighbourhood bakery", "voice": "warm, plain" } }

{ "id": "…", "slug": "hearth-bakery", "name": "Hearth Bakery", "markId": "…", "profile": { … } }
markId är valfritt när du skapar. En profil kan också innehålla audience, uses, keywords, dos, donts, website, handle och fonts.

Listan med designer tar ?q= för att söka i titlar och ?mark= för att filtrera efter Mark. Varje post har id, personalityId, markId, title, form, thumb, shared och updatedAt, utan dokumentet.

Designer

MetodSökvägBehörighetVad den gör
POST/api/agent/composedesigns:writeLägger ut text, gör en remix av en mall eller tillämpar ändringar, och sparar.
POST/api/designsdesigns:writeSkapar en design från ett dokument.
GET/api/designs/:iddesigns:readEn design med dess dokument.
PATCH/api/designs/:iddesigns:writeÄndrar dess titel, dokument, Mark eller delning.
DELETE/api/designs/:iddesigns:writeRaderar en design.
POST/api/designs/:id/duplicatedesigns:writeSparar en kopia bredvid den.
GET/api/designs/:id/thumbdesigns:readDess miniatyrbild.
POST/api/designs/:id/renderdesigns:readRenderar den till PNG eller PDF.

Det enklaste sättet att skapa en design från kod är POST /api/agent/compose: du beskriver innehållet och layoutmotorn placerar det med varumärkets Mark. Samma slutpunkt gör en remix av en mall (template med text, photos, icons, hide) eller, med designId och ops, redigerar en sparad design.

json
POST /api/agent/compose
{
  "personalityId": "…",
  "composition": {
    "size": "ig-post",
    "layout": "statement",
    "blocks": [
      { "role": "headline", "text": "Fresh bread from 7am" },
      { "role": "cta", "text": "Visit us" }
    ]
  }
}

{ "id": "…", "url": "/studio/…", "issues": [ … ], "elements": [ … ] }
issues listar vad granskningen hittade (marginaler, kollisioner, hierarki, kontrast).
json
POST /api/designs
{
  "personalityId": "…",
  "form": "blank",
  "title": "Launch post",
  "doc": { "ratio": "custom", "width": 1080, "height": 1350, "shift": [0.5, 0.5, 0.5, 0.5], "elements": [] }
}

{ "id": "…", "personalityId": "…", "markId": null, "title": "Launch post", "form": "blank", "doc": { … }, "updatedAt": "…", "thumb": null, "shared": false }
markId är valfritt; utan det får designen varumärkets Mark. Läs en design från GET /api/designs/:id för att se ett fullständigt dokument.

PATCH /api/designs/:id tar valfria av title, doc, markId och shared. Om du sätter shared till true publiceras en visningslänk på /d/:id. Skicka baseUpdatedAt, det updatedAt du senast läste, så avvisas sparningen med 409 om någon har ändrat designen sedan dess.

json
POST /api/designs/:id/render
{ "width": 1080, "height": 1350, "format": "png", "page": 0 }

{ "id": "…", "data": "iVBORw0KGgo…", "encoding": "base64", "mimeType": "image/png", "width": 1080, "height": 1350, "pages": 1 }
Bredd och höjd är 1 till 4096. page räknas från 0; en PDF utan page innehåller alla sidor, var och en i sin storlek i Studion, som förfrågan måste stämma med. Räkna med upp till tre minuter.

Rendering kräver samma exportlicens för designens Mark som i Studion; utan den blir svaret 402. Renderingen publicerar aldrig designen och sparar ingen fil.

Uppladdningar

MetodSökvägBehörighetVad den gör
POST/api/uploadsdesigns:writeLaddar upp en bild för designer.
GET/api/uploadsdesigns:readArbetsytans uppladdningar, den senaste först.
GET/api/uploads/:iddesigns:readOmdirigerar till bilden. ?w= begär en bredd.
DELETE/api/uploads/:iddesigns:writeRaderar en av dina uppladdningar.
bash
curl https://gradiently.design/api/uploads \
  -H "Authorization: Bearer $GRADIENTLY_API_KEY" \
  -F "file=@shopfront.jpg;type=image/jpeg"

# { "id": "…", "url": "/api/uploads/…" }
En fil i fältet file: PNG, JPEG, WebP, GIF eller AVIF, högst 8 MB, med en typ som stämmer med innehållet. Använd den returnerade url som bildens src eller som foto i en mall.

Marks

MetodSökvägBehörighetVad den gör
GET/api/marksmarks:readSöker på Marknaden.
GET/api/marks/:codemarks:readEn Mark med dess recept, efter kod eller id.
GET/api/marks/minemarks:readMarks som innehas för arbetsytan, och dina utkast i den.
POST/api/agent/markmarks:readBygger eller redigerar ett recept och granskar det. Sparar ingenting.
POST/api/marksbrand:generateSparar ett recept som ett Mark-utkast.
PATCH/api/marks/:idbrand:generateÄndrar ett utkast som du har gjort.
POST/api/marks/:code/claimmarks:claimSäkrar en ledig Mark.
POST/api/marks/:code/buymarks:claimSäkrar en Mark som en annan innehavare har lagt ut.

GET /api/marks tar q (namn eller kod), tone (dark eller light), material, status (listed, house eller sale) och cursor. Den svarar { "items": [ … ], "nextCursor": "…" } med 24 Marks per sida. En Mark har id, code, name, recipe, status, creator, holder och createdAt.

json
POST /api/marks
{ "name": "Night Harbour", "recipe": { … }, "personalityId": "…" }

{ "id": "…", "code": "GR·K7Q2·MX", "name": "Night Harbour", "status": "draft", "recipe": { … } }
Hämta ett giltigt recipe från POST /api/agent/mark med en spec. personalityId sparar utkastet i det varumärket. Utan det sparar en nyckel utkastet i arbetsytans första varumärke, och misslyckas med 404 om det inte finns något. En person kan ha upp till 50 utkast.

En säkring görs åt nyckelns skapare, aldrig åt arbetsytan. Gratis säkringar, och säkringar som täcks av en säkringskredit, slutförs direkt. En säkring som kräver betalning svarar 402 med checkout: true, och buy svarar 409 med checkout: true; slutför dem i Gradiently, eftersom en nyckel inte kan betala. buy tar { "priceCents": … }, det utlagda priset du såg, och misslyckas med 409 om det har ändrats.

Versioner av Marks

MetodSökvägBehörighetVad den gör
GET/api/marks/:code/versionsmarks:readVersioner, den senaste först, som { items, next, canEdit }.
GET/api/marks/:code/versions/:vidmarks:readEn version.
POST/api/marks/:code/versionsbrand:generateSparar en version: { label, recipe }, båda valfria.
PATCH/api/marks/:code/versions/:vidbrand:generateByter namn eller stjärnmärker: { label, starred }.
DELETE/api/marks/:code/versions/:vidbrand:generateRaderar en version.
POST/api/marks/:code/versions/:vid/restorebrand:generateÅterställer versionen som utkast.

Generera varumärken

MetodSökvägBehörighetVad den gör
POST/api/brand/generatebrand:generateReturnerar varumärkesförslag. Skriver ingenting.
POST/api/brand/adoptbrand:generateSkapar ett Mark-utkast, ett varumärke och tre startdesigner från ett förslag.
json
POST /api/brand/generate
{ "name": "Hearth", "description": "A neighbourhood bakery", "tone": ["calm", "warm"], "count": 4 }

[{ "key": "…", "name": "Hearth One", "recipe": { … }, "personality": { "name": "Hearth", "handle": "…" }, "starters": [ … ], "why": "…" }]

POST /api/brand/adopt
{ "input": { "name": "Hearth", "description": "A neighbourhood bakery", "tone": ["calm", "warm"], "count": 4 }, "key": "…" }

{ "mark": { … }, "personality": { … }, "designs": [ … ] }
Anta med exakt samma indata som skapade förslaget. Servern skapar förslagen på nytt och litar aldrig på ett recept från klienten.

Designer

MetodSökvägBehörighetVad den gör
POST/api/agentdesigns:writeEn tur med Designer, strömmad som radavgränsad JSON.
POST/api/batchesdesigns:writeStartar en uppsättning designer från en brief.
GET/api/batchesdesigns:readDina uppsättningar, pågående och nyliga.
GET/api/batches/:iddesigns:readEn uppsättnings förlopp.
DELETE/api/batches/:iddesigns:writeStoppar en uppsättning. Ritade designer finns kvar.
GET/api/agent/runs?designId=designs:readTurer med Designer som fortfarande pågår för en design.
DELETE/api/agent/runs/:iddesigns:writeStoppar en pågående tur.
json
POST /api/batches
{
  "personalityId": "…",
  "see": false,
  "plan": {
    "brief": "Autumn menu launch, Saturday 4 October",
    "items": [
      { "size": "ig-post", "brief": "The announcement" },
      { "size": "ig-story", "brief": "Three new loaves, one line each" }
    ]
  }
}

{ "id": "…", "state": "running", "items": [{ "index": 0, "title": "…", "state": "…" }] }
Upp till tolv poster. Fråga GET /api/batches/:id med jämna mellanrum; varje post får ett designId och en url när den har sparats. state slutar som done, stopped eller failed.

Designer förbrukar arbetsytans AI-krediter. När saldot är lägre än vad en tur kräver svarar /api/agent och /api/batches 402 med code: "credits". Högst två uppsättningar körs samtidigt per person. Verktyget design på MCP och AI-assistenter läser strömmen från Designer och sparar resultatet åt dig, vilket är enklare än att hantera strömmen själv.

Fel

Ett fel svarar med en statuskod och en JSON-kropp med ett läsbart error-meddelande. Vissa lägger till fält, som anges nedan. Det enda undantaget är /api/mcp: en kropp som inte är giltig JSON svarar 400 med ett JSON-RPC-felobjekt i stället, { "jsonrpc": "2.0", "id": null, "error": { "code": -32700, "message": "Parse error" } }.

json
{ "error": "API key lacks required scope for this endpoint." }
StatusNär
401Ingen nyckel, en felformaterad nyckel, eller en nyckel som är återkallad eller vars skapare inte längre är ägare eller admin.
402Betalning eller krediter behövs: en säkring med pris (checkout: true), ingen exportlicens eller för få AI-krediter (code: "credits").
403Nyckeln saknar en behörighet, hör till en annan arbetsyta, eller skaparens roll tillåter inte åtgärden.
404Objektet finns inte eller nyckeln kan inte se det.
409En konflikt: objektet har ändrats sedan du läste det, ett namn är upptaget eller åtgärden kräver kassan.
422Förfrågan klarade inte valideringen. Meddelandet säger vilket fält och varför.
429För många förfrågningar. Vänta det antal sekunder som anges i Retry-After och försök igen.
503Upptaget eller tillfälligt otillgängligt, till exempel Designer eller exporter. Respektera Retry-After.
504En rendering tog för lång tid. Prova en mindre storlek eller en sida.

Hastighetsgränser

Gränserna räknas över ett glidande fönster på en minut om inget annat anges. Den som går över får 429 med ett Retry-After-huvud i sekunder och ett retryAfter-fält i kroppen. Sakta ner och försök igen efter den tiden; försök inte igen direkt.

GränsTilldelning
Varje förfrågan med en nyckel120 per minut och nyckel
Skrivningar (POST, PATCH, DELETE)90 per minut och konto, delat med appen
Renderingar10 per minut och konto
Nya designer och dubbletter60 per minut och konto
Uppladdningar60 per minut och konto
Säkringar20 per tio minuter och 100 per dygn och konto
Inbjudningar30 per timme och konto

Exporter och Designer har också en delad kapacitet. När den är full blir svaret 503 eller 429 med Retry-After, även om du är under dina egna gränser. Via MCP räknas ett verktygsanrop en gång för MCP-förfrågan och en gång för varje API-förfrågan som verktyget gör.

Sidindelning

Listor returnerar en sida i taget. Begär nästa sida med ?cursor=.

  • Sökning på Marknaden (/api/marks): 24 per sida. Skicka nextCursor från svaret; det är null på sista sidan.
  • Versioner av Marks: skicka värdet next från svaret; det är null på sista sidan.
  • Ett varumärkes designer: 100 per sida, den senaste först. Skicka id för den sista designen du fick.
  • Uppladdningar: 60 per sida, den senaste först. Skicka id för den sista uppladdningen.
  • Varumärken, arbetsytor, medlemmar och granskningsloggen: 100 per sida. Skicka id för det sista objektet (userId för medlemmar). Varumärken listas från /api/personalities som { items }.

Nycklar, behörigheter och rotation finns på API-nycklar och behörigheter. Om en slutpunkt du behöver saknas här, hör av dig till oss.

Behöver du hjälp?

Skicka en förfrågan med ämnet API och MCP, så svarar en människa.

Skicka en förfrågan