GET /template-catalog/{baseId}/schema
API · v1 · Homologação · Revisado em · Markdown
Campos, variáveis, tipos e restrições. Contrato v1 · disponível em produção e homologação · operação getTemplateCatalogBaseIdSchema. Guia funcional · Índice · Schemas · Testar em sandbox.
Autenticação e efeito
Seção intitulada “Autenticação e efeito”Permissão: templates:read. Sessão humana ou chave de servidor limitada ao proprietário e aos aplicativos autorizados. OAuth/MCP ainda não estão disponíveis. Uma chave de exemplo deve incluir somente esta permissão e as leituras necessárias ao seu fluxo, restrita a app_loja; emita-a na área autenticada de desenvolvedores.
Disponível em produção e homologação; sujeito às capacidades do app e à configuração do provedor. OAuth só será aceito após B1b. Campos desconhecidos rejeitados. Consulte os ADRs para regras semânticas além do JSON Schema.
Consulta não altera o recurso. Downloads revalidam autorização e têm prazo/estado conforme o guia.
Parâmetros
Seção intitulada “Parâmetros”| Nome | Local | Obrigatório | Tipo e restrições |
|---|---|---|---|
baseId |
path | sim | OpaqueId; {“type”:“string”,“maxLength”:500,“minLength”:1,“pattern”:“^[^/\u0000-\u001f\u007f]+$”} |
appId |
query | sim | AppId; {“type”:“string”,“maxLength”:200,“minLength”:1,“pattern”:“^[A-Za-z0-9][A-Za-z0-9._~-]*$”} |
Corpo e semântica
Seção intitulada “Corpo e semântica”Sem corpo. Envie os parâmetros na URL e os headers indicados.
Omitir campos opcionais usa o default documentado ou preserva o valor em PATCH. null só é aceito nos campos cujo schema permite null, com efeito de limpar/desvincular indicado no guia. Arrays enviados substituem a coleção quando o endpoint define atualização completa; não implicam merge. Identificadores/owner/app de um recurso existente não são transferidos por PATCH. Herança de templates/UTMs segue o guia, sem alterar links anteriores por cópia automática.
AGILINK_API_KEY deve ficar no servidor. Os placeholders abaixo são fictícios. Preserve Idempotency-Key e payload ao repetir uma intenção após timeout.
curl --request GET 'https://api.staging.agilink.io/v1/template-catalog/android/schema?appId=app_loja' \ --header 'Authorization: Bearer <credencial>'JavaScript / TypeScript
Seção intitulada “JavaScript / TypeScript”// Node.js 22+. Defina AGILINK_API_KEY no ambiente do servidor.const response = await fetch('https://api.staging.agilink.io/v1/template-catalog/android/schema?appId=app_loja', { method: 'GET', headers: { "Authorization": `Bearer ${process.env.AGILINK_API_KEY}`}, redirect: 'error', signal: AbortSignal.timeout(30000)});if (!response.ok) throw new Error('HTTP '+response.status+' requestId='+response.headers.get('X-Request-Id'));const result = await response.json();console.log(result);# Python 3.10+; pip install requestsimport osimport requestsheaders = { "Authorization": "Bearer " + os.environ["AGILINK_API_KEY"]}response = requests.request( 'GET', 'https://api.staging.agilink.io/v1/template-catalog/android/schema?appId=app_loja', headers=headers, timeout=30, allow_redirects=False)if not 200 <= response.status_code < 300: raise RuntimeError(f'HTTP {response.status_code}; requestId={response.headers.get("X-Request-Id")}')result = response.json()print(result)Response 200
Seção intitulada “Response 200”Sucesso. Exemplo fictício.
| Header | Significado | Exemplo |
|---|---|---|
X-Request-Id |
Identificador gerado pelo servidor, inclusive para falhas e replays. | conforme resposta |
Cache-Control |
Respostas administrativas não podem ser armazenadas. | no-store, no-transform |
ETag |
Revisão forte, a enviar em If-Match na alteração. | “20000000-0000-4000-8000-000000000001” |
{ "data": { "baseTemplateId": "android", "limits": { "configBytes": 12288, "dataBytes": 8192, "variables": 20, "details": 4 }, "schema": { "type": "object", "additionalProperties": false, "properties": { "schemaVersion": { "const": 1 }, "kind": { "const": "preset" }, "baseTemplateId": { "enum": [ "android", "ios", "recovery" ] }, "rendererContractVersion": { "const": 1 }, "appearance": { "type": "object", "additionalProperties": false, "properties": { "light": { "type": "object", "additionalProperties": false, "properties": { "background": { "type": "string", "pattern": "^#[0-9a-fA-F]{6}$" }, "surface": { "type": "string", "pattern": "^#[0-9a-fA-F]{6}$" }, "border": { "type": "string", "pattern": "^#[0-9a-fA-F]{6}$" }, "text": { "type": "string", "pattern": "^#[0-9a-fA-F]{6}$" }, "muted": { "type": "string", "pattern": "^#[0-9a-fA-F]{6}$" }, "accent": { "type": "string", "pattern": "^#[0-9a-fA-F]{6}$" }, "secondary": { "type": "string", "pattern": "^#[0-9a-fA-F]{6}$" }, "tertiary": { "type": "string", "pattern": "^#[0-9a-fA-F]{6}$" } }, "required": [] }, "dark": { "type": "object", "additionalProperties": false, "properties": { "background": { "type": "string", "pattern": "^#[0-9a-fA-F]{6}$" }, "surface": { "type": "string", "pattern": "^#[0-9a-fA-F]{6}$" }, "border": { "type": "string", "pattern": "^#[0-9a-fA-F]{6}$" }, "text": { "type": "string", "pattern": "^#[0-9a-fA-F]{6}$" }, "muted": { "type": "string", "pattern": "^#[0-9a-fA-F]{6}$" }, "accent": { "type": "string", "pattern": "^#[0-9a-fA-F]{6}$" }, "secondary": { "type": "string", "pattern": "^#[0-9a-fA-F]{6}$" }, "tertiary": { "type": "string", "pattern": "^#[0-9a-fA-F]{6}$" } }, "required": [] }, "fontFamily": { "enum": [ "system", "sans", "serif" ] }, "radius": { "enum": [ "small", "medium", "large" ] }, "spacing": { "enum": [ "compact", "comfortable" ] }, "logoAssetId": { "type": "string", "maxLength": 100 } }, "required": [] }, "content": { "type": "object", "additionalProperties": false, "properties": { "heading": { "type": "string", "maxLength": 120 }, "supportingText": { "type": "string", "maxLength": 1000 }, "actionLabels": { "type": "object", "additionalProperties": { "type": "string", "maxLength": 120 } }, "details": { "type": "array", "items": { "type": "object", "additionalProperties": false, "properties": { "label": { "type": "string", "maxLength": 80 }, "value": { "type": "string", "maxLength": 1000 } }, "required": [ "label", "value" ] }, "maxItems": 4 } }, "required": [] }, "variables": { "type": "array", "items": { "type": "object", "additionalProperties": false, "properties": { "key": { "type": "string", "pattern": "^[a-z][a-z0-9_]{0,39}$" }, "label": { "type": "string", "maxLength": 80 }, "type": { "enum": [ "text", "number", "boolean" ] }, "required": { "type": "boolean" }, "maxLength": { "type": "integer", "minimum": 1, "maximum": 4000 }, "defaultValue": { "type": [ "string", "number", "boolean" ] } }, "required": [ "key" ] }, "maxItems": 20 } }, "required": [] }, "example": { "schemaVersion": 1, "kind": "preset", "baseTemplateId": "android", "rendererContractVersion": 1, "appearance": { "light": { "background": "#f8fafc", "surface": "#ffffff", "border": "#e2e8f0", "text": "#0f172a", "muted": "#64748b", "accent": "#0284c7", "secondary": "#059669", "tertiary": "#f1f5f9" }, "dark": { "background": "#0c0d0e", "surface": "#141517", "border": "#26272b", "text": "#f4f4f5", "muted": "#a1a1aa", "accent": "#0284c7", "secondary": "#10b981", "tertiary": "#1c1d20" }, "fontFamily": "system", "radius": "large", "spacing": "comfortable" }, "content": {}, "variables": [] } }, "meta": { "requestId": "req_00000000000040008000000000000001" }}| Campo | Tipo | Obrigatório | Significado e limites |
|---|---|---|---|
data |
TemplateSchemaResult | sim | Resultado tipado da operação. |
data.baseTemplateId |
android / ios / recovery | sim | Valor tipado; formato e restrições completos no schema abaixo. |
data.limits |
object | sim | Valor tipado; formato e restrições completos no schema abaixo. |
data.schema |
object | sim | Valor tipado; formato e restrições completos no schema abaixo. |
data.example |
TemplateConfig | sim | Valor tipado; formato e restrições completos no schema abaixo. |
data.example.schemaVersion |
objeto | não | Valor tipado; formato e restrições completos no schema abaixo. |
data.example.kind |
objeto | não | Valor tipado; formato e restrições completos no schema abaixo. |
data.example.baseTemplateId |
android / ios / recovery | não | Valor tipado; formato e restrições completos no schema abaixo. |
data.example.rendererContractVersion |
objeto | não | Valor tipado; formato e restrições completos no schema abaixo. |
data.example.appearance |
object | não | Valor tipado; formato e restrições completos no schema abaixo. |
data.example.appearance.light |
object | não | Valor tipado; formato e restrições completos no schema abaixo. |
data.example.appearance.light.background |
string | não | Valor tipado; formato e restrições completos no schema abaixo. Formato validado pelo schema |
data.example.appearance.light.surface |
string | não | Valor tipado; formato e restrições completos no schema abaixo. Formato validado pelo schema |
data.example.appearance.light.border |
string | não | Valor tipado; formato e restrições completos no schema abaixo. Formato validado pelo schema |
data.example.appearance.light.text |
string | não | Valor tipado; formato e restrições completos no schema abaixo. Formato validado pelo schema |
data.example.appearance.light.muted |
string | não | Valor tipado; formato e restrições completos no schema abaixo. Formato validado pelo schema |
data.example.appearance.light.accent |
string | não | Valor tipado; formato e restrições completos no schema abaixo. Formato validado pelo schema |
data.example.appearance.light.secondary |
string | não | Valor tipado; formato e restrições completos no schema abaixo. Formato validado pelo schema |
data.example.appearance.light.tertiary |
string | não | Valor tipado; formato e restrições completos no schema abaixo. Formato validado pelo schema |
data.example.appearance.dark |
object | não | Valor tipado; formato e restrições completos no schema abaixo. |
data.example.appearance.dark.background |
string | não | Valor tipado; formato e restrições completos no schema abaixo. Formato validado pelo schema |
data.example.appearance.dark.surface |
string | não | Valor tipado; formato e restrições completos no schema abaixo. Formato validado pelo schema |
data.example.appearance.dark.border |
string | não | Valor tipado; formato e restrições completos no schema abaixo. Formato validado pelo schema |
data.example.appearance.dark.text |
string | não | Valor tipado; formato e restrições completos no schema abaixo. Formato validado pelo schema |
data.example.appearance.dark.muted |
string | não | Valor tipado; formato e restrições completos no schema abaixo. Formato validado pelo schema |
data.example.appearance.dark.accent |
string | não | Valor tipado; formato e restrições completos no schema abaixo. Formato validado pelo schema |
data.example.appearance.dark.secondary |
string | não | Valor tipado; formato e restrições completos no schema abaixo. Formato validado pelo schema |
data.example.appearance.dark.tertiary |
string | não | Valor tipado; formato e restrições completos no schema abaixo. Formato validado pelo schema |
data.example.appearance.fontFamily |
system / sans / serif | não | Valor tipado; formato e restrições completos no schema abaixo. |
data.example.appearance.radius |
small / medium / large | não | Valor tipado; formato e restrições completos no schema abaixo. |
data.example.appearance.spacing |
compact / comfortable | não | Valor tipado; formato e restrições completos no schema abaixo. |
data.example.appearance.logoAssetId |
string | não | Valor tipado; formato e restrições completos no schema abaixo. Até 100 caracteres |
data.example.content |
object | não | Conteúdo UTF-8 enviado inline; não é URL para busca. |
data.example.content.heading |
string | não | Valor tipado; formato e restrições completos no schema abaixo. Até 120 caracteres |
data.example.content.supportingText |
string | não | Valor tipado; formato e restrições completos no schema abaixo. Até 1000 caracteres |
data.example.content.actionLabels |
object | não | Valor tipado; formato e restrições completos no schema abaixo. |
data.example.content.details |
array | não | Valor tipado; formato e restrições completos no schema abaixo. Até 4 itens |
data.example.content.details[].label |
string | sim | Valor tipado; formato e restrições completos no schema abaixo. Até 80 caracteres |
data.example.content.details[].value |
string | sim | Valor tipado; formato e restrições completos no schema abaixo. Até 1000 caracteres |
data.example.variables |
array | não | Valor tipado; formato e restrições completos no schema abaixo. Até 20 itens |
data.example.variables[].key |
string | sim | Valor tipado; formato e restrições completos no schema abaixo. Formato validado pelo schema |
data.example.variables[].label |
string | não | Valor tipado; formato e restrições completos no schema abaixo. Até 80 caracteres |
data.example.variables[].type |
text / number / boolean | não | Valor tipado; formato e restrições completos no schema abaixo. |
data.example.variables[].required |
boolean | não | Valor tipado; formato e restrições completos no schema abaixo. |
data.example.variables[].maxLength |
integer | não | Valor tipado; formato e restrições completos no schema abaixo. Mínimo 1; Máximo 4000 |
data.example.variables[].defaultValue |
string,number,boolean | não | Valor tipado; formato e restrições completos no schema abaixo. |
meta |
Meta | sim | Correlação e informações da resposta. |
meta.requestId |
RequestId | sim | Identificador de correlação gerado pelo servidor. |
Falhas, revisão e repetição
Seção intitulada “Falhas, revisão e repetição”Respeite Retry-After quando existir. Leituras podem ser repetidas após falhas transitórias. Não faça retry automático ilimitado.
| Status | Significado |
|---|---|
| 400 | Cabeçalho, query, cursor ou JSON inválido. |
| 401 | Credencial inválida, expirada ou revogada. |
| 403 | Operação sem permissão ou capacidade desabilitada. |
| 404 | Recurso inexistente ou fora dos aplicativos autorizados. |
| 422 | JSON bem formado com dados de domínio inválidos. |
| 429 | Quota excedida. Respeitar Retry-After. |
| 500 | Falha interna. Use requestId para diagnóstico. |
| 503 | Dependência indisponível; resultado da mutação pode ser incerto. |
Exemplo 401
Seção intitulada “Exemplo 401”{ "error": { "code": "unauthenticated", "message": "Credencial inválida, expirada ou revogada.", "requestId": "req_00000000000040008000000000000001", "documentationUrl": "https://docs.agilink.io/api/errors/#unauthenticated" }}Exemplo 403
Seção intitulada “Exemplo 403”{ "error": { "code": "insufficient_permission", "message": "Operação sem permissão ou capacidade desabilitada.", "requestId": "req_00000000000040008000000000000001", "documentationUrl": "https://docs.agilink.io/api/errors/#insufficient-permission" }}Exemplo 429
Seção intitulada “Exemplo 429”{ "error": { "code": "rate_limited", "message": "Quota excedida. Respeitar Retry-After.", "requestId": "req_00000000000040008000000000000001", "documentationUrl": "https://docs.agilink.io/api/errors/#rate-limited" }}Schema completo e próximos passos
Seção intitulada “Schema completo e próximos passos”Schema de request
{ "description": "Sem corpo"}Schema de response
{ "type": "object", "additionalProperties": false, "properties": { "data": { "$ref": "#/components/schemas/TemplateSchemaResult" }, "meta": { "$ref": "#/components/schemas/Meta" } }, "required": [ "data", "meta" ]}Convenções e limites · Erros · Receitas completas · Guia funcional.