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.
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-Workspaceo?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
| Metodo | Percorso | Permesso | Cosa fa |
|---|---|---|---|
| GET | /api/me | workspaces:read e designs:read | Tu, lo spazio di lavoro della chiave e i suoi brand. |
| GET | /api/workspaces | workspaces:read | Lo spazio di lavoro della chiave e il tuo ruolo. |
| GET | /api/workspaces/:id | workspaces:read | Un solo spazio di lavoro. |
| GET | /api/workspaces/:id/members | workspaces:read | I membri con nome, email e ruolo. |
| GET | /api/workspaces/:id/audit | workspaces:read | Il registro attività dello spazio di lavoro. |
| POST | /api/workspaces/:id/invites | members:write | Invia via email un invito valido sette giorni. |
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 è admin, editor o viewer. La persona deve verificare lo stesso indirizzo email prima di accettare.Brand
| Metodo | Percorso | Permesso | Cosa fa |
|---|---|---|---|
| GET | /api/personalities | designs:read | I brand dello spazio di lavoro, come { items }. |
| POST | /api/personalities | personalities:write | Crea un brand. |
| PATCH | /api/personalities/:id | personalities:write | Rinomina un brand, ne imposta il Mark, il profilo o lo stile. |
| DELETE | /api/personalities/:id | personalities:write | Elimina un brand e i suoi design. Uno spazio di lavoro ne mantiene almeno uno. |
| GET | /api/personalities/:id/designs | designs:read | I design di un brand, dal più recente. |
| GET | /api/personalities/:id/brand | designs:read | I font, i loghi e i colori salvati di un brand. Una chiave può leggerli, mai modificarli. |
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
| Metodo | Percorso | Permesso | Cosa fa |
|---|---|---|---|
| POST | /api/agent/compose | designs:write | Impagina i testi, rielabora un modello o applica modifiche, e salva. |
| POST | /api/designs | designs:write | Crea un design da un documento. |
| GET | /api/designs/:id | designs:read | Un design con il suo documento. |
| PATCH | /api/designs/:id | designs:write | Ne cambia il titolo, il documento, il Mark o la condivisione. |
| DELETE | /api/designs/:id | designs:write | Elimina un design. |
| POST | /api/designs/:id/duplicate | designs:write | Ne salva una copia accanto. |
| GET | /api/designs/:id/thumb | designs:read | La sua immagine in miniatura. |
| POST | /api/designs/:id/render | designs:read | Lo 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.
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).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.
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 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
| Metodo | Percorso | Permesso | Cosa fa |
|---|---|---|---|
| POST | /api/uploads | designs:write | Carica un’immagine per i design. |
| GET | /api/uploads | designs:read | I caricamenti dello spazio di lavoro, dal più recente. |
| GET | /api/uploads/:id | designs:read | Reindirizza all’immagine. ?w= chiede una larghezza. |
| DELETE | /api/uploads/:id | designs:write | Elimina uno dei tuoi caricamenti. |
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 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
| Metodo | Percorso | Permesso | Cosa fa |
|---|---|---|---|
| GET | /api/marks | marks:read | Cerca nel Mercato. |
| GET | /api/marks/:code | marks:read | Un Mark con la sua ricetta, per codice o id. |
| GET | /api/marks/mine | marks:read | I Mark riservati per lo spazio di lavoro, e le tue bozze al suo interno. |
| POST | /api/agent/mark | marks:read | Costruisce o modifica una ricetta e la verifica. Non salva nulla. |
| POST | /api/marks | brand:generate | Salva una ricetta come Mark in bozza. |
| PATCH | /api/marks/:id | brand:generate | Modifica una bozza che hai creato. |
| POST | /api/marks/:code/claim | marks:claim | Riserva un Mark disponibile. |
| POST | /api/marks/:code/buy | marks:claim | Riserva 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.
POST /api/marks
{ "name": "Night Harbour", "recipe": { … }, "personalityId": "…" }
{ "id": "…", "code": "GR·K7Q2·MX", "name": "Night Harbour", "status": "draft", "recipe": { … } }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
| Metodo | Percorso | Permesso | Cosa fa |
|---|---|---|---|
| GET | /api/marks/:code/versions | marks:read | Le versioni, dalla più recente, come { items, next, canEdit }. |
| GET | /api/marks/:code/versions/:vid | marks:read | Una sola versione. |
| POST | /api/marks/:code/versions | brand:generate | Salva una versione: { label, recipe }, entrambi facoltativi. |
| PATCH | /api/marks/:code/versions/:vid | brand:generate | Rinomina o segna con una stella: { label, starred }. |
| DELETE | /api/marks/:code/versions/:vid | brand:generate | Elimina una versione. |
| POST | /api/marks/:code/versions/:vid/restore | brand:generate | Ripristina la versione come bozza. |
Generazione del brand
| Metodo | Percorso | Permesso | Cosa fa |
|---|---|---|---|
| POST | /api/brand/generate | brand:generate | Restituisce proposte di brand. Non scrive nulla. |
| POST | /api/brand/adopt | brand:generate | Crea un Mark in bozza, un brand e tre design iniziali da una proposta. |
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": [ … ] }Il Designer
| Metodo | Percorso | Permesso | Cosa fa |
|---|---|---|---|
| POST | /api/agent | designs:write | Un turno del Designer, in streaming come JSON delimitato da a capo. |
| POST | /api/batches | designs:write | Avvia una serie di design da un solo brief. |
| GET | /api/batches | designs:read | Le tue serie, in corso e recenti. |
| GET | /api/batches/:id | designs:read | L’avanzamento di una serie. |
| DELETE | /api/batches/:id | designs:write | Ferma una serie. I design già disegnati restano. |
| GET | /api/agent/runs?designId= | designs:read | I turni del Designer ancora in corso per un design. |
| DELETE | /api/agent/runs/:id | designs:write | Ferma un turno in corso. |
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; 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" } }.
{ "error": "API key lacks required scope for this endpoint." }| Stato | Quando |
|---|---|
| 401 | Nessuna chiave, una chiave malformata, oppure una chiave revocata o il cui creatore non è più proprietario o amministratore. |
| 402 | Serve un pagamento o un credito: una riserva a pagamento (checkout: true), nessuna licenza di esportazione, o crediti IA insufficienti (code: "credits"). |
| 403 | Alla chiave manca un permesso, appartiene a un altro spazio di lavoro, oppure il ruolo di chi l’ha creata non consente l’azione. |
| 404 | L’elemento non esiste o la chiave non può vederlo. |
| 409 | Un conflitto: l’elemento è cambiato da quando l’hai letto, un nome è già in uso, oppure l’azione richiede il checkout. |
| 422 | La richiesta non ha superato la validazione. Il messaggio indica quale campo e perché. |
| 429 | Troppe richieste. Attendi i secondi indicati in Retry-After e riprova. |
| 503 | Occupato o temporaneamente non disponibile, ad esempio il Designer o le esportazioni. Rispetta Retry-After. |
| 504 | Una 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.
| Limite | Quota |
|---|---|
| Ogni richiesta con una chiave | 120 al minuto per chiave |
| Scritture (POST, PATCH, DELETE) | 90 al minuto per account, condivisi con l’app |
| Generazioni | 10 al minuto per account |
| Nuovi design e duplicati | 60 al minuto per account |
| Caricamenti | 60 al minuto per account |
| Riserve | 20 ogni dieci minuti e 100 al giorno per account |
| Inviti | 30 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 ilnextCursordella risposta; è null nell’ultima pagina. - Versioni dei Mark: passa il valore
nextdella risposta; è null nell’ultima pagina. - Design di un brand: 100 per pagina, dal più recente. Passa l’
iddell’ultimo design ricevuto. - Caricamenti: 60 per pagina, dal più recente. Passa l’
iddell’ultimo caricamento. - Brand, spazi di lavoro, membri e registro attività: 100 per pagina. Passa l’
iddell’ultimo elemento (userIdper i membri). I brand sono elencati da/api/personalitiescome{ items }.
Chiavi, permessi e rotazione sono in Chiavi API e permessi. Se un endpoint che ti serve non è qui, diccelo.

