ScanMosaic
REST API · v1

Integre QR codes e links curtos ao seu app

Crie QR codes dinâmicos, links curtos e barcodes, mude o destino deles, leia as estatísticas de scans e gere imagens de QR code prontas para impressão, tudo a partir do seu código. JSON sobre HTTPS, uma API key, erros claros.

URL base
https://scanmosaic.com/api/v1
Auth
Authorization: Bearer tsk_…
Plano
Business

Início rápido

  1. Abra Chaves de API no seu dashboard (plano Business) e crie uma chave. Copie: ela aparece só uma vez.
  2. Guarde-a como variável de ambiente no seu servidor, por exemplo TESSERA_API_KEY. Nunca a coloque em código de navegador ou de app.
  3. Crie um QR code dinâmico. A resposta traz o link curto em url; codifique esse link ou baixe uma imagem pronta em /qr.

cURL

curl "https://scanmosaic.com/api/v1/items" \
  -H "Authorization: Bearer $TESSERA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"kind": "qr", "name": "Table menu", "dest": "https://example.com/menu"}'

JavaScript

const res = await fetch("https://scanmosaic.com/api/v1/items", {
  method: "POST",
  headers: { Authorization: `Bearer ${process.env.TESSERA_API_KEY}`, "Content-Type": "application/json" },
  body: JSON.stringify({
    "kind": "qr",
    "name": "Table menu",
    "dest": "https://example.com/menu"
  })
});
const body = await res.json();
if (!res.ok) throw new Error(body.error.message);
console.log(body.data);

Python

import os, requests

r = requests.post(
    "https://scanmosaic.com/api/v1/items",
    headers={"Authorization": f"Bearer {os.environ['TESSERA_API_KEY']}"},
    json={
    "kind": "qr",
    "name": "Table menu",
    "dest": "https://example.com/menu"
},
)
r.raise_for_status()
print(r.json()["data"])

cURL

curl "https://scanmosaic.com/api/v1/qr?item=k3Xp9Qa&size=1024" \
  -H "Authorization: Bearer $TESSERA_API_KEY" \
  -o menu.png

JavaScript

import { writeFile } from "node:fs/promises";

const res = await fetch("https://scanmosaic.com/api/v1/qr?item=k3Xp9Qa&size=1024", {
  headers: { Authorization: `Bearer ${process.env.TESSERA_API_KEY}` },
});
if (!res.ok) throw new Error((await res.json()).error.message);
await writeFile("menu.png", Buffer.from(await res.arrayBuffer()));

Python

import os, requests

r = requests.get(
    "https://scanmosaic.com/api/v1/qr?item=k3Xp9Qa&size=1024",
    headers={"Authorization": f"Bearer {os.environ['TESSERA_API_KEY']}"},
)
r.raise_for_status()
open("menu.png", "wb").write(r.content)

Autenticação

Envie sua chave no cabeçalho Authorization de toda requisição. As chaves começam com tsk_ e pertencem a um workspace: elas podem ler e alterar tudo o que um editor desse workspace pode, e nada em outros workspaces.

Authorization: Bearer tsk_AbC123…
  • Proprietários e admins criam e excluem chaves em Chaves de API, no dashboard. Excluir uma chave a desativa na hora.
  • A API faz parte do plano Business. Se o plano terminar, as requisições recebem 402 business_required até você renovar; seus códigos e dados são mantidos.
  • As alterações feitas com uma chave aparecem no registro de atividades do workspace como "API key tsk_…".
  • O CORS está aberto para você chamar a API de qualquer origem, mas uma chave em uma página web pode ser copiada por quem a abrir. Chame a API pelo seu servidor.

Erros

Todo erro usa o mesmo formato JSON e um status HTTP correspondente. code é estável: baseie-se nele. message é texto simples em inglês para logs e pessoas. Alguns erros acrescentam detalhes, como param.

{
  "error": {
    "code": "bad_param",
    "message": "One of the parameters isn't valid.",
    "status": 400,
    "param": "size",
    "hint": "64 to 2048"
  }
}
Códigos de erro
StatusCódigoSignificado
400bad_jsonO corpo da requisição não é um JSON válido.
400bad_paramUm parâmetro de consulta ou de corpo está fora do intervalo. details: param, hint.
400bad_destinationdest não é um endereço web http(s) completo.
400bad_kindkind não é qr, link nem barcode.
400bad_aliaso alias não tem de 3 a 40 letras, números ou hifens, ou é reservado.
400domain_not_verifieddomain não é um domínio verificado do seu workspace.
400unsafe_destinationO Google Web Risk sinaliza o destino.
400empty / too_long / bad_formatImagens de QR: sem dados, dados demais ou um formato diferente de png ou svg.
400bad_cursorEsse cursor não foi fornecido por nós.
401api_key_requiredSem cabeçalho Authorization, ou ele não é Bearer tsk_…
401invalid_api_keyA chave não existe ou foi excluída.
402business_requiredO workspace não está no plano Business (por exemplo, o plano terminou).
403limit_reachedO limite do seu plano para esse tipo de item foi atingido. details: limit, kind.
404not_foundEsse item não existe neste workspace.
409alias_takenEsse alias já está em uso nesse domínio.
413too_bigO corpo da requisição é grande demais (250 KB para itens).
429rate_limited / daily_limitMuitas requisições. Aguarde os segundos indicados em Retry-After.
500server_errorAlgo falhou do nosso lado. Tente novamente com backoff.

Limites de requisições

Cada chave pode fazer 120 requisições por minuto e 20,000 por dia. Toda resposta informa em que ponto você está:

CabeçalhoSignificado
X-RateLimit-LimitRequisições permitidas por minuto.
X-RateLimit-RemainingRequisições restantes no minuto atual.
X-RateLimit-ResetHorário Unix em que o minuto reinicia.
Retry-AfterSó no 429: segundos de espera antes de tentar de novo.

A criação de itens também é limitada a 300 por hora por workspace, e seu plano define quantos itens você pode manter. Precisa de mais? Fale conosco.

Paginação

As listas retornam os mais recentes primeiro, até limit itens (padrão 25, no máximo 100). Quando has_more for true, envie next_cursor como cursor para obter a próxima página. Os cursores continuam válidos quando itens são adicionados.

{
  "data": [
    "\u2026"
  ],
  "has_more": true,
  "next_cursor": "MTc2NzIyNTYwMC5rM1hwOVFh"
}

O objeto item

QR codes, links e barcodes são todos itens. Itens individuais voltam como data; listas voltam como data com campos de paginação.

Campos do item
NomeTipoDescrição
idstringID curto, também o final padrão do link curto.
kindqr | link | barcodeO que é. Não pode ser alterado depois de criado.
typestringTipo de conteúdo, por exemplo url (padrão), pdf, menu, vcard para QR codes; ean13, code128 para barcodes.
namestringSeu rótulo, com até 80 caracteres.
deststring | nullPara onde vão as leituras e os cliques. null para páginas hospedadas e códigos de barras.
urlstringO link curto que o QR code codifica, por exemplo https://go.yourbrand.com/menu.
aliasstring | nullFinal personalizado (3 a 40 letras, números ou hifens), único por domínio.
domainstring | nullSeu domínio personalizado verificado ou null para o nosso.
campaignstring | nullAgrupe itens para gerar relatórios.
contentobject | nullDados da página hospedada ou do barcode ({ "data": "…" }).
styleobjectDesign do QR code (cores, estilos de pontos e cantos).
rulesobject | nullRegras de roteamento (por dispositivo, país, horário…).
pausedbooleanItens pausados mostram uma página 'pausado' em vez de redirecionar.
disabledbooleanDesativado por nós por violar os termos.
hitsintegerScans de todo o período (QR codes) ou cliques (links).
last_hitinteger | nullHorário Unix da última leitura ou clique.
created / updatedintegerHorários Unix.

Endpoints

GET /api/v1/me

Conta

O workspace a que esta chave pertence, seu plano, limites, uso, domínios verificados e limites de requisições. Útil para conferir se uma chave funciona.

cURL

curl "https://scanmosaic.com/api/v1/me" \
  -H "Authorization: Bearer $TESSERA_API_KEY"

JavaScript

const res = await fetch("https://scanmosaic.com/api/v1/me", {
  headers: { Authorization: `Bearer ${process.env.TESSERA_API_KEY}` },
});
const body = await res.json();
if (!res.ok) throw new Error(body.error.message);
console.log(body.data);

Python

import os, requests

r = requests.get(
    "https://scanmosaic.com/api/v1/me",
    headers={"Authorization": f"Bearer {os.environ['TESSERA_API_KEY']}"},
)
r.raise_for_status()
print(r.json()["data"])
Resposta 200 OK
{
  "data": {
    "workspace": {
      "id": "w_8fK2mQ",
      "name": "Acme"
    },
    "plan": "business",
    "key": {
      "prefix": "tsk_AbC123",
      "name": "Shopify sync"
    },
    "limits": {
      "qr": 1000,
      "link": 5000,
      "barcode": 10000,
      "domains": 5
    },
    "usage": {
      "dynamic": 12,
      "links": 40,
      "barcodes": 3,
      "storageBytes": 0,
      "workspaces": 1
    },
    "domains": [
      "go.yourbrand.com"
    ],
    "rate_limits": {
      "per_minute": 120,
      "per_day": 20000
    }
  }
}

GET /api/v1/items

Listar itens

Itens do workspace, os mais recentes primeiro.

Parâmetros
NomeTipoDescrição
kindqr | link | barcodeApenas este tipo.
typestringApenas este tipo de conteúdo, por exemplo url ou pdf.
campaignstringApenas esta campanha.
domainstringApenas itens neste domínio personalizado.
pausedtrue | falseApenas itens pausados ou apenas itens ativos.
qstringBusque por nome, destino e apelido.
limitinteger1–100, padrão 25.
cursorstringnext_cursor da página anterior.

cURL

curl "https://scanmosaic.com/api/v1/items?kind=link&campaign=spring&limit=50" \
  -H "Authorization: Bearer $TESSERA_API_KEY"

JavaScript

const res = await fetch("https://scanmosaic.com/api/v1/items?kind=link&campaign=spring&limit=50", {
  headers: { Authorization: `Bearer ${process.env.TESSERA_API_KEY}` },
});
const body = await res.json();
if (!res.ok) throw new Error(body.error.message);
console.log(body.data);

Python

import os, requests

r = requests.get(
    "https://scanmosaic.com/api/v1/items?kind=link&campaign=spring&limit=50",
    headers={"Authorization": f"Bearer {os.environ['TESSERA_API_KEY']}"},
)
r.raise_for_status()
print(r.json()["data"])
Resposta 200 OK
{
  "data": [
    {
      "id": "k3Xp9Qa",
      "kind": "link",
      "type": "url",
      "name": "Spring menu",
      "dest": "https://example.com/menu",
      "content": null,
      "style": {},
      "rules": null,
      "alias": "menu",
      "domain": "go.yourbrand.com",
      "campaign": "spring",
      "og": null,
      "created": 1767225600,
      "updated": 1767225600,
      "paused": false,
      "disabled": false,
      "hits": 42,
      "last_hit": 1767312000,
      "url": "https://go.yourbrand.com/menu"
    }
  ],
  "has_more": false,
  "next_cursor": null
}

POST /api/v1/items

Criar um item

Cria um QR code dinâmico, link curto ou código de barras salvo. Conta para os limites do seu plano.

Parâmetros
NomeTipoDescrição
kindqr | link | barcodePadrão qr.
dest obrigatóriostringEndereço http(s) completo para redirecionar. Não é usado em códigos de barras e páginas hospedadas.
namestringAté 80 caracteres.
typestringPadrão url (códigos, links) ou code128 (barcodes).
aliasstringFinal personalizado, por exemplo menu. De 3 a 40 letras, números ou hifens, único por domínio.
domainstringUm dos seus domínios personalizados verificados (veja /domains).
campaignstringAté 60 caracteres.
styleobjectDesign do QR, por exemplo {"fg": "#112233", "dot": "rounded"}.
contentobjectDados da página hospedada ou do barcode, por exemplo {"bcid": "ean13", "text": "4006381333931"} para um barcode.
rulesobjectRegras de roteamento.
pausedbooleanComeçar pausado.

cURL

curl "https://scanmosaic.com/api/v1/items" \
  -H "Authorization: Bearer $TESSERA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"kind": "link", "name": "Spring menu", "dest": "https://example.com/menu", "alias": "menu", "domain": "go.yourbrand.com", "campaign": "spring"}'

JavaScript

const res = await fetch("https://scanmosaic.com/api/v1/items", {
  method: "POST",
  headers: { Authorization: `Bearer ${process.env.TESSERA_API_KEY}`, "Content-Type": "application/json" },
  body: JSON.stringify({
    "kind": "link",
    "name": "Spring menu",
    "dest": "https://example.com/menu",
    "alias": "menu",
    "domain": "go.yourbrand.com",
    "campaign": "spring"
  })
});
const body = await res.json();
if (!res.ok) throw new Error(body.error.message);
console.log(body.data);

Python

import os, requests

r = requests.post(
    "https://scanmosaic.com/api/v1/items",
    headers={"Authorization": f"Bearer {os.environ['TESSERA_API_KEY']}"},
    json={
    "kind": "link",
    "name": "Spring menu",
    "dest": "https://example.com/menu",
    "alias": "menu",
    "domain": "go.yourbrand.com",
    "campaign": "spring"
},
)
r.raise_for_status()
print(r.json()["data"])
Resposta 201 Created
{
  "data": {
    "id": "k3Xp9Qa",
    "kind": "link",
    "type": "url",
    "name": "Spring menu",
    "dest": "https://example.com/menu",
    "content": null,
    "style": {},
    "rules": null,
    "alias": "menu",
    "domain": "go.yourbrand.com",
    "campaign": "spring",
    "og": null,
    "created": 1767225600,
    "updated": 1767225600,
    "paused": false,
    "disabled": false,
    "hits": 42,
    "last_hit": 1767312000,
    "url": "https://go.yourbrand.com/menu"
  }
}

GET /api/v1/items/{id}

Obter um item

Um item por id.

cURL

curl "https://scanmosaic.com/api/v1/items/k3Xp9Qa" \
  -H "Authorization: Bearer $TESSERA_API_KEY"

JavaScript

const res = await fetch("https://scanmosaic.com/api/v1/items/k3Xp9Qa", {
  headers: { Authorization: `Bearer ${process.env.TESSERA_API_KEY}` },
});
const body = await res.json();
if (!res.ok) throw new Error(body.error.message);
console.log(body.data);

Python

import os, requests

r = requests.get(
    "https://scanmosaic.com/api/v1/items/k3Xp9Qa",
    headers={"Authorization": f"Bearer {os.environ['TESSERA_API_KEY']}"},
)
r.raise_for_status()
print(r.json()["data"])
Resposta 200 OK
{
  "data": {
    "id": "k3Xp9Qa",
    "kind": "link",
    "type": "url",
    "name": "Spring menu",
    "dest": "https://example.com/menu",
    "content": null,
    "style": {},
    "rules": null,
    "alias": "menu",
    "domain": "go.yourbrand.com",
    "campaign": "spring",
    "og": null,
    "created": 1767225600,
    "updated": 1767225600,
    "paused": false,
    "disabled": false,
    "hits": 42,
    "last_hit": 1767312000,
    "url": "https://go.yourbrand.com/menu"
  }
}

PATCH /api/v1/items/{id}

Atualizar um item

Envie apenas os campos que vão mudar. Alterar dest vale a partir da próxima leitura; os códigos impressos continuam funcionando. Alterar domain ou alias muda o link curto, e os códigos já impressos deixam de funcionar.

Parâmetros
NomeTipoDescrição
name, dest, alias, domain, campaign, style, content, rules, pausedComo em Create. kind não pode ser alterado. Envie null para limpar alias, domain, campaign ou rules.

cURL

curl -X PATCH "https://scanmosaic.com/api/v1/items/k3Xp9Qa" \
  -H "Authorization: Bearer $TESSERA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"dest": "https://example.com/summer-menu", "paused": false}'

JavaScript

const res = await fetch("https://scanmosaic.com/api/v1/items/k3Xp9Qa", {
  method: "PATCH",
  headers: { Authorization: `Bearer ${process.env.TESSERA_API_KEY}`, "Content-Type": "application/json" },
  body: JSON.stringify({
    "dest": "https://example.com/summer-menu",
    "paused": false
  })
});
const body = await res.json();
if (!res.ok) throw new Error(body.error.message);
console.log(body.data);

Python

import os, requests

r = requests.patch(
    "https://scanmosaic.com/api/v1/items/k3Xp9Qa",
    headers={"Authorization": f"Bearer {os.environ['TESSERA_API_KEY']}"},
    json={
    "dest": "https://example.com/summer-menu",
    "paused": False
},
)
r.raise_for_status()
print(r.json()["data"])
Resposta 200 OK
{
  "data": {
    "id": "k3Xp9Qa",
    "kind": "link",
    "type": "url",
    "name": "Spring menu",
    "dest": "https://example.com/summer-menu",
    "content": null,
    "style": {},
    "rules": null,
    "alias": "menu",
    "domain": "go.yourbrand.com",
    "campaign": "spring",
    "og": null,
    "created": 1767225600,
    "updated": 1767225600,
    "paused": false,
    "disabled": false,
    "hits": 42,
    "last_hit": 1767312000,
    "url": "https://go.yourbrand.com/menu"
  }
}

DELETE /api/v1/items/{id}

Excluir um item

Exclui o item e seu histórico de scans. O link curto dele para de funcionar na hora. Isso não pode ser desfeito.

cURL

curl -X DELETE "https://scanmosaic.com/api/v1/items/k3Xp9Qa" \
  -H "Authorization: Bearer $TESSERA_API_KEY"

JavaScript

const res = await fetch("https://scanmosaic.com/api/v1/items/k3Xp9Qa", {
  method: "DELETE",
  headers: { Authorization: `Bearer ${process.env.TESSERA_API_KEY}` },
});
const body = await res.json();
if (!res.ok) throw new Error(body.error.message);
console.log(body.data);

Python

import os, requests

r = requests.delete(
    "https://scanmosaic.com/api/v1/items/k3Xp9Qa",
    headers={"Authorization": f"Bearer {os.environ['TESSERA_API_KEY']}"},
)
r.raise_for_status()
print(r.json()["data"])
Resposta 200 OK
{
  "data": {
    "id": "k3Xp9Qa",
    "deleted": true
  }
}

GET /api/v1/items/{id}/stats

Estatísticas do item

Leituras ou cliques em um período: uma série diária e detalhamentos por país, dispositivo, sistema operacional, navegador, idioma e regra de roteamento. Bots não são contados.

Parâmetros
NomeTipoDescrição
daysinteger1–365, padrão 30.

cURL

curl "https://scanmosaic.com/api/v1/items/k3Xp9Qa/stats?days=7" \
  -H "Authorization: Bearer $TESSERA_API_KEY"

JavaScript

const res = await fetch("https://scanmosaic.com/api/v1/items/k3Xp9Qa/stats?days=7", {
  headers: { Authorization: `Bearer ${process.env.TESSERA_API_KEY}` },
});
const body = await res.json();
if (!res.ok) throw new Error(body.error.message);
console.log(body.data);

Python

import os, requests

r = requests.get(
    "https://scanmosaic.com/api/v1/items/k3Xp9Qa/stats?days=7",
    headers={"Authorization": f"Bearer {os.environ['TESSERA_API_KEY']}"},
)
r.raise_for_status()
print(r.json()["data"])
Resposta 200 OK
{
  "data": {
    "days": 7,
    "total": 42,
    "last_hit": 1767312000,
    "inRange": 12,
    "series": [
      [
        "2026-01-01",
        3
      ],
      [
        "2026-01-02",
        0
      ],
      [
        "…",
        0
      ]
    ],
    "countries": [
      {
        "k": "GB",
        "n": 7
      },
      {
        "k": "US",
        "n": 5
      }
    ],
    "devices": [
      {
        "k": "Mobile",
        "n": 10
      },
      {
        "k": "Desktop",
        "n": 2
      }
    ],
    "os": [
      {
        "k": "iOS",
        "n": 6
      }
    ],
    "browsers": [
      {
        "k": "Safari",
        "n": 6
      }
    ],
    "langs": [
      {
        "k": "en-gb",
        "n": 7
      }
    ],
    "rules": [
      {
        "k": "default",
        "n": 12
      }
    ]
  }
}

GET /api/v1/qr

Imagem do QR code

Gera um QR code em PNG ou SVG. Use GET com parâmetros de consulta ou POST com os mesmos parâmetros em JSON. Passe item para desenhar um código salvo com o próprio design e link curto, ou data para qualquer texto.

Parâmetros
NomeTipoDescrição
datastringTexto ou link a codificar (até 2.953 bytes). Obrigatório, a menos que item esteja definido.
itemstringID de um QR code ou link salvo: codifica o link curto com o design salvo.
formatpng | svgPadrão png.
sizeintegerPixels, de 64 a 2048 para PNG (padrão 512), de 64 a 4096 para SVG (padrão 1024).
color#RRGGBBPontos. Padrão #141A2E.
background#RRGGBBPadrão #FFFFFF.
transparentbooleanFundo transparente.
corner_color#RRGGBBQuadrados dos cantos. Padrão: cor.
gradient_color#RRGGBBSomente SVG: segunda cor de um degradê diagonal.
error_correctionL | M | Q | HQuanto dano o código suporta: 7%, 15%, 25%, 30%. Padrão M (PNG) ou Q (SVG).
marginintegerZona de silêncio em módulos, de 0 a 8. Padrão 4.
dot_stylestringsquare, dots, rounded, extra-rounded, classy, classy-rounded
corner_stylestringsquare, extra-rounded, dot
corner_dot_stylestringsquare, dot
downloadstringNome do arquivo: adiciona Content-Disposition: attachment.

Os PNGs são desenhados nos nossos servidores com pixels inteiros por módulo, então as bordas ficam nítidas para impressão. Degradês e logos só existem em SVG; para logos, use o gerador.

cURL

curl "https://scanmosaic.com/api/v1/qr" \
  -H "Authorization: Bearer $TESSERA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"data": "https://example.com", "format": "png", "size": 1024, "color": "#4865F0", "dot_style": "rounded", "corner_style": "extra-rounded"}' \
  -o qr.png

JavaScript

import { writeFile } from "node:fs/promises";

const res = await fetch("https://scanmosaic.com/api/v1/qr", {
  method: "POST",
  headers: { Authorization: `Bearer ${process.env.TESSERA_API_KEY}`, "Content-Type": "application/json" },
  body: JSON.stringify({
    "data": "https://example.com",
    "format": "png",
    "size": 1024,
    "color": "#4865F0",
    "dot_style": "rounded",
    "corner_style": "extra-rounded"
  })
});
if (!res.ok) throw new Error((await res.json()).error.message);
await writeFile("qr.png", Buffer.from(await res.arrayBuffer()));

Python

import os, requests

r = requests.post(
    "https://scanmosaic.com/api/v1/qr",
    headers={"Authorization": f"Bearer {os.environ['TESSERA_API_KEY']}"},
    json={
    "data": "https://example.com",
    "format": "png",
    "size": 1024,
    "color": "#4865F0",
    "dot_style": "rounded",
    "corner_style": "extra-rounded"
},
)
r.raise_for_status()
open("qr.png", "wb").write(r.content)

GET /api/v1/domains

Domínios

Os domínios personalizados do workspace. Use um host cujo ready seja true como domínio ao criar itens.

cURL

curl "https://scanmosaic.com/api/v1/domains" \
  -H "Authorization: Bearer $TESSERA_API_KEY"

JavaScript

const res = await fetch("https://scanmosaic.com/api/v1/domains", {
  headers: { Authorization: `Bearer ${process.env.TESSERA_API_KEY}` },
});
const body = await res.json();
if (!res.ok) throw new Error(body.error.message);
console.log(body.data);

Python

import os, requests

r = requests.get(
    "https://scanmosaic.com/api/v1/domains",
    headers={"Authorization": f"Bearer {os.environ['TESSERA_API_KEY']}"},
)
r.raise_for_status()
print(r.json()["data"])
Resposta 200 OK
{
  "data": [
    {
      "host": "go.yourbrand.com",
      "verified": true,
      "ready": true
    }
  ]
}

Domínios personalizados

No plano Business, seus links curtos podem usar o seu próprio domínio, como go.suamarca.com/menu. Adicione e verifique o domínio em Domínios, no dashboard: você cria um registro CNAME que aponta para nós e um registro TXT que comprova que o domínio é seu, e nós emitimos o certificado SSL. Depois, informe domain ao criar ou atualizar um item.

Cada domínio pode redirecionar o endereço raiz (go.yourbrand.com) e caminhos desconhecidos para as páginas que você escolher.

OpenAPI

A API completa está descrita em openapi.json (OpenAPI 3.1). Importe no Postman, no Insomnia ou em um gerador de clientes.

Versões

A v1 é estável. Podemos adicionar endpoints, campos e códigos de erro, então ignore campos que você não conhece. Não removeremos nem renomearemos nada na v1; mudanças incompatíveis virão na v2, anunciadas com bastante antecedência.