API-et er det samme som Gradiently-appen bruker, så en nøkkel ser de samme dataene og går gjennom de samme kontrollene som den som opprettet den, ville gjort i appen, begrenset til ett arbeidsområde og til tillatelsene. En nøkkel som kaller et endepunkt ingen av tillatelsene dekker, får 403.
Basis-URL og autentisering
Alle banene nedenfor ligger under https://gradiently.design. Send nøkkelen din som bearer-token med hver forespørsel. Innholdet er JSON med Content-Type: application/json, unntatt ved opplastinger.
curl https://gradiently.design/api/marks/mine \
-H "Authorization: Bearer gr_live_…"- En nøkkel er alltid bundet til arbeidsområdet den ble opprettet i. Du trenger ikke oppgi arbeidsområdet; sender du
X-Workspaceeller?workspace=, må det være nøkkelens eget, ellers feiler forespørselen med 403. - Innholdet i forespørsler kontrolleres strengt: et felt endepunktet ikke kjenner, feiler med 422.
- Svarene er JSON med mindre annet er oppgitt (bilder, omdirigeringer og strømmen fra Designer). Feilmeldinger til API-nøkler er på engelsk.
- En nøkkel opptrer som den som opprettet den. Design og merkevarer den lager, hører til arbeidsområdet; Marks den sikrer seg, innehas av den som opprettet den.
Arbeidsområde
| Metode | Bane | Tillatelse | Hva det gjør |
|---|---|---|---|
| GET | /api/me | workspaces:read og designs:read | Deg, arbeidsområdet til nøkkelen og merkevarene i det. |
| GET | /api/workspaces | workspaces:read | Arbeidsområdet til nøkkelen og rollen din. |
| GET | /api/workspaces/:id | workspaces:read | Ett arbeidsområde. |
| GET | /api/workspaces/:id/members | workspaces:read | Medlemmer med navn, e-post og rolle. |
| GET | /api/workspaces/:id/audit | workspaces:read | Revisjonsloggen til arbeidsområdet. |
| POST | /api/workspaces/:id/invites | members:write | Sender en invitasjon på e-post, gyldig i sju dager. |
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 må bekrefte den samme e-postadressen før invitasjonen godtas.Merkevarer
| Metode | Bane | Tillatelse | Hva det gjør |
|---|---|---|---|
| GET | /api/personalities | designs:read | Merkevarene i arbeidsområdet, som { items }. |
| POST | /api/personalities | personalities:write | Lager en merkevare. |
| PATCH | /api/personalities/:id | personalities:write | Gir en merkevare nytt navn, eller angir Marken, profilen eller stilen. |
| DELETE | /api/personalities/:id | personalities:write | Sletter en merkevare og designene dens. Et arbeidsområde beholder alltid minst én. |
| GET | /api/personalities/:id/designs | designs:read | Designene til en merkevare, nyeste først. |
| GET | /api/personalities/:id/brand | designs:read | Skriftene, logoene og de lagrede fargene til en merkevare. En nøkkel kan lese dem, aldri endre 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 når du lager en merkevare. En profil kan også inneholde audience, uses, keywords, dos, donts, website, handle og fonts.Listen over design tar ?q= for å søke i titler og ?mark= for å filtrere etter Mark. Hvert element har id, personalityId, markId, title, form, thumb, shared og updatedAt, uten dokumentet.
Design
| Metode | Bane | Tillatelse | Hva det gjør |
|---|---|---|---|
| POST | /api/agent/compose | designs:write | Setter opp tekst, remikser en mal eller utfører endringer, og lagrer. |
| POST | /api/designs | designs:write | Lager et design fra et dokument. |
| GET | /api/designs/:id | designs:read | Et design med dokumentet. |
| PATCH | /api/designs/:id | designs:write | Endrer tittelen, dokumentet, Marken eller delingen. |
| DELETE | /api/designs/:id | designs:write | Sletter et design. |
| POST | /api/designs/:id/duplicate | designs:write | Lagrer en kopi ved siden av. |
| GET | /api/designs/:id/thumb | designs:read | Miniatyrbildet. |
| POST | /api/designs/:id/render | designs:read | Gjengir det som PNG eller PDF. |
Den enkleste måten å lage et design fra kode på er POST /api/agent/compose: du beskriver innholdet, og layoutmotoren plasserer det med merkevarens Mark. Det samme endepunktet remikser en mal (template med text, photos, icons, hide) eller redigerer et lagret 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 hva vurderingen fant (marger, kollisjoner, 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; uten den bruker designet merkevarens Mark. Les et design fra GET /api/designs/:id for å se et fullstendig dokument.PATCH /api/designs/:id tar hvilke som helst av title, doc, markId og shared. Settes shared til true, publiseres en visningslenke på /d/:id. Send baseUpdatedAt, den updatedAt du sist leste, for å avvise lagringen med 409 hvis noen har endret 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 teller fra 0; en PDF uten page har alle sidene, hver i størrelsen den har i Studio, og forespørselen må stemme med den. Regn med opptil tre minutter.Gjengivelse krever den samme eksportlisensen for designets Mark som Studio; uten den er svaret 402. Gjengivelsen publiserer aldri designet og lagrer ingen fil.
Opplastinger
| Metode | Bane | Tillatelse | Hva det gjør |
|---|---|---|---|
| POST | /api/uploads | designs:write | Laster opp et bilde til design. |
| GET | /api/uploads | designs:read | Opplastingene i arbeidsområdet, nyeste først. |
| GET | /api/uploads/:id | designs:read | Omdirigerer til bildet. ?w= ber om en bredde. |
| DELETE | /api/uploads/:id | designs:write | Sletter en av opplastingene dine. |
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øyst 8 MB, med en type som stemmer med innholdet. Bruk den returnerte url som bildets src eller som bilde i en mal.Marks
| Metode | Bane | Tillatelse | Hva det gjør |
|---|---|---|---|
| GET | /api/marks | marks:read | Søker i Markedet. |
| GET | /api/marks/:code | marks:read | Én Mark med oppskriften, etter kode eller id. |
| GET | /api/marks/mine | marks:read | Marks som innehas for arbeidsområdet, og utkastene dine i det. |
| POST | /api/agent/mark | marks:read | Bygger eller redigerer en oppskrift og vurderer den. Lagrer ingenting. |
| POST | /api/marks | brand:generate | Lagrer en oppskrift som et Mark-utkast. |
| PATCH | /api/marks/:id | brand:generate | Endrer et utkast du har laget. |
| POST | /api/marks/:code/claim | marks:claim | Sikrer en ledig Mark. |
| POST | /api/marks/:code/buy | marks:claim | Sikrer en Mark som en annen eier har lagt ut. |
GET /api/marks tar q (navn eller kode), tone (dark eller light), material, status (listed, house eller sale) og cursor. Den svarer { "items": [ … ], "nextCursor": "…" } med 24 Marks per 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 lagrer utkastet i den merkevaren. Uten det lagrer en nøkkel utkastet i den første merkevaren i arbeidsområdet, og feiler med 404 hvis det ikke finnes noen. En person kan ha opptil 50 utkast.En Mark sikres for den som opprettet nøkkelen, aldri for arbeidsområdet. Gratis sikringer, og sikringer som dekkes av en sikringskreditt, fullføres med én gang. En sikring som krever betaling, svarer 402 med checkout: true, og buy svarer 409 med checkout: true; fullfør disse i Gradiently, fordi en nøkkel ikke kan betale. buy tar { "priceCents": … }, den oppførte prisen du så, og feiler med 409 hvis den er endret.
Versjoner av Marks
| Metode | Bane | Tillatelse | Hva det gjør |
|---|---|---|---|
| GET | /api/marks/:code/versions | marks:read | Versjoner, nyeste først, som { items, next, canEdit }. |
| GET | /api/marks/:code/versions/:vid | marks:read | Én versjon. |
| POST | /api/marks/:code/versions | brand:generate | Lagrer en versjon: { label, recipe }, begge valgfrie. |
| PATCH | /api/marks/:code/versions/:vid | brand:generate | Gir nytt navn eller stjernemerker: { label, starred }. |
| DELETE | /api/marks/:code/versions/:vid | brand:generate | Sletter en versjon. |
| POST | /api/marks/:code/versions/:vid/restore | brand:generate | Setter versjonen tilbake som utkastet. |
Generering av merkevarer
| Metode | Bane | Tillatelse | Hva det gjør |
|---|---|---|---|
| POST | /api/brand/generate | brand:generate | Returnerer merkevareforslag. Skriver ingenting. |
| POST | /api/brand/adopt | brand:generate | Lager et Mark-utkast, en merkevare og tre startdesign fra ett 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 | Bane | Tillatelse | Hva det gjør |
|---|---|---|---|
| POST | /api/agent | designs:write | Én runde med Designer, strømmet som linjedelt JSON. |
| POST | /api/batches | designs:write | Starter en serie design fra én brief. |
| GET | /api/batches | designs:read | Seriene dine, både de som kjører og nylige. |
| GET | /api/batches/:id | designs:read | Fremdriften til en serie. |
| DELETE | /api/batches/:id | designs:write | Stopper en serie. Design som er tegnet, blir værende. |
| GET | /api/agent/runs?designId= | designs:read | Runder med Designer som fortsatt kjører for et design. |
| DELETE | /api/agent/runs/:id | designs:write | Stopper en runde som kjører. |
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 jevnlig; hvert element får en designId og url når det er lagret. state ender som done, stopped eller failed.Designer bruker arbeidsområdets AI-kreditter. Når saldoen er lavere enn det en runde trenger, svarer /api/agent og /api/batches 402 med code: "credits". Høyst to serier kjører samtidig per person. Verktøyet design under MCP og AI-assistenter leser strømmen fra Designer og lagrer resultatet for deg, noe som er enklere enn å håndtere strømmen selv.
Feil
En feil svarer med en statuskode og et JSON-innhold med en lesbar error-melding. Noen legger til felter, som er nevnt nedenfor. Det eneste unntaket er /api/mcp: et innhold som ikke er gyldig JSON, svarer 400 med et JSON-RPC-feilobjekt i stedet, { "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 nøkkel, en feilformet nøkkel, eller en nøkkel som er tilbakekalt eller der den som opprettet den, ikke lenger er eier eller administrator. |
| 402 | Betaling eller kreditt kreves: en sikring med pris (checkout: true), ingen eksportlisens, eller for få AI-kreditter (code: "credits"). |
| 403 | Nøkkelen mangler en tillatelse, hører til et annet arbeidsområde, eller rollen til den som opprettet den, tillater ikke handlingen. |
| 404 | Elementet finnes ikke, eller nøkkelen kan ikke se det. |
| 409 | En konflikt: elementet er endret siden du leste det, et navn er tatt, eller handlingen krever betaling. |
| 422 | Forespørselen besto ikke valideringen. Meldingen sier hvilket felt og hvorfor. |
| 429 | For mange forespørsler. Vent antallet sekunder i Retry-After, og prøv igjen. |
| 503 | Opptatt eller midlertidig utilgjengelig, for eksempel Designer eller eksport. Respekter Retry-After. |
| 504 | En gjengivelse tok for lang tid. Prøv en mindre størrelse eller én side. |
Forespørselsgrenser
Grensene telles over et glidende vindu på ett minutt med mindre annet er oppgitt. Går du over, svarer API-et 429 med en Retry-After-header i sekunder og et retryAfter-felt i innholdet. Senk tempoet og prøv igjen etter den tiden; ikke prøv igjen med en gang.
| Grense | Tillatt |
|---|---|
| Alle forespørsler med en nøkkel | 120 i minuttet per nøkkel |
| Skriving (POST, PATCH, DELETE) | 90 i minuttet per konto, delt med appen |
| Gjengivelser | 10 i minuttet per konto |
| Nye design og duplikater | 60 i minuttet per konto |
| Opplastinger | 60 i minuttet per konto |
| Sikringer | 20 hvert tiende minutt og 100 i døgnet per konto |
| Invitasjoner | 30 i timen per konto |
Eksport og Designer har også en felles kapasitet. Når den er full, er svaret 503 eller 429 med Retry-After, selv om du er under dine egne grenser. Via MCP teller et verktøykall én gang for MCP-forespørselen og én gang for hver API-forespørsel verktøyet gjør.
Paginering
Lister returnerer én side om gangen. Be om neste side med ?cursor=.
- Søk i Markedet (
/api/marks): 24 per side. Send mednextCursorfra svaret; den er null på siste side. - Versjoner av Marks: send med verdien
nextfra svaret; den er null på siste side. - Designene til en merkevare: 100 per side, nyeste først. Send med
idfor det siste designet du fikk. - Opplastinger: 60 per side, nyeste først. Send med
idfor den siste opplastingen. - Merkevarer, arbeidsområder, medlemmer og revisjonsloggen: 100 per side. Send med
idfor det siste elementet (userIdfor medlemmer). Merkevarer listes fra/api/personalitiessom{ items }.
Nøkler, tillatelser og rotasjon finner du under API-nøkler og tillatelser. Mangler det et endepunkt du trenger, kan du si fra til oss.

