A API é a mesma que o app do Gradiently usa, então uma chave vê os mesmos dados e passa pelas mesmas verificações que quem a criou passaria no app, limitada a um workspace e aos seus escopos. Uma chave que chama um endpoint que nenhum dos seus escopos cobre recebe 403.
URL base e autenticação
Todos os caminhos abaixo ficam em https://gradiently.design. Envie sua chave como token bearer em cada requisição. Os corpos são JSON com Content-Type: application/json, exceto nos uploads.
curl https://gradiently.design/api/marks/mine \
-H "Authorization: Bearer gr_live_…"- Uma chave está sempre vinculada ao workspace em que foi criada. Você não precisa indicar o workspace; se enviar
X-Workspaceou?workspace=, ele precisa ser o da própria chave, ou a requisição falha com 403. - Os corpos das requisições são verificados de forma estrita: um campo que o endpoint não conhece falha com 422.
- As respostas são JSON, salvo indicação em contrário (imagens, redirecionamentos e o stream do Designer). As mensagens de erro para chaves de API são em inglês.
- Uma chave age como quem a criou. Os designs e as marcas que ela cria pertencem ao workspace; os Marks que ela reserva ficam com quem a criou.
Workspace
| Método | Caminho | Escopo | O que faz |
|---|---|---|---|
| GET | /api/me | workspaces:read e designs:read | Você, o workspace da chave e as marcas dele. |
| GET | /api/workspaces | workspaces:read | O workspace da chave e a sua função. |
| GET | /api/workspaces/:id | workspaces:read | Um workspace. |
| GET | /api/workspaces/:id/members | workspaces:read | Membros com nome, e-mail e função. |
| GET | /api/workspaces/:id/audit | workspaces:read | O registro de auditoria do workspace. |
| POST | /api/workspaces/:id/invites | members:write | Envia por e-mail um convite de sete dias. |
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 ou viewer. A pessoa precisa verificar o mesmo endereço de e-mail antes de aceitar.Marcas
| Método | Caminho | Escopo | O que faz |
|---|---|---|---|
| GET | /api/personalities | designs:read | As marcas do workspace, como { items }. |
| POST | /api/personalities | personalities:write | Cria uma marca. |
| PATCH | /api/personalities/:id | personalities:write | Renomeia uma marca, define o Mark, o perfil ou o estilo dela. |
| DELETE | /api/personalities/:id | personalities:write | Exclui uma marca e os designs dela. Um workspace mantém pelo menos uma. |
| GET | /api/personalities/:id/designs | designs:read | Os designs de uma marca, do mais recente ao mais antigo. |
| GET | /api/personalities/:id/brand | designs:read | As fontes, os logotipos e as cores salvas de uma marca. Uma chave pode ler, nunca alterar. |
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 é opcional na criação. Um perfil também pode ter audience, uses, keywords, dos, donts, website, handle e fonts.A lista de designs aceita ?q= para buscar nos títulos e ?mark= para filtrar por Mark. Cada item tem id, personalityId, markId, title, form, thumb, shared e updatedAt, sem o documento.
Designs
| Método | Caminho | Escopo | O que faz |
|---|---|---|---|
| POST | /api/agent/compose | designs:write | Diagrama um texto, remixa um modelo ou aplica edições, e salva. |
| POST | /api/designs | designs:write | Cria um design a partir de um documento. |
| GET | /api/designs/:id | designs:read | Um design com o documento dele. |
| PATCH | /api/designs/:id | designs:write | Altera o título, o documento, o Mark ou o compartilhamento. |
| DELETE | /api/designs/:id | designs:write | Exclui um design. |
| POST | /api/designs/:id/duplicate | designs:write | Salva uma cópia ao lado dele. |
| GET | /api/designs/:id/thumb | designs:read | A miniatura dele. |
| POST | /api/designs/:id/render | designs:read | Renderiza em PNG ou PDF. |
O jeito mais fácil de criar um design por código é POST /api/agent/compose: você descreve o conteúdo e o motor de layout o posiciona com o Mark da marca. O mesmo endpoint remixa um modelo (template com text, photos, icons, hide) ou, com designId e ops, edita um design salvo.
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 lista o que a revisão encontrou (margens, colisões, hierarquia, contraste).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 é opcional; sem ele, o design usa o Mark da marca. Leia um design com GET /api/designs/:id para ver um documento completo.PATCH /api/designs/:id aceita qualquer um de title, doc, markId e shared. Definir shared como true publica um link de visualização em /d/:id. Envie baseUpdatedAt, o updatedAt que você leu por último, para recusar o salvamento com 409 se alguém tiver alterado o design desde então.
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 conta a partir de 0; um PDF sem page traz todas as páginas, cada uma no tamanho dela no Studio, que a requisição precisa respeitar. Aguarde até três minutos.Renderizar exige a mesma licença de exportação do Mark do design que o Studio exige; sem ela, a resposta é 402. A renderização nunca publica o design nem guarda um arquivo.
Uploads
| Método | Caminho | Escopo | O que faz |
|---|---|---|---|
| POST | /api/uploads | designs:write | Envia uma imagem para usar em designs. |
| GET | /api/uploads | designs:read | Os uploads do workspace, do mais recente ao mais antigo. |
| GET | /api/uploads/:id | designs:read | Redireciona para a imagem. ?w= pede uma largura. |
| DELETE | /api/uploads/:id | designs:write | Exclui um dos seus 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 ou AVIF, com no máximo 8 MB e um tipo que corresponda ao conteúdo. Use a url devolvida como src de uma imagem ou como foto de um modelo.Marks
| Método | Caminho | Escopo | O que faz |
|---|---|---|---|
| GET | /api/marks | marks:read | Busca no Mercado. |
| GET | /api/marks/:code | marks:read | Um Mark com a receita dele, pelo código ou pelo id. |
| GET | /api/marks/mine | marks:read | Os Marks mantidos para o workspace, e seus rascunhos nele. |
| POST | /api/agent/mark | marks:read | Monta ou edita uma receita e a revisa. Não salva nada. |
| POST | /api/marks | brand:generate | Salva uma receita como Mark em rascunho. |
| PATCH | /api/marks/:id | brand:generate | Altera um rascunho que você criou. |
| POST | /api/marks/:code/claim | marks:claim | Reserva um Mark disponível. |
| POST | /api/marks/:code/buy | marks:claim | Reserva um Mark que outro dono colocou à venda. |
GET /api/marks aceita q (nome ou código), tone (dark ou light), material, status (listed, house ou sale) e cursor. A resposta é { "items": [ … ], "nextCursor": "…" } com 24 Marks por página. Um Mark tem 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 válida em POST /api/agent/mark com um spec. personalityId salva o rascunho nessa marca. Sem ele, uma chave salva o rascunho na primeira marca do workspace dela, e falha com 404 se não houver nenhuma. Cada pessoa pode ter até 50 rascunhos.Uma reserva é feita para quem criou a chave, nunca para o workspace. Reservas grátis, e reservas cobertas por um crédito de reserva, são concluídas na hora. Uma reserva que exige pagamento responde 402 com checkout: true, e buy responde 409 com checkout: true; conclua essas no Gradiently, porque uma chave não pode pagar. buy aceita { "priceCents": … }, o preço anunciado que você viu, e falha com 409 se ele tiver mudado.
Versões de Marks
| Método | Caminho | Escopo | O que faz |
|---|---|---|---|
| GET | /api/marks/:code/versions | marks:read | Versões, da mais recente à mais antiga, como { items, next, canEdit }. |
| GET | /api/marks/:code/versions/:vid | marks:read | Uma versão. |
| POST | /api/marks/:code/versions | brand:generate | Salva uma versão: { label, recipe }, os dois opcionais. |
| PATCH | /api/marks/:code/versions/:vid | brand:generate | Renomeia ou marca com estrela: { label, starred }. |
| DELETE | /api/marks/:code/versions/:vid | brand:generate | Exclui uma versão. |
| POST | /api/marks/:code/versions/:vid/restore | brand:generate | Volta a versão para o rascunho. |
Geração de marcas
| Método | Caminho | Escopo | O que faz |
|---|---|---|---|
| POST | /api/brand/generate | brand:generate | Devolve propostas de marca. Não grava nada. |
| POST | /api/brand/adopt | brand:generate | Cria um Mark em rascunho, uma marca e três designs iniciais a partir de uma 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": [ … ] }O Designer
| Método | Caminho | Escopo | O que faz |
|---|---|---|---|
| POST | /api/agent | designs:write | Um turno do Designer, transmitido como JSON delimitado por quebras de linha. |
| POST | /api/batches | designs:write | Inicia um conjunto de designs a partir de um único briefing. |
| GET | /api/batches | designs:read | Seus conjuntos, em andamento e recentes. |
| GET | /api/batches/:id | designs:read | O progresso de um conjunto. |
| DELETE | /api/batches/:id | designs:write | Para um conjunto. Os designs já feitos continuam. |
| GET | /api/agent/runs?designId= | designs:read | Os turnos do Designer ainda em andamento para um design. |
| DELETE | /api/agent/runs/:id | designs:write | Para um turno em andamento. |
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; cada item ganha um designId e uma url assim que é salvo. state termina como done, stopped ou failed.O Designer gasta os créditos de IA do workspace. Quando o saldo está abaixo do que um turno precisa, /api/agent e /api/batches respondem 402 com code: "credits". No máximo dois conjuntos rodam ao mesmo tempo por pessoa. A ferramenta design em MCP e assistentes de IA lê o stream do Designer e salva o resultado para você, o que é mais simples do que tratar o stream por conta própria.
Erros
Um erro responde com um código de status e um corpo JSON com uma mensagem error legível. Alguns trazem campos extras, indicados abaixo. A única exceção é /api/mcp: um corpo que não é JSON válido responde 400 com um objeto de erro JSON-RPC no lugar, { "jsonrpc": "2.0", "id": null, "error": { "code": -32700, "message": "Parse error" } }.
{ "error": "API key lacks required scope for this endpoint." }| Status | Quando |
|---|---|
| 401 | Nenhuma chave, uma chave malformada, ou uma chave revogada ou cujo criador não é mais proprietário ou admin. |
| 402 | É preciso pagamento ou crédito: uma reserva com preço (checkout: true), falta de licença de exportação ou créditos de IA insuficientes (code: "credits"). |
| 403 | Falta um escopo à chave, ela pertence a outro workspace, ou a função de quem a criou não permite a ação. |
| 404 | O item não existe ou a chave não consegue vê-lo. |
| 409 | Um conflito: o item mudou desde que você o leu, um nome já está em uso, ou a ação precisa de checkout. |
| 422 | A requisição não passou na validação. A mensagem diz qual campo e por quê. |
| 429 | Requisições demais. Espere os segundos indicados em Retry-After e tente de novo. |
| 503 | Ocupado ou temporariamente indisponível, por exemplo o Designer ou as exportações. Respeite o Retry-After. |
| 504 | Uma renderização demorou demais. Tente um tamanho menor ou uma única página. |
Limites de requisições
Os limites contam em uma janela móvel de um minuto, salvo indicação em contrário. Passar do limite responde 429 com um cabeçalho Retry-After em segundos e um campo retryAfter no corpo. Diminua o ritmo e tente de novo depois desse tempo; não repita na hora.
| Limite | Permitido |
|---|---|
| Toda requisição com chave | 120 por minuto por chave |
| Gravações (POST, PATCH, DELETE) | 90 por minuto por conta, compartilhado com o app |
| Renderizações | 10 por minuto por conta |
| Novos designs e duplicatas | 60 por minuto por conta |
| Uploads | 60 por minuto por conta |
| Reservas | 20 a cada dez minutos e 100 por dia por conta |
| Convites | 30 por hora por conta |
As exportações e o Designer também têm uma capacidade compartilhada. Quando ela está cheia, a resposta é 503 ou 429 com Retry-After, mesmo abaixo dos seus próprios limites. Pelo MCP, uma chamada de ferramenta conta uma vez pela requisição MCP e uma vez para cada requisição à API que a ferramenta faz.
Paginação
As listas devolvem uma página por vez. Peça a próxima página com ?cursor=.
- Busca no Mercado (
/api/marks): 24 por página. Passe onextCursorda resposta; ele é null na última página. - Versões de Marks: passe o valor
nextda resposta; ele é null na última página. - Designs de uma marca: 100 por página, do mais recente ao mais antigo. Passe o
iddo último design que você recebeu. - Uploads: 60 por página, do mais recente ao mais antigo. Passe o
iddo último upload. - Marcas, workspaces, membros e o registro de auditoria: 100 por página. Passe o
iddo último item (userIdpara membros). As marcas são listadas em/api/personalitiescomo{ items }.
Chaves, escopos e troca de chaves estão em Chaves de API e escopos. Se um endpoint de que você precisa não estiver aqui, avise a gente.

