API’en er den samme, som Gradiently-appen bruger, så en nøgle ser de samme data og består de samme tjek, som dens skaber ville i appen, begrænset til ét arbejdsområde og til dens tilladelser. En nøgle, der kalder et endpoint, som ingen af dens tilladelser dækker, får 403.
Basis-URL og godkendelse
Alle stier nedenfor ligger under https://gradiently.design. Send din nøgle som bearer-token med hver forespørgsel. Indhold sendes som JSON med Content-Type: application/json, undtagen uploads.
curl https://gradiently.design/api/marks/mine \
-H "Authorization: Bearer gr_live_…"- En nøgle er altid bundet til det arbejdsområde, den blev oprettet i. Du behøver ikke angive arbejdsområdet; sender du
X-Workspaceeller?workspace=, skal det være nøglens eget, ellers fejler forespørgslen med 403. - Indholdet i forespørgsler tjekkes strengt: et felt, som endpointet ikke kender, fejler med 422.
- Svar er JSON, medmindre andet er angivet (billeder, omdirigeringer og Designers stream). Fejlbeskeder til API-nøgler er på engelsk.
- En nøgle handler som sin skaber. Designs og brands, den laver, hører til arbejdsområdet; Marks, den sikrer sig, ejes af dens skaber.
Arbejdsområde
| Metode | Sti | Tilladelse | Hvad det gør |
|---|---|---|---|
| GET | /api/me | workspaces:read og designs:read | Dig, nøglens arbejdsområde og dets brands. |
| GET | /api/workspaces | workspaces:read | Nøglens arbejdsområde og din rolle. |
| GET | /api/workspaces/:id | workspaces:read | Ét arbejdsområde. |
| GET | /api/workspaces/:id/members | workspaces:read | Medlemmer med navn, e-mail og rolle. |
| GET | /api/workspaces/:id/audit | workspaces:read | Arbejdsområdets revisionslog. |
| POST | /api/workspaces/:id/invites | members:write | Sender en invitation, der gælder i syv dage. |
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 er admin, editor eller viewer. Personen skal bekræfte den samme e-mailadresse, før invitationen kan accepteres.Brands
| Metode | Sti | Tilladelse | Hvad det gør |
|---|---|---|---|
| GET | /api/personalities | designs:read | Arbejdsområdets brands, som { items }. |
| POST | /api/personalities | personalities:write | Opretter et brand. |
| PATCH | /api/personalities/:id | personalities:write | Omdøber et brand, angiver dets Mark, profil eller stil. |
| DELETE | /api/personalities/:id | personalities:write | Sletter et brand og dets designs. Et arbejdsområde beholder mindst ét. |
| GET | /api/personalities/:id/designs | designs:read | Et brands designs, nyeste først. |
| GET | /api/personalities/:id/brand | designs:read | Et brands skrifttyper, logoer og gemte farver. En nøgle kan læse dem, aldrig ændre 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 er valgfri ved oprettelse. En profil kan også indeholde audience, uses, keywords, dos, donts, website, handle og fonts.Listen over designs tager ?q= til at søge i titler og ?mark= til at filtrere efter Mark. Hvert element har id, personalityId, markId, title, form, thumb, shared og updatedAt, uden dokumentet.
Designs
| Metode | Sti | Tilladelse | Hvad det gør |
|---|---|---|---|
| POST | /api/agent/compose | designs:write | Sætter tekst op, remixer en skabelon eller anvender ændringer, og gemmer. |
| POST | /api/designs | designs:write | Opretter et design ud fra et dokument. |
| GET | /api/designs/:id | designs:read | Et design med dets dokument. |
| PATCH | /api/designs/:id | designs:write | Ændrer dets titel, dokument, Mark eller deling. |
| DELETE | /api/designs/:id | designs:write | Sletter et design. |
| POST | /api/designs/:id/duplicate | designs:write | Gemmer en kopi ved siden af. |
| GET | /api/designs/:id/thumb | designs:read | Dets miniaturebillede. |
| POST | /api/designs/:id/render | designs:read | Gengiver det som PNG eller PDF. |
Den nemmeste måde at lave et design fra kode på er POST /api/agent/compose: du beskriver indholdet, og layoutmotoren placerer det med brandets Mark. Samme endpoint remixer en skabelon (template med text, photos, icons, hide) eller redigerer et gemt design med designId og ops.
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 viser, hvad gennemgangen fandt (margener, overlap, 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 er valgfri; uden den bærer designet brandets Mark. Hent et design med GET /api/designs/:id for at se et fuldt dokument.PATCH /api/designs/:id tager en hvilken som helst af title, doc, markId og shared. Sættes shared til true, udgives et visningslink på /d/:id. Send baseUpdatedAt, den updatedAt, du sidst læste, så afvises gemningen med 409, hvis nogen har ændret designet siden.
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 tælles fra 0; en PDF uden page har alle sider, hver i sin størrelse fra Studiet, som forespørgslen skal passe til. Regn med op til tre minutter.Gengivelse kræver samme eksportlicens til designets Mark som i Studiet; uden den er svaret 402. Gengivelsen udgiver aldrig designet og gemmer ingen fil.
Uploads
| Metode | Sti | Tilladelse | Hvad det gør |
|---|---|---|---|
| POST | /api/uploads | designs:write | Uploader et billede til designs. |
| GET | /api/uploads | designs:read | Arbejdsområdets uploads, nyeste først. |
| GET | /api/uploads/:id | designs:read | Omdirigerer til billedet. ?w= beder om en bredde. |
| DELETE | /api/uploads/:id | designs:write | Sletter en af dine uploads. |
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øjst 8 MB, med en type, der passer til indholdet. Brug den returnerede url som billedets src eller som foto i en skabelon.Marks
| Metode | Sti | Tilladelse | Hvad det gør |
|---|---|---|---|
| GET | /api/marks | marks:read | Søger i Markedet. |
| GET | /api/marks/:code | marks:read | Én Mark med dens opskrift, efter kode eller id. |
| GET | /api/marks/mine | marks:read | Marks, der ejes for arbejdsområdet, og dine kladder i det. |
| POST | /api/agent/mark | marks:read | Bygger eller redigerer en opskrift og gennemgår den. Gemmer intet. |
| POST | /api/marks | brand:generate | Gemmer en opskrift som en Mark-kladde. |
| PATCH | /api/marks/:id | brand:generate | Ændrer en kladde, du har lavet. |
| POST | /api/marks/:code/claim | marks:claim | Sikrer en ledig Mark. |
| POST | /api/marks/:code/buy | marks:claim | Sikrer en Mark, som en anden ejer har sat til salg. |
GET /api/marks tager q (navn eller kode), tone (dark eller light), material, status (listed, house eller sale) og cursor. Den svarer { "items": [ … ], "nextCursor": "…" } med 24 Marks pr. side. En Mark har id, code, name, recipe, status, creator, holder og createdAt.
POST /api/marks
{ "name": "Night Harbour", "recipe": { … }, "personalityId": "…" }
{ "id": "…", "code": "GR·K7Q2·MX", "name": "Night Harbour", "status": "draft", "recipe": { … } }recipe fra POST /api/agent/mark med en spec. personalityId gemmer kladden i det brand. Uden det gemmer en nøgle kladden i arbejdsområdets første brand og fejler med 404, hvis der ikke er noget. En person kan have op til 50 kladder.En Mark sikres til nøglens skaber, aldrig til arbejdsområdet. Gratis Marks, og Marks, der er dækket af en kredit til at sikre sig Marks, gennemføres med det samme. Kræver det betaling, svarer kaldet 402 med checkout: true, og buy svarer 409 med checkout: true; gør dem færdige i Gradiently, for en nøgle kan ikke betale. buy tager { "priceCents": … }, den listepris, du så, og fejler med 409, hvis den er ændret.
Mark-versioner
| Metode | Sti | Tilladelse | Hvad det gør |
|---|---|---|---|
| GET | /api/marks/:code/versions | marks:read | Versioner, nyeste først, som { items, next, canEdit }. |
| GET | /api/marks/:code/versions/:vid | marks:read | Én version. |
| POST | /api/marks/:code/versions | brand:generate | Gemmer en version: { label, recipe }, begge valgfri. |
| PATCH | /api/marks/:code/versions/:vid | brand:generate | Omdøber eller stjernemarkerer: { label, starred }. |
| DELETE | /api/marks/:code/versions/:vid | brand:generate | Sletter en version. |
| POST | /api/marks/:code/versions/:vid/restore | brand:generate | Sætter versionen tilbage som kladden. |
Generering af brands
| Metode | Sti | Tilladelse | Hvad det gør |
|---|---|---|---|
| POST | /api/brand/generate | brand:generate | Returnerer brandforslag. Skriver intet. |
| POST | /api/brand/adopt | brand:generate | Opretter en Mark-kladde, et brand og tre startdesigns ud fra ét forslag. |
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
| Metode | Sti | Tilladelse | Hvad det gør |
|---|---|---|---|
| POST | /api/agent | designs:write | Én tur med Designer, streamet som linjeopdelt JSON. |
| POST | /api/batches | designs:write | Starter en serie designs ud fra ét brief. |
| GET | /api/batches | designs:read | Dine serier, kørende og nylige. |
| GET | /api/batches/:id | designs:read | En series fremskridt. |
| DELETE | /api/batches/:id | designs:write | Stopper en serie. Tegnede designs bliver. |
| GET | /api/agent/runs?designId= | designs:read | Ture med Designer, der stadig kører for et design. |
| DELETE | /api/agent/runs/:id | designs:write | Stopper en kørende 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 løbende; hvert element får en designId og url, når det er gemt. state ender som done, stopped eller failed.Designer bruger arbejdsområdets AI-kreditter. Når saldoen er lavere end det, en tur kræver, svarer /api/agent og /api/batches 402 med code: "credits". Højst to serier kører ad gangen pr. person. Værktøjet design på MCP og AI-assistenter læser Designers stream og gemmer resultatet for dig, hvilket er nemmere end selv at håndtere streamen.
Fejl
En fejl svarer med en statuskode og et JSON-indhold med en læselig error-besked. Nogle tilføjer felter, som er nævnt nedenfor. Den eneste undtagelse er /api/mcp: et indhold, der ikke er gyldig JSON, svarer 400 med et JSON-RPC-fejlobjekt i stedet, { "jsonrpc": "2.0", "id": null, "error": { "code": -32700, "message": "Parse error" } }.
{ "error": "API key lacks required scope for this endpoint." }| Status | Hvornår |
|---|---|
| 401 | Ingen nøgle, en forkert formateret nøgle, eller en nøgle, der er tilbagekaldt, eller hvis skaber ikke længere er ejer eller admin. |
| 402 | Der kræves betaling eller kredit: en Mark med pris (checkout: true), ingen eksportlicens eller for få AI-kreditter (code: "credits"). |
| 403 | Nøglen mangler en tilladelse, hører til et andet arbejdsområde, eller dens skabers rolle tillader ikke handlingen. |
| 404 | Elementet findes ikke, eller nøglen kan ikke se det. |
| 409 | En konflikt: elementet er ændret, siden du læste det, et navn er optaget, eller handlingen kræver checkout. |
| 422 | Forespørgslen bestod ikke valideringen. Beskeden siger, hvilket felt og hvorfor. |
| 429 | For mange forespørgsler. Vent det antal sekunder, der står i Retry-After, og prøv igen. |
| 503 | Travlt eller midlertidigt utilgængeligt, fx Designer eller eksport. Respektér Retry-After. |
| 504 | En gengivelse tog for lang tid. Prøv en mindre størrelse eller én side. |
Hastighedsgrænser
Grænser tælles over et glidende vindue på ét minut, medmindre andet er angivet. Går du over, er svaret 429 med en Retry-After-header i sekunder og et retryAfter-felt i indholdet. Sæt farten ned, og prøv igen efter den tid; prøv ikke igen med det samme.
| Grænse | Tilladt |
|---|---|
| Hver forespørgsel med en nøgle | 120 pr. minut pr. nøgle |
| Skrivninger (POST, PATCH, DELETE) | 90 pr. minut pr. konto, delt med appen |
| Gengivelser | 10 pr. minut pr. konto |
| Nye designs og kopier | 60 pr. minut pr. konto |
| Uploads | 60 pr. minut pr. konto |
| Sikrede Marks | 20 hvert tiende minut og 100 pr. dag pr. konto |
| Invitationer | 30 pr. time pr. konto |
Eksport og Designer har også en fælles kapacitet. Når den er fuld, er svaret 503 eller 429 med Retry-After, også selvom du er under dine egne grænser. Via MCP tæller et værktøjskald én gang for MCP-forespørgslen og én gang for hver API-forespørgsel, værktøjet laver.
Sideinddeling
Lister returnerer én side ad gangen. Bed om næste side med ?cursor=.
- Søgning i Markedet (
/api/marks): 24 pr. side. SendnextCursorfra svaret med; den er null på sidste side. - Mark-versioner: send værdien
nextfra svaret med; den er null på sidste side. - Et brands designs: 100 pr. side, nyeste først. Send
idfor det sidste design, du modtog. - Uploads: 60 pr. side, nyeste først. Send
idfor den sidste upload. - Brands, arbejdsområder, medlemmer og revisionsloggen: 100 pr. side. Send
idfor det sidste element (userIdfor medlemmer). Brands vises fra/api/personalitiessom{ items }.
Nøgler, tilladelser og udskiftning står på API-nøgler og tilladelser. Mangler du et endpoint, der ikke står her, så fortæl os det.

