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.
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-Workspaceeller?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
| Metod | Sökväg | Behörighet | Vad den gör |
|---|---|---|---|
| GET | /api/me | workspaces:read och designs:read | Du, nyckelns arbetsyta och dess varumärken. |
| GET | /api/workspaces | workspaces:read | Nyckelns arbetsyta och din roll. |
| GET | /api/workspaces/:id | workspaces:read | En arbetsyta. |
| GET | /api/workspaces/:id/members | workspaces:read | Medlemmar med namn, e-post och roll. |
| GET | /api/workspaces/:id/audit | workspaces:read | Arbetsytans granskningslogg. |
| POST | /api/workspaces/:id/invites | members:write | Mejlar en inbjudan som gäller i sju dagar. |
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": "…" }]
}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
| Metod | Sökväg | Behörighet | Vad den gör |
|---|---|---|---|
| GET | /api/personalities | designs:read | Arbetsytans varumärken, som { items }. |
| POST | /api/personalities | personalities:write | Skapar ett varumärke. |
| PATCH | /api/personalities/:id | personalities:write | Byter namn på ett varumärke, anger dess Mark, profil eller stil. |
| DELETE | /api/personalities/:id | personalities:write | Raderar ett varumärke och dess designer. En arbetsyta behåller minst ett. |
| GET | /api/personalities/:id/designs | designs:read | Ett varumärkes designer, den senaste först. |
| GET | /api/personalities/:id/brand | designs:read | Ett varumärkes typsnitt, logotyper och sparade färger. En nyckel kan läsa dem, aldrig ändra dem. |
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
| Metod | Sökväg | Behörighet | Vad den gör |
|---|---|---|---|
| POST | /api/agent/compose | designs:write | Lägger ut text, gör en remix av en mall eller tillämpar ändringar, och sparar. |
| POST | /api/designs | designs:write | Skapar en design från ett dokument. |
| GET | /api/designs/:id | designs:read | En design med dess dokument. |
| PATCH | /api/designs/:id | designs:write | Ändrar dess titel, dokument, Mark eller delning. |
| DELETE | /api/designs/:id | designs:write | Raderar en design. |
| POST | /api/designs/:id/duplicate | designs:write | Sparar en kopia bredvid den. |
| GET | /api/designs/:id/thumb | designs:read | Dess miniatyrbild. |
| POST | /api/designs/:id/render | designs:read | Renderar 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.
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).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.
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 }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
| Metod | Sökväg | Behörighet | Vad den gör |
|---|---|---|---|
| POST | /api/uploads | designs:write | Laddar upp en bild för designer. |
| GET | /api/uploads | designs:read | Arbetsytans uppladdningar, den senaste först. |
| GET | /api/uploads/:id | designs:read | Omdirigerar till bilden. ?w= begär en bredd. |
| DELETE | /api/uploads/:id | designs:write | Raderar en av dina uppladdningar. |
curl https://gradiently.design/api/uploads \
-H "Authorization: Bearer $GRADIENTLY_API_KEY" \
-F "file=@shopfront.jpg;type=image/jpeg"
# { "id": "…", "url": "/api/uploads/…" }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
| Metod | Sökväg | Behörighet | Vad den gör |
|---|---|---|---|
| GET | /api/marks | marks:read | Söker på Marknaden. |
| GET | /api/marks/:code | marks:read | En Mark med dess recept, efter kod eller id. |
| GET | /api/marks/mine | marks:read | Marks som innehas för arbetsytan, och dina utkast i den. |
| POST | /api/agent/mark | marks:read | Bygger eller redigerar ett recept och granskar det. Sparar ingenting. |
| POST | /api/marks | brand:generate | Sparar ett recept som ett Mark-utkast. |
| PATCH | /api/marks/:id | brand:generate | Ändrar ett utkast som du har gjort. |
| POST | /api/marks/:code/claim | marks:claim | Säkrar en ledig Mark. |
| POST | /api/marks/:code/buy | marks:claim | Sä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.
POST /api/marks
{ "name": "Night Harbour", "recipe": { … }, "personalityId": "…" }
{ "id": "…", "code": "GR·K7Q2·MX", "name": "Night Harbour", "status": "draft", "recipe": { … } }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
| Metod | Sökväg | Behörighet | Vad den gör |
|---|---|---|---|
| GET | /api/marks/:code/versions | marks:read | Versioner, den senaste först, som { items, next, canEdit }. |
| GET | /api/marks/:code/versions/:vid | marks:read | En version. |
| POST | /api/marks/:code/versions | brand:generate | Sparar en version: { label, recipe }, båda valfria. |
| PATCH | /api/marks/:code/versions/:vid | brand:generate | Byter namn eller stjärnmärker: { label, starred }. |
| DELETE | /api/marks/:code/versions/:vid | brand:generate | Raderar en version. |
| POST | /api/marks/:code/versions/:vid/restore | brand:generate | Återställer versionen som utkast. |
Generera varumärken
| Metod | Sökväg | Behörighet | Vad den gör |
|---|---|---|---|
| POST | /api/brand/generate | brand:generate | Returnerar varumärkesförslag. Skriver ingenting. |
| POST | /api/brand/adopt | brand:generate | Skapar ett Mark-utkast, ett varumärke och tre startdesigner från ett förslag. |
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": [ … ] }Designer
| Metod | Sökväg | Behörighet | Vad den gör |
|---|---|---|---|
| POST | /api/agent | designs:write | En tur med Designer, strömmad som radavgränsad JSON. |
| POST | /api/batches | designs:write | Startar en uppsättning designer från en brief. |
| GET | /api/batches | designs:read | Dina uppsättningar, pågående och nyliga. |
| GET | /api/batches/:id | designs:read | En uppsättnings förlopp. |
| DELETE | /api/batches/:id | designs:write | Stoppar en uppsättning. Ritade designer finns kvar. |
| GET | /api/agent/runs?designId= | designs:read | Turer med Designer som fortfarande pågår för en design. |
| DELETE | /api/agent/runs/:id | designs:write | Stoppar en pågående tur. |
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": "…" }] }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" } }.
{ "error": "API key lacks required scope for this endpoint." }| Status | När |
|---|---|
| 401 | Ingen nyckel, en felformaterad nyckel, eller en nyckel som är återkallad eller vars skapare inte längre är ägare eller admin. |
| 402 | Betalning eller krediter behövs: en säkring med pris (checkout: true), ingen exportlicens eller för få AI-krediter (code: "credits"). |
| 403 | Nyckeln saknar en behörighet, hör till en annan arbetsyta, eller skaparens roll tillåter inte åtgärden. |
| 404 | Objektet finns inte eller nyckeln kan inte se det. |
| 409 | En konflikt: objektet har ändrats sedan du läste det, ett namn är upptaget eller åtgärden kräver kassan. |
| 422 | Förfrågan klarade inte valideringen. Meddelandet säger vilket fält och varför. |
| 429 | För många förfrågningar. Vänta det antal sekunder som anges i Retry-After och försök igen. |
| 503 | Upptaget eller tillfälligt otillgängligt, till exempel Designer eller exporter. Respektera Retry-After. |
| 504 | En 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äns | Tilldelning |
|---|---|
| Varje förfrågan med en nyckel | 120 per minut och nyckel |
| Skrivningar (POST, PATCH, DELETE) | 90 per minut och konto, delat med appen |
| Renderingar | 10 per minut och konto |
| Nya designer och dubbletter | 60 per minut och konto |
| Uppladdningar | 60 per minut och konto |
| Säkringar | 20 per tio minuter och 100 per dygn och konto |
| Inbjudningar | 30 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. SkickanextCursorfrån svaret; det är null på sista sidan. - Versioner av Marks: skicka värdet
nextfrån svaret; det är null på sista sidan. - Ett varumärkes designer: 100 per sida, den senaste först. Skicka
idför den sista designen du fick. - Uppladdningar: 60 per sida, den senaste först. Skicka
idför den sista uppladdningen. - Varumärken, arbetsytor, medlemmar och granskningsloggen: 100 per sida. Skicka
idför det sista objektet (userIdför medlemmar). Varumärken listas från/api/personalitiessom{ 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.

