Sviluppatori

Riferimento API

Ogni endpoint qui accetta JSON su HTTPS e una chiave API nell’header Authorization. Una chiave funziona in un solo spazio di lavoro e raggiunge solo gli endpoint consentiti dai suoi permessi.

Aggiornata il 1 ottobre 2026

L’API è la stessa che usa l’app di Gradiently, quindi una chiave vede gli stessi dati e supera gli stessi controlli che supererebbe chi l’ha creata nell’app, limitata a un solo spazio di lavoro e ai suoi permessi. Una chiave che chiama un endpoint non coperto da nessuno dei suoi permessi riceve un 403.

URL di base e autenticazione

Tutti i percorsi qui sotto si trovano sotto https://gradiently.design. Invia la tua chiave come token bearer con ogni richiesta. I corpi sono JSON con Content-Type: application/json, tranne i caricamenti.

bash
curl https://gradiently.design/api/marks/mine \
  -H "Authorization: Bearer gr_live_…"
  • Una chiave è sempre legata allo spazio di lavoro in cui è stata creata. Non devi indicare lo spazio di lavoro; se invii X-Workspace o ?workspace=, deve essere quello della chiave, altrimenti la richiesta fallisce con 403.
  • I corpi delle richieste vengono controllati in modo rigoroso: un campo che l’endpoint non conosce fallisce con 422.
  • Le risposte sono JSON salvo dove indicato (immagini, reindirizzamenti e il flusso del Designer). I messaggi di errore per le chiavi API sono in inglese.
  • Una chiave agisce come chi l’ha creata. I design e i brand che crea appartengono allo spazio di lavoro; i Mark che riserva appartengono a chi l’ha creata.

Spazio di lavoro

MetodoPercorsoPermessoCosa fa
GET/api/meworkspaces:read e designs:readTu, lo spazio di lavoro della chiave e i suoi brand.
GET/api/workspacesworkspaces:readLo spazio di lavoro della chiave e il tuo ruolo.
GET/api/workspaces/:idworkspaces:readUn solo spazio di lavoro.
GET/api/workspaces/:id/membersworkspaces:readI membri con nome, email e ruolo.
GET/api/workspaces/:id/auditworkspaces:readIl registro attività dello spazio di lavoro.
POST/api/workspaces/:id/invitesmembers:writeInvia via email un invito valido sette giorni.
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": "…" }]
}
Abbreviato. Nell’API i brand si chiamano personalities.
json
POST /api/workspaces/:id/invites
{ "email": "sam@example.com", "role": "editor" }

{ "id": "…", "expiresInDays": 7 }
role è admin, editor o viewer. La persona deve verificare lo stesso indirizzo email prima di accettare.

Brand

MetodoPercorsoPermessoCosa fa
GET/api/personalitiesdesigns:readI brand dello spazio di lavoro, come { items }.
POST/api/personalitiespersonalities:writeCrea un brand.
PATCH/api/personalities/:idpersonalities:writeRinomina un brand, ne imposta il Mark, il profilo o lo stile.
DELETE/api/personalities/:idpersonalities:writeElimina un brand e i suoi design. Uno spazio di lavoro ne mantiene almeno uno.
GET/api/personalities/:id/designsdesigns:readI design di un brand, dal più recente.
GET/api/personalities/:id/branddesigns:readI font, i loghi e i colori salvati di un brand. Una chiave può leggerli, mai modificarli.
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 alla creazione è facoltativo. Un profilo può contenere anche audience, uses, keywords, dos, donts, website, handle e fonts.

L’elenco dei design accetta ?q= per cercare nei titoli e ?mark= per filtrare per Mark. Ogni elemento ha id, personalityId, markId, title, form, thumb, shared e updatedAt, senza il documento.

Design

MetodoPercorsoPermessoCosa fa
POST/api/agent/composedesigns:writeImpagina i testi, rielabora un modello o applica modifiche, e salva.
POST/api/designsdesigns:writeCrea un design da un documento.
GET/api/designs/:iddesigns:readUn design con il suo documento.
PATCH/api/designs/:iddesigns:writeNe cambia il titolo, il documento, il Mark o la condivisione.
DELETE/api/designs/:iddesigns:writeElimina un design.
POST/api/designs/:id/duplicatedesigns:writeNe salva una copia accanto.
GET/api/designs/:id/thumbdesigns:readLa sua immagine in miniatura.
POST/api/designs/:id/renderdesigns:readLo genera in PNG o PDF.

Il modo più semplice per creare un design da codice è POST /api/agent/compose: descrivi il contenuto e il motore di impaginazione lo posiziona con il Mark del brand. Lo stesso endpoint rielabora un modello (template con text, photos, icons, hide) oppure, con designId e ops, modifica un design salvato.

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 elenca cosa ha trovato la verifica (margini, sovrapposizioni, gerarchia, contrasto).
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 è facoltativo; senza, il design usa il Mark del brand. Leggi un design da GET /api/designs/:id per vedere un documento completo.

PATCH /api/designs/:id accetta uno qualsiasi tra title, doc, markId e shared. Impostare shared a true pubblica un link di visualizzazione su /d/:id. Invia baseUpdatedAt, l’ultimo updatedAt che hai letto, per far rifiutare il salvataggio con 409 se qualcuno ha cambiato il design nel frattempo.

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 }
Larghezza e altezza vanno da 1 a 4096. page parte da 0; un PDF senza page contiene tutte le pagine, ciascuna al suo formato nello Studio, a cui la richiesta deve corrispondere. Prevedi fino a tre minuti.

La generazione richiede la stessa licenza di esportazione per il Mark del design richiesta dallo Studio; senza, la risposta è 402. La generazione non pubblica mai il design né archivia un file.

Caricamenti

MetodoPercorsoPermessoCosa fa
POST/api/uploadsdesigns:writeCarica un’immagine per i design.
GET/api/uploadsdesigns:readI caricamenti dello spazio di lavoro, dal più recente.
GET/api/uploads/:iddesigns:readReindirizza all’immagine. ?w= chiede una larghezza.
DELETE/api/uploads/:iddesigns:writeElimina uno dei tuoi caricamenti.
bash
curl https://gradiently.design/api/uploads \
  -H "Authorization: Bearer $GRADIENTLY_API_KEY" \
  -F "file=@shopfront.jpg;type=image/jpeg"

# { "id": "…", "url": "/api/uploads/…" }
Un solo file nel campo file: PNG, JPEG, WebP, GIF o AVIF, al massimo 8 MB, con un tipo che corrisponde al contenuto. Usa l’url restituito come src di un’immagine o come foto di un modello.

Mark

MetodoPercorsoPermessoCosa fa
GET/api/marksmarks:readCerca nel Mercato.
GET/api/marks/:codemarks:readUn Mark con la sua ricetta, per codice o id.
GET/api/marks/minemarks:readI Mark riservati per lo spazio di lavoro, e le tue bozze al suo interno.
POST/api/agent/markmarks:readCostruisce o modifica una ricetta e la verifica. Non salva nulla.
POST/api/marksbrand:generateSalva una ricetta come Mark in bozza.
PATCH/api/marks/:idbrand:generateModifica una bozza che hai creato.
POST/api/marks/:code/claimmarks:claimRiserva un Mark disponibile.
POST/api/marks/:code/buymarks:claimRiserva un Mark che un altro titolare ha messo in vendita.

GET /api/marks accetta q (nome o codice), tone (dark o light), material, status (listed, house o sale) e cursor. Risponde { "items": [ … ], "nextCursor": "…" } con 24 Mark per pagina. Un Mark ha id, code, name, recipe, status, creator, holder e createdAt.

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

{ "id": "…", "code": "GR·K7Q2·MX", "name": "Night Harbour", "status": "draft", "recipe": { … } }
Ottieni una recipe valida da POST /api/agent/mark con uno spec. personalityId salva la bozza in quel brand. Senza, una chiave salva la bozza nel primo brand del suo spazio di lavoro, e fallisce con 404 se non ce n’è nessuno. Una persona può tenere fino a 50 bozze.

Una riserva viene fatta per chi ha creato la chiave, mai per lo spazio di lavoro. Le riserve gratuite, e quelle coperte da un credito di riserva, si completano subito. Una riserva che richiede un pagamento risponde 402 con checkout: true, e buy risponde 409 con checkout: true; completale in Gradiently, perché una chiave non può pagare. buy accetta { "priceCents": … }, il prezzo di vendita che hai visto, e fallisce con 409 se è cambiato.

Versioni dei Mark

MetodoPercorsoPermessoCosa fa
GET/api/marks/:code/versionsmarks:readLe versioni, dalla più recente, come { items, next, canEdit }.
GET/api/marks/:code/versions/:vidmarks:readUna sola versione.
POST/api/marks/:code/versionsbrand:generateSalva una versione: { label, recipe }, entrambi facoltativi.
PATCH/api/marks/:code/versions/:vidbrand:generateRinomina o segna con una stella: { label, starred }.
DELETE/api/marks/:code/versions/:vidbrand:generateElimina una versione.
POST/api/marks/:code/versions/:vid/restorebrand:generateRipristina la versione come bozza.

Generazione del brand

MetodoPercorsoPermessoCosa fa
POST/api/brand/generatebrand:generateRestituisce proposte di brand. Non scrive nulla.
POST/api/brand/adoptbrand:generateCrea un Mark in bozza, un brand e tre design iniziali da una proposta.
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": [ … ] }
Adotta con esattamente l’input che ha creato la proposta. Il server ricrea le proposte e non si fida mai di una ricetta arrivata dal client.

Il Designer

MetodoPercorsoPermessoCosa fa
POST/api/agentdesigns:writeUn turno del Designer, in streaming come JSON delimitato da a capo.
POST/api/batchesdesigns:writeAvvia una serie di design da un solo brief.
GET/api/batchesdesigns:readLe tue serie, in corso e recenti.
GET/api/batches/:iddesigns:readL’avanzamento di una serie.
DELETE/api/batches/:iddesigns:writeFerma una serie. I design già disegnati restano.
GET/api/agent/runs?designId=designs:readI turni del Designer ancora in corso per un design.
DELETE/api/agent/runs/:iddesigns:writeFerma un turno in corso.
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": "…" }] }
Fino a dodici elementi. Interroga GET /api/batches/:id; ogni elemento riceve un designId e un url una volta salvato. state termina come done, stopped o failed.

Il Designer consuma i crediti IA dello spazio di lavoro. Quando il saldo è inferiore a quanto richiede un turno, /api/agent e /api/batches rispondono 402 con code: "credits". Al massimo due serie per persona vengono eseguite insieme. Lo strumento design in MCP e assistenti IA legge il flusso del Designer e salva il risultato per te, il che è più semplice che gestire il flusso da solo.

Errori

Un errore risponde con un codice di stato e un corpo JSON con un messaggio error leggibile. Alcuni aggiungono campi, indicati qui sotto. L’unica eccezione è /api/mcp: un corpo che non è JSON valido risponde 400 con un oggetto di errore JSON-RPC al suo posto, { "jsonrpc": "2.0", "id": null, "error": { "code": -32700, "message": "Parse error" } }.

json
{ "error": "API key lacks required scope for this endpoint." }
StatoQuando
401Nessuna chiave, una chiave malformata, oppure una chiave revocata o il cui creatore non è più proprietario o amministratore.
402Serve un pagamento o un credito: una riserva a pagamento (checkout: true), nessuna licenza di esportazione, o crediti IA insufficienti (code: "credits").
403Alla chiave manca un permesso, appartiene a un altro spazio di lavoro, oppure il ruolo di chi l’ha creata non consente l’azione.
404L’elemento non esiste o la chiave non può vederlo.
409Un conflitto: l’elemento è cambiato da quando l’hai letto, un nome è già in uso, oppure l’azione richiede il checkout.
422La richiesta non ha superato la validazione. Il messaggio indica quale campo e perché.
429Troppe richieste. Attendi i secondi indicati in Retry-After e riprova.
503Occupato o temporaneamente non disponibile, ad esempio il Designer o le esportazioni. Rispetta Retry-After.
504Una generazione ha richiesto troppo tempo. Prova un formato più piccolo o una sola pagina.

Limiti di frequenza

I limiti si contano su una finestra mobile di un minuto, salvo dove indicato. Superarli dà una risposta 429 con un header Retry-After in secondi e un campo retryAfter nel corpo. Rallenta e riprova dopo quel tempo; non riprovare subito.

LimiteQuota
Ogni richiesta con una chiave120 al minuto per chiave
Scritture (POST, PATCH, DELETE)90 al minuto per account, condivisi con l’app
Generazioni10 al minuto per account
Nuovi design e duplicati60 al minuto per account
Caricamenti60 al minuto per account
Riserve20 ogni dieci minuti e 100 al giorno per account
Inviti30 all’ora per account

Le esportazioni e il Designer hanno anche una capacità condivisa. Quando è piena la risposta è 503 o 429 con Retry-After, anche se sei entro i tuoi limiti. Tramite MCP, una chiamata a uno strumento conta una volta per la richiesta MCP e una volta per ogni richiesta API fatta dallo strumento.

Paginazione

Gli elenchi restituiscono una pagina alla volta. Chiedi la pagina successiva con ?cursor=.

  • Ricerca nel Mercato (/api/marks): 24 per pagina. Passa il nextCursor della risposta; è null nell’ultima pagina.
  • Versioni dei Mark: passa il valore next della risposta; è null nell’ultima pagina.
  • Design di un brand: 100 per pagina, dal più recente. Passa l’id dell’ultimo design ricevuto.
  • Caricamenti: 60 per pagina, dal più recente. Passa l’id dell’ultimo caricamento.
  • Brand, spazi di lavoro, membri e registro attività: 100 per pagina. Passa l’id dell’ultimo elemento (userId per i membri). I brand sono elencati da /api/personalities come { items }.

Chiavi, permessi e rotazione sono in Chiavi API e permessi. Se un endpoint che ti serve non è qui, diccelo.

Ti serve una mano?

Inviaci una richiesta con l’argomento API e MCP, e ti risponderà una persona.

Invia una richiesta