---
title: "GET /template-catalog/{baseId}/schema"
description: "Campos, variáveis, tipos e restrições — parâmetros, schemas e exemplos completos."
sidebar:
  hidden: true
---

**Campos, variáveis, tipos e restrições.** Contrato v1 · disponível em produção e homologação · operação `getTemplateCatalogBaseIdSchema`. [Guia funcional](/produto/templates/) · [Índice](/api/operacoes/) · [Schemas](/referencia/) · [Testar em sandbox](/console/?operation=getTemplateCatalogBaseIdSchema).

## 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

| 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

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.




## cURL

`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.

```sh
curl --request GET 'https://api.staging.agilink.io/v1/template-catalog/android/schema?appId=app_loja' \
  --header 'Authorization: Bearer <credencial>'
```

## JavaScript / TypeScript

```js
// 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

```python
# Python 3.10+; pip install requests
import os
import requests
headers = {
  "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

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" |

```json
{
  "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

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

```json
{
  "error": {
    "code": "unauthenticated",
    "message": "Credencial inválida, expirada ou revogada.",
    "requestId": "req_00000000000040008000000000000001",
    "documentationUrl": "https://docs.agilink.io/api/errors/#unauthenticated"
  }
}
```

### Exemplo 403

```json
{
  "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

```json
{
  "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

<details><summary>Schema de request</summary>

```json
{
  "description": "Sem corpo"
}
```

</details>

<details><summary>Schema de response</summary>

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "data": {
      "$ref": "#/components/schemas/TemplateSchemaResult"
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  },
  "required": [
    "data",
    "meta"
  ]
}
```

</details>

[Convenções e limites](/api/contratos/) · [Erros](/api/errors/) · [Receitas completas](/receitas/) · [Guia funcional](/produto/templates/).
