---
title: Endpoints de domínios, templates e publicação
description: Referência A3b com parâmetros e exemplos de request e response.
---

Estas 45 operações estão em homologação em `https://api.staging.agilink.io/v1`. Exemplos usam recursos fictícios. A referência interativa contém os schemas completos de cada campo, inclusive objetos internos. Leia também o [guia da integração](/api/dominios-templates-publicacao/) e a [migração de tokens](/api/migracao-tokens/).

Todas as requisições usam `Authorization: Bearer <credencial>`. Sessão humana e chave limitada são indicadas por operação. OAuth depende da Tarefa 2. Mutações exigem `Idempotency-Key` UUID v4; revisões, quando exigidas, usam `If-Match: "<revision>"`. Nunca envie credenciais em query strings.

## GET /domains

Listar domínios autorizados e estados.

Permissão: `domains:read`. Credencial: sessão humana ou chave de API com acesso ao aplicativo.

| Parâmetro | Local | Obrigatório | Significado |
| --- | --- | --- | --- |
| `appId` | query | sim | AppId |
| `limit` | query | não | integer |
| `cursor` | query | não | Cursor |
| `detached` | query | não | — |

Sem corpo de requisição.

Exemplo completo de requisição (substitua os identificadores fictícios):

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

Resposta: `200`. Sucesso. Exemplo fictício.

| Header | Significado | Exemplo |
| --- | --- | --- |
| `X-Request-Id` | Identificador gerado pelo servidor, inclusive para falhas e replays. | — |
| `Cache-Control` | Respostas administrativas não podem ser armazenadas. | no-store, no-transform |

```json
{
  "data": [
    {
      "id": "domain_loja",
      "appId": "app_loja",
      "hostname": "go.example.com",
      "mode": "external",
      "ownership": "unverified",
      "dns": "pending",
      "https": "pending",
      "links": "pending",
      "detached": false,
      "removalState": null,
      "canManageDns": false,
      "zoneName": "example.com",
      "nameservers": [],
      "challenge": null,
      "connectionRecords": [],
      "nativeConfig": {},
      "revision": "20000000-0000-4000-8000-000000000001",
      "createdAt": "2026-10-19T20:00:00Z",
      "updatedAt": "2026-10-19T20:00:00Z",
      "publication": {
        "status": "pending",
        "desiredRevision": "20000000-0000-4000-8000-000000000001",
        "confirmedRevision": null,
        "updatedAt": "2026-10-19T20:00:00Z"
      },
      "lastCheckedAt": null,
      "lastError": null
    }
  ],
  "pagination": {
    "hasMore": false,
    "nextCursor": null
  },
  "meta": {
    "requestId": "req_00000000000040008000000000000001"
  }
}
```

Erros previstos: `400`, `401`, `403`, `404`, `422`, `429`, `500`, `503`. Veja [códigos e repetição](/api/errors/).

## POST /domains

Solicitar domínio de plataforma ou conectar domínio próprio.

Permissão: `domains:create`. Credencial: sessão humana ou chave de API com acesso ao aplicativo.

| Parâmetro | Local | Obrigatório | Significado |
| --- | --- | --- | --- |
| `Idempotency-Key` | header | sim | UUID v4 por intenção. Recibo por 24h. Mudança de payload/precondição retorna 409. Segredo de chave não é reexibido. |

Corpo: `application/json`. Campos desconhecidos são rejeitados.

| Campo | Tipo | Obrigatório | Restrição |
| --- | --- | --- | --- |
| `appId` | AppId | sim | Consulte o schema para restrições e campos internos |
| `mode` | — | sim | Valores: platform, managed, external |
| `prefix` | string | não | Máximo 32 caracteres |
| `hostname` | Domain | não | Consulte o schema para restrições e campos internos |
| `apexProfileId` | string | não | Máximo 100 caracteres |

```json
{
  "appId": "app_loja",
  "mode": "platform",
  "prefix": "minhaloja"
}
```

Exemplo completo de requisição (substitua os identificadores fictícios):

```sh
curl --request POST 'https://api.staging.agilink.io/v1/domains' \
  --header 'Authorization: Bearer <credencial>' \
  --header 'Idempotency-Key: 10000000-0000-4000-8000-000000000001' \
  --header 'Content-Type: application/json' \
  --data '{"appId":"app_loja","mode":"platform","prefix":"minhaloja"}'
```

Resposta: `202`. Sucesso. Exemplo fictício.

| Header | Significado | Exemplo |
| --- | --- | --- |
| `X-Request-Id` | Identificador gerado pelo servidor, inclusive para falhas e replays. | — |
| `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" |
| `Location` | Operação a acompanhar. | /v1/operations/op_example |
| `Retry-After` | Segundos até a próxima consulta. | 1 |

```json
{
  "data": {
    "id": "op_example",
    "appId": "app_loja",
    "type": "link.resync",
    "status": "queued",
    "createdAt": "2026-10-19T20:00:00Z",
    "updatedAt": "2026-10-19T20:00:00Z",
    "revision": "20000000-0000-4000-8000-000000000001",
    "result": null,
    "error": null
  },
  "meta": {
    "requestId": "req_00000000000040008000000000000001"
  }
}
```

Erros previstos: `400`, `401`, `403`, `404`, `409`, `413`, `415`, `422`, `429`, `500`, `503`. Veja [códigos e repetição](/api/errors/).

## GET /domains/{domainId}

Detalhe, instruções e pendências.

Permissão: `domains:read`. Credencial: sessão humana ou chave de API com acesso ao aplicativo.

| Parâmetro | Local | Obrigatório | Significado |
| --- | --- | --- | --- |
| `domainId` | path | sim | OpaqueId |

Sem corpo de requisição.

Exemplo completo de requisição (substitua os identificadores fictícios):

```sh
curl --request GET 'https://api.staging.agilink.io/v1/domains/domain_example' \
  --header 'Authorization: Bearer <credencial>'
```

Resposta: `200`. Sucesso. Exemplo fictício.

| Header | Significado | Exemplo |
| --- | --- | --- |
| `X-Request-Id` | Identificador gerado pelo servidor, inclusive para falhas e replays. | — |
| `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": {
    "id": "domain_loja",
    "appId": "app_loja",
    "hostname": "go.example.com",
    "mode": "external",
    "ownership": "unverified",
    "dns": "pending",
    "https": "pending",
    "links": "pending",
    "detached": false,
    "removalState": null,
    "canManageDns": false,
    "zoneName": "example.com",
    "nameservers": [],
    "challenge": null,
    "connectionRecords": [],
    "nativeConfig": {},
    "revision": "20000000-0000-4000-8000-000000000001",
    "createdAt": "2026-10-19T20:00:00Z",
    "updatedAt": "2026-10-19T20:00:00Z",
    "publication": {
      "status": "pending",
      "desiredRevision": "20000000-0000-4000-8000-000000000001",
      "confirmedRevision": null,
      "updatedAt": "2026-10-19T20:00:00Z"
    },
    "lastCheckedAt": null,
    "lastError": null
  },
  "meta": {
    "requestId": "req_00000000000040008000000000000001"
  }
}
```

Erros previstos: `400`, `401`, `403`, `404`, `422`, `429`, `500`, `503`. Veja [códigos e repetição](/api/errors/).

## DELETE /domains/{domainId}

Desvincular com dependências e operação recuperável.

Permissão: `domains:delete`. Credencial: sessão humana ou chave de API com acesso ao aplicativo.

| Parâmetro | Local | Obrigatório | Significado |
| --- | --- | --- | --- |
| `domainId` | path | sim | OpaqueId |
| `Idempotency-Key` | header | sim | UUID v4 por intenção. Recibo por 24h. Mudança de payload/precondição retorna 409. Segredo de chave não é reexibido. |
| `If-Match` | header | sim | ETag forte obtido em consulta. Ausência 428; revisão antiga 412. |

Sem corpo de requisição.

Exemplo completo de requisição (substitua os identificadores fictícios):

```sh
curl --request DELETE 'https://api.staging.agilink.io/v1/domains/domain_example' \
  --header 'Authorization: Bearer <credencial>' \
  --header 'Idempotency-Key: 10000000-0000-4000-8000-000000000001' \
  --header 'If-Match: "20000000-0000-4000-8000-000000000001"'
```

Resposta: `202`. Sucesso. Exemplo fictício.

| Header | Significado | Exemplo |
| --- | --- | --- |
| `X-Request-Id` | Identificador gerado pelo servidor, inclusive para falhas e replays. | — |
| `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" |
| `Location` | Operação a acompanhar. | /v1/operations/op_example |
| `Retry-After` | Segundos até a próxima consulta. | 1 |

```json
{
  "data": {
    "id": "op_example",
    "appId": "app_loja",
    "type": "link.resync",
    "status": "queued",
    "createdAt": "2026-10-19T20:00:00Z",
    "updatedAt": "2026-10-19T20:00:00Z",
    "revision": "20000000-0000-4000-8000-000000000001",
    "result": null,
    "error": null
  },
  "meta": {
    "requestId": "req_00000000000040008000000000000001"
  }
}
```

Erros previstos: `400`, `401`, `403`, `404`, `409`, `412`, `413`, `422`, `428`, `429`, `500`, `503`. Veja [códigos e repetição](/api/errors/).

## GET /domains/{domainId}/capabilities

Ações possíveis para aquele modo e usuário.

Permissão: `capabilities:read`. Credencial: sessão humana ou chave de API com acesso ao aplicativo.

| Parâmetro | Local | Obrigatório | Significado |
| --- | --- | --- | --- |
| `domainId` | path | sim | OpaqueId |

Sem corpo de requisição.

Exemplo completo de requisição (substitua os identificadores fictícios):

```sh
curl --request GET 'https://api.staging.agilink.io/v1/domains/domain_example/capabilities' \
  --header 'Authorization: Bearer <credencial>'
```

Resposta: `200`. Sucesso. Exemplo fictício.

| Header | Significado | Exemplo |
| --- | --- | --- |
| `X-Request-Id` | Identificador gerado pelo servidor, inclusive para falhas e replays. | — |
| `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": {
    "domainId": "domain_loja",
    "appId": "app_loja",
    "revision": "20000000-0000-4000-8000-000000000001",
    "mode": "external",
    "actions": {
      "verify": true,
      "detach": true,
      "dns": false,
      "nativeConfig": false,
      "webConfig": false,
      "recovery": false,
      "templates": true
    },
    "reasons": {
      "dns": "DNS externo permanece no seu provedor."
    }
  },
  "meta": {
    "requestId": "req_00000000000040008000000000000001"
  }
}
```

Erros previstos: `400`, `401`, `403`, `404`, `422`, `429`, `500`, `503`. Veja [códigos e repetição](/api/errors/).

## POST /domains/{domainId}/verify

Verificar propriedade, DNS, TLS e prontidão.

Permissão: `domains:verify`. Credencial: sessão humana ou chave de API com acesso ao aplicativo.

| Parâmetro | Local | Obrigatório | Significado |
| --- | --- | --- | --- |
| `domainId` | path | sim | OpaqueId |
| `Idempotency-Key` | header | sim | UUID v4 por intenção. Recibo por 24h. Mudança de payload/precondição retorna 409. Segredo de chave não é reexibido. |
| `If-Match` | header | sim | ETag forte obtido em consulta. Ausência 428; revisão antiga 412. |

Corpo: `application/json`. Campos desconhecidos são rejeitados.

| Campo | Tipo | Obrigatório | Restrição |
| --- | --- | --- | --- |


```json
{}
```

Exemplo completo de requisição (substitua os identificadores fictícios):

```sh
curl --request POST 'https://api.staging.agilink.io/v1/domains/domain_example/verify' \
  --header 'Authorization: Bearer <credencial>' \
  --header 'Idempotency-Key: 10000000-0000-4000-8000-000000000001' \
  --header 'If-Match: "20000000-0000-4000-8000-000000000001"' \
  --header 'Content-Type: application/json' \
  --data '{}'
```

Resposta: `202`. Sucesso. Exemplo fictício.

| Header | Significado | Exemplo |
| --- | --- | --- |
| `X-Request-Id` | Identificador gerado pelo servidor, inclusive para falhas e replays. | — |
| `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" |
| `Location` | Operação a acompanhar. | /v1/operations/op_example |
| `Retry-After` | Segundos até a próxima consulta. | 1 |

```json
{
  "data": {
    "id": "op_example",
    "appId": "app_loja",
    "type": "link.resync",
    "status": "queued",
    "createdAt": "2026-10-19T20:00:00Z",
    "updatedAt": "2026-10-19T20:00:00Z",
    "revision": "20000000-0000-4000-8000-000000000001",
    "result": null,
    "error": null
  },
  "meta": {
    "requestId": "req_00000000000040008000000000000001"
  }
}
```

Erros previstos: `400`, `401`, `403`, `404`, `409`, `412`, `413`, `415`, `422`, `428`, `429`, `500`, `503`. Veja [códigos e repetição](/api/errors/).

## GET /domains/{domainId}/native-config

Configuração Android, iOS, scheme e rotas.

Permissão: `native_config:read`. Credencial: sessão humana ou chave de API com acesso ao aplicativo.

| Parâmetro | Local | Obrigatório | Significado |
| --- | --- | --- | --- |
| `domainId` | path | sim | OpaqueId |

Sem corpo de requisição.

Exemplo completo de requisição (substitua os identificadores fictícios):

```sh
curl --request GET 'https://api.staging.agilink.io/v1/domains/domain_example/native-config' \
  --header 'Authorization: Bearer <credencial>'
```

Resposta: `200`. Sucesso. Exemplo fictício.

| Header | Significado | Exemplo |
| --- | --- | --- |
| `X-Request-Id` | Identificador gerado pelo servidor, inclusive para falhas e replays. | — |
| `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": {
    "domainId": "domain_loja",
    "appId": "app_loja",
    "revision": "20000000-0000-4000-8000-000000000001",
    "config": {},
    "publication": {
      "status": "pending",
      "desiredRevision": "20000000-0000-4000-8000-000000000001",
      "confirmedRevision": null,
      "updatedAt": "2026-10-19T20:00:00Z"
    }
  },
  "meta": {
    "requestId": "req_00000000000040008000000000000001"
  }
}
```

Erros previstos: `400`, `401`, `403`, `404`, `422`, `429`, `500`, `503`. Veja [códigos e repetição](/api/errors/).

## PUT /domains/{domainId}/native-config

Configuração Android, iOS, scheme e rotas.

Permissão: `native_config:update`. Credencial: sessão humana ou chave de API com acesso ao aplicativo.

| Parâmetro | Local | Obrigatório | Significado |
| --- | --- | --- | --- |
| `domainId` | path | sim | OpaqueId |
| `Idempotency-Key` | header | sim | UUID v4 por intenção. Recibo por 24h. Mudança de payload/precondição retorna 409. Segredo de chave não é reexibido. |
| `If-Match` | header | sim | ETag forte obtido em consulta. Ausência 428; revisão antiga 412. |

Corpo: `application/json`. Campos desconhecidos são rejeitados.

| Campo | Tipo | Obrigatório | Restrição |
| --- | --- | --- | --- |
| `androidPackage` | string | não | Máximo 255 caracteres |
| `fingerprints` | array | não | Consulte o schema para restrições e campos internos |
| `ios` | object / null | não | Consulte o schema para restrições e campos internos |
| `routing` | object / null | não | Consulte o schema para restrições e campos internos |

```json
{
  "androidPackage": "com.example.loja",
  "fingerprints": [
    "AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA"
  ]
}
```

Exemplo completo de requisição (substitua os identificadores fictícios):

```sh
curl --request PUT 'https://api.staging.agilink.io/v1/domains/domain_example/native-config' \
  --header 'Authorization: Bearer <credencial>' \
  --header 'Idempotency-Key: 10000000-0000-4000-8000-000000000001' \
  --header 'If-Match: "20000000-0000-4000-8000-000000000001"' \
  --header 'Content-Type: application/json' \
  --data '{"androidPackage":"com.example.loja","fingerprints":["AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA"]}'
```

Resposta: `200`. Sucesso. Exemplo fictício.

| Header | Significado | Exemplo |
| --- | --- | --- |
| `X-Request-Id` | Identificador gerado pelo servidor, inclusive para falhas e replays. | — |
| `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": {
    "domainId": "domain_loja",
    "appId": "app_loja",
    "revision": "20000000-0000-4000-8000-000000000001",
    "config": {},
    "publication": {
      "status": "pending",
      "desiredRevision": "20000000-0000-4000-8000-000000000001",
      "confirmedRevision": null,
      "updatedAt": "2026-10-19T20:00:00Z"
    }
  },
  "meta": {
    "requestId": "req_00000000000040008000000000000001"
  }
}
```

Erros previstos: `400`, `401`, `403`, `404`, `409`, `412`, `413`, `415`, `422`, `428`, `429`, `500`, `503`. Veja [códigos e repetição](/api/errors/).

## GET /domains/{domainId}/web-config

Destino web, metadados e prefixo.

Permissão: `web_config:read`. Credencial: sessão humana ou chave de API com acesso ao aplicativo.

| Parâmetro | Local | Obrigatório | Significado |
| --- | --- | --- | --- |
| `domainId` | path | sim | OpaqueId |

Sem corpo de requisição.

Exemplo completo de requisição (substitua os identificadores fictícios):

```sh
curl --request GET 'https://api.staging.agilink.io/v1/domains/domain_example/web-config' \
  --header 'Authorization: Bearer <credencial>'
```

Resposta: `200`. Sucesso. Exemplo fictício.

| Header | Significado | Exemplo |
| --- | --- | --- |
| `X-Request-Id` | Identificador gerado pelo servidor, inclusive para falhas e replays. | — |
| `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": {
    "domainId": "domain_loja",
    "appId": "app_loja",
    "revision": "20000000-0000-4000-8000-000000000001",
    "config": {},
    "publication": {
      "status": "pending",
      "desiredRevision": "20000000-0000-4000-8000-000000000001",
      "confirmedRevision": null,
      "updatedAt": "2026-10-19T20:00:00Z"
    }
  },
  "meta": {
    "requestId": "req_00000000000040008000000000000001"
  }
}
```

Erros previstos: `400`, `401`, `403`, `404`, `422`, `429`, `500`, `503`. Veja [códigos e repetição](/api/errors/).

## PUT /domains/{domainId}/web-config

Destino web, metadados e prefixo.

Permissão: `web_config:update`. Credencial: sessão humana ou chave de API com acesso ao aplicativo.

| Parâmetro | Local | Obrigatório | Significado |
| --- | --- | --- | --- |
| `domainId` | path | sim | OpaqueId |
| `Idempotency-Key` | header | sim | UUID v4 por intenção. Recibo por 24h. Mudança de payload/precondição retorna 409. Segredo de chave não é reexibido. |
| `If-Match` | header | sim | ETag forte obtido em consulta. Ausência 428; revisão antiga 412. |

Corpo: `application/json`. Campos desconhecidos são rejeitados.

| Campo | Tipo | Obrigatório | Restrição |
| --- | --- | --- | --- |
| `flutterUrl` | string | não | Máximo 4096 caracteres |
| `flutterName` | string | não | Máximo 100 caracteres |
| `flutterDescription` | string | não | Máximo 300 caracteres |
| `flutterRoutePrefix` | string | não | Máximo 200 caracteres |

```json
{
  "flutterUrl": "https://shop.example.com",
  "flutterRoutePrefix": "/produtos/",
  "flutterName": "Loja"
}
```

Exemplo completo de requisição (substitua os identificadores fictícios):

```sh
curl --request PUT 'https://api.staging.agilink.io/v1/domains/domain_example/web-config' \
  --header 'Authorization: Bearer <credencial>' \
  --header 'Idempotency-Key: 10000000-0000-4000-8000-000000000001' \
  --header 'If-Match: "20000000-0000-4000-8000-000000000001"' \
  --header 'Content-Type: application/json' \
  --data '{"flutterUrl":"https://shop.example.com","flutterRoutePrefix":"/produtos/","flutterName":"Loja"}'
```

Resposta: `200`. Sucesso. Exemplo fictício.

| Header | Significado | Exemplo |
| --- | --- | --- |
| `X-Request-Id` | Identificador gerado pelo servidor, inclusive para falhas e replays. | — |
| `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": {
    "domainId": "domain_loja",
    "appId": "app_loja",
    "revision": "20000000-0000-4000-8000-000000000001",
    "config": {},
    "publication": {
      "status": "pending",
      "desiredRevision": "20000000-0000-4000-8000-000000000001",
      "confirmedRevision": null,
      "updatedAt": "2026-10-19T20:00:00Z"
    }
  },
  "meta": {
    "requestId": "req_00000000000040008000000000000001"
  }
}
```

Erros previstos: `400`, `401`, `403`, `404`, `409`, `412`, `413`, `415`, `422`, `428`, `429`, `500`, `503`. Veja [códigos e repetição](/api/errors/).

## GET /domains/{domainId}/recovery-config

Opções de recuperação disponíveis.

Permissão: `recovery_config:read`. Credencial: sessão humana ou chave de API com acesso ao aplicativo.

| Parâmetro | Local | Obrigatório | Significado |
| --- | --- | --- | --- |
| `domainId` | path | sim | OpaqueId |

Sem corpo de requisição.

Exemplo completo de requisição (substitua os identificadores fictícios):

```sh
curl --request GET 'https://api.staging.agilink.io/v1/domains/domain_example/recovery-config' \
  --header 'Authorization: Bearer <credencial>'
```

Resposta: `200`. Sucesso. Exemplo fictício.

| Header | Significado | Exemplo |
| --- | --- | --- |
| `X-Request-Id` | Identificador gerado pelo servidor, inclusive para falhas e replays. | — |
| `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": {
    "domainId": "domain_loja",
    "appId": "app_loja",
    "revision": "20000000-0000-4000-8000-000000000001",
    "config": {},
    "publication": {
      "status": "pending",
      "desiredRevision": "20000000-0000-4000-8000-000000000001",
      "confirmedRevision": null,
      "updatedAt": "2026-10-19T20:00:00Z"
    }
  },
  "meta": {
    "requestId": "req_00000000000040008000000000000001"
  }
}
```

Erros previstos: `400`, `401`, `403`, `404`, `422`, `429`, `500`, `503`. Veja [códigos e repetição](/api/errors/).

## PUT /domains/{domainId}/recovery-config

Opções de recuperação disponíveis.

Permissão: `recovery_config:update`. Credencial: sessão humana ou chave de API com acesso ao aplicativo.

| Parâmetro | Local | Obrigatório | Significado |
| --- | --- | --- | --- |
| `domainId` | path | sim | OpaqueId |
| `Idempotency-Key` | header | sim | UUID v4 por intenção. Recibo por 24h. Mudança de payload/precondição retorna 409. Segredo de chave não é reexibido. |
| `If-Match` | header | sim | ETag forte obtido em consulta. Ausência 428; revisão antiga 412. |

Corpo: `application/json`. Campos desconhecidos são rejeitados.

| Campo | Tipo | Obrigatório | Restrição |
| --- | --- | --- | --- |
| `enabled` | boolean | sim | Consulte o schema para restrições e campos internos |
| `sdkReady` | boolean | sim | Consulte o schema para restrições e campos internos |
| `appClipBundleId` | string | não | Máximo 255 caracteres |
| `detection` | object | não | Consulte o schema para restrições e campos internos |

```json
{
  "enabled": false,
  "sdkReady": false
}
```

Exemplo completo de requisição (substitua os identificadores fictícios):

```sh
curl --request PUT 'https://api.staging.agilink.io/v1/domains/domain_example/recovery-config' \
  --header 'Authorization: Bearer <credencial>' \
  --header 'Idempotency-Key: 10000000-0000-4000-8000-000000000001' \
  --header 'If-Match: "20000000-0000-4000-8000-000000000001"' \
  --header 'Content-Type: application/json' \
  --data '{"enabled":false,"sdkReady":false}'
```

Resposta: `200`. Sucesso. Exemplo fictício.

| Header | Significado | Exemplo |
| --- | --- | --- |
| `X-Request-Id` | Identificador gerado pelo servidor, inclusive para falhas e replays. | — |
| `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": {
    "domainId": "domain_loja",
    "appId": "app_loja",
    "revision": "20000000-0000-4000-8000-000000000001",
    "config": {},
    "publication": {
      "status": "pending",
      "desiredRevision": "20000000-0000-4000-8000-000000000001",
      "confirmedRevision": null,
      "updatedAt": "2026-10-19T20:00:00Z"
    }
  },
  "meta": {
    "requestId": "req_00000000000040008000000000000001"
  }
}
```

Erros previstos: `400`, `401`, `403`, `404`, `409`, `412`, `413`, `415`, `422`, `428`, `429`, `500`, `503`. Veja [códigos e repetição](/api/errors/).

## GET /domains/{domainId}/diagnostics

Diagnóstico estruturado das associações e publicação.

Permissão: `domains:read`. Credencial: sessão humana ou chave de API com acesso ao aplicativo.

| Parâmetro | Local | Obrigatório | Significado |
| --- | --- | --- | --- |
| `domainId` | path | sim | OpaqueId |

Sem corpo de requisição.

Exemplo completo de requisição (substitua os identificadores fictícios):

```sh
curl --request GET 'https://api.staging.agilink.io/v1/domains/domain_example/diagnostics' \
  --header 'Authorization: Bearer <credencial>'
```

Resposta: `200`. Sucesso. Exemplo fictício.

| Header | Significado | Exemplo |
| --- | --- | --- |
| `X-Request-Id` | Identificador gerado pelo servidor, inclusive para falhas e replays. | — |
| `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": {
    "domainId": "domain_loja",
    "appId": "app_loja",
    "revision": "20000000-0000-4000-8000-000000000001",
    "configurationSaved": true,
    "publication": {
      "status": "pending",
      "desiredRevision": "20000000-0000-4000-8000-000000000001",
      "confirmedRevision": null,
      "updatedAt": "2026-10-19T20:00:00Z"
    },
    "ownership": "unverified",
    "dns": "pending",
    "https": "pending",
    "links": "pending",
    "androidConfigured": false,
    "iosConfigured": false,
    "deviceAssociationTested": false,
    "appClipVerified": false,
    "notes": [
      "Configuração salva não prova associação em aparelho."
    ]
  },
  "meta": {
    "requestId": "req_00000000000040008000000000000001"
  }
}
```

Erros previstos: `400`, `401`, `403`, `404`, `422`, `429`, `500`, `503`. Veja [códigos e repetição](/api/errors/).

## GET /domain-options

Opções de plataforma e orientações suportadas de domínio raiz.

Permissão: `domains:read`. Credencial: sessão humana ou chave de API com acesso ao aplicativo.

| Parâmetro | Local | Obrigatório | Significado |
| --- | --- | --- | --- |
| `appId` | query | sim | AppId |

Sem corpo de requisição.

Exemplo completo de requisição (substitua os identificadores fictícios):

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

Resposta: `200`. Sucesso. Exemplo fictício.

| Header | Significado | Exemplo |
| --- | --- | --- |
| `X-Request-Id` | Identificador gerado pelo servidor, inclusive para falhas e replays. | — |
| `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": {
    "appId": "app_loja",
    "enabled": true,
    "mutationsEnabled": true,
    "platformDomain": "links.staging.agilink.io",
    "modes": [
      "platform"
    ],
    "externalDns": {
      "enabled": false,
      "apexProfiles": []
    }
  },
  "meta": {
    "requestId": "req_00000000000040008000000000000001"
  }
}
```

Erros previstos: `400`, `401`, `403`, `404`, `422`, `429`, `500`, `503`. Veja [códigos e repetição](/api/errors/).

## GET /domains/{domainId}/dns-records

Listar registros administráveis.

Permissão: `dns:read`. Credencial: sessão humana ou chave de API com acesso ao aplicativo.

| Parâmetro | Local | Obrigatório | Significado |
| --- | --- | --- | --- |
| `domainId` | path | sim | OpaqueId |
| `limit` | query | não | integer |
| `cursor` | query | não | Cursor |

Sem corpo de requisição.

Exemplo completo de requisição (substitua os identificadores fictícios):

```sh
curl --request GET 'https://api.staging.agilink.io/v1/domains/domain_example/dns-records' \
  --header 'Authorization: Bearer <credencial>'
```

Resposta: `200`. Sucesso. Exemplo fictício.

| Header | Significado | Exemplo |
| --- | --- | --- |
| `X-Request-Id` | Identificador gerado pelo servidor, inclusive para falhas e replays. | — |
| `Cache-Control` | Respostas administrativas não podem ser armazenadas. | no-store, no-transform |

```json
{
  "data": [
    {
      "id": "record_example",
      "name": "_example.go.example.com",
      "type": "TXT",
      "content": "example",
      "ttl": 300,
      "proxied": false,
      "priority": null,
      "version": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
      "revision": "20000000-0000-4000-8000-000000000001",
      "canEdit": true,
      "canDelete": true,
      "protectedReason": null
    }
  ],
  "pagination": {
    "hasMore": false,
    "nextCursor": null
  },
  "meta": {
    "requestId": "req_00000000000040008000000000000001"
  }
}
```

Erros previstos: `400`, `401`, `403`, `404`, `422`, `429`, `500`, `503`. Veja [códigos e repetição](/api/errors/).

## POST /domains/{domainId}/dns-records

Criar registro permitido.

Permissão: `dns:create`. Credencial: sessão humana ou chave de API com acesso ao aplicativo.

| Parâmetro | Local | Obrigatório | Significado |
| --- | --- | --- | --- |
| `domainId` | path | sim | OpaqueId |
| `Idempotency-Key` | header | sim | UUID v4 por intenção. Recibo por 24h. Mudança de payload/precondição retorna 409. Segredo de chave não é reexibido. |
| `If-Match` | header | sim | ETag forte obtido em consulta. Ausência 428; revisão antiga 412. |

Corpo: `application/json`. Campos desconhecidos são rejeitados.

| Campo | Tipo | Obrigatório | Restrição |
| --- | --- | --- | --- |
| `type` | — | sim | Valores: A, AAAA, CNAME, TXT, MX |
| `name` | string | sim | Máximo 253 caracteres |
| `content` | string | sim | Máximo 2048 caracteres |
| `ttl` | integer | sim | Consulte o schema para restrições e campos internos |
| `proxied` | boolean | não | Consulte o schema para restrições e campos internos |
| `priority` | integer | não | Consulte o schema para restrições e campos internos |

```json
{
  "type": "TXT",
  "name": "_example.go.example.com",
  "content": "example",
  "ttl": 300,
  "proxied": false
}
```

Exemplo completo de requisição (substitua os identificadores fictícios):

```sh
curl --request POST 'https://api.staging.agilink.io/v1/domains/domain_example/dns-records' \
  --header 'Authorization: Bearer <credencial>' \
  --header 'Idempotency-Key: 10000000-0000-4000-8000-000000000001' \
  --header 'If-Match: "20000000-0000-4000-8000-000000000001"' \
  --header 'Content-Type: application/json' \
  --data '{"type":"TXT","name":"_example.go.example.com","content":"example","ttl":300,"proxied":false}'
```

Resposta: `202`. Sucesso. Exemplo fictício.

| Header | Significado | Exemplo |
| --- | --- | --- |
| `X-Request-Id` | Identificador gerado pelo servidor, inclusive para falhas e replays. | — |
| `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" |
| `Location` | Operação a acompanhar. | /v1/operations/op_example |
| `Retry-After` | Segundos até a próxima consulta. | 1 |

```json
{
  "data": {
    "id": "op_example",
    "appId": "app_loja",
    "type": "link.resync",
    "status": "queued",
    "createdAt": "2026-10-19T20:00:00Z",
    "updatedAt": "2026-10-19T20:00:00Z",
    "revision": "20000000-0000-4000-8000-000000000001",
    "result": null,
    "error": null
  },
  "meta": {
    "requestId": "req_00000000000040008000000000000001"
  }
}
```

Erros previstos: `400`, `401`, `403`, `404`, `409`, `412`, `413`, `415`, `422`, `428`, `429`, `500`, `503`. Veja [códigos e repetição](/api/errors/).

## PATCH /domains/{domainId}/dns-records/{recordId}

Alterar/remover registro permitido.

Permissão: `dns:update`. Credencial: sessão humana ou chave de API com acesso ao aplicativo.

| Parâmetro | Local | Obrigatório | Significado |
| --- | --- | --- | --- |
| `domainId` | path | sim | OpaqueId |
| `recordId` | path | sim | OpaqueId |
| `Idempotency-Key` | header | sim | UUID v4 por intenção. Recibo por 24h. Mudança de payload/precondição retorna 409. Segredo de chave não é reexibido. |
| `If-Match` | header | sim | ETag forte obtido em consulta. Ausência 428; revisão antiga 412. |

Corpo: `application/json`. Campos desconhecidos são rejeitados.

| Campo | Tipo | Obrigatório | Restrição |
| --- | --- | --- | --- |
| `type` | — | sim | Valores: A, AAAA, CNAME, TXT, MX |
| `name` | string | sim | Máximo 253 caracteres |
| `content` | string | sim | Máximo 2048 caracteres |
| `ttl` | integer | sim | Consulte o schema para restrições e campos internos |
| `proxied` | boolean | não | Consulte o schema para restrições e campos internos |
| `priority` | integer | não | Consulte o schema para restrições e campos internos |

```json
{
  "type": "TXT",
  "name": "_example.go.example.com",
  "content": "example",
  "ttl": 300,
  "proxied": false
}
```

Exemplo completo de requisição (substitua os identificadores fictícios):

```sh
curl --request PATCH 'https://api.staging.agilink.io/v1/domains/domain_example/dns-records/record_example' \
  --header 'Authorization: Bearer <credencial>' \
  --header 'Idempotency-Key: 10000000-0000-4000-8000-000000000001' \
  --header 'If-Match: "20000000-0000-4000-8000-000000000001"' \
  --header 'Content-Type: application/json' \
  --data '{"type":"TXT","name":"_example.go.example.com","content":"example","ttl":300,"proxied":false}'
```

Resposta: `202`. Sucesso. Exemplo fictício.

| Header | Significado | Exemplo |
| --- | --- | --- |
| `X-Request-Id` | Identificador gerado pelo servidor, inclusive para falhas e replays. | — |
| `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" |
| `Location` | Operação a acompanhar. | /v1/operations/op_example |
| `Retry-After` | Segundos até a próxima consulta. | 1 |

```json
{
  "data": {
    "id": "op_example",
    "appId": "app_loja",
    "type": "link.resync",
    "status": "queued",
    "createdAt": "2026-10-19T20:00:00Z",
    "updatedAt": "2026-10-19T20:00:00Z",
    "revision": "20000000-0000-4000-8000-000000000001",
    "result": null,
    "error": null
  },
  "meta": {
    "requestId": "req_00000000000040008000000000000001"
  }
}
```

Erros previstos: `400`, `401`, `403`, `404`, `409`, `412`, `413`, `415`, `422`, `428`, `429`, `500`, `503`. Veja [códigos e repetição](/api/errors/).

## DELETE /domains/{domainId}/dns-records/{recordId}

Alterar/remover registro permitido.

Permissão: `dns:delete`. Credencial: sessão humana ou chave de API com acesso ao aplicativo.

| Parâmetro | Local | Obrigatório | Significado |
| --- | --- | --- | --- |
| `domainId` | path | sim | OpaqueId |
| `recordId` | path | sim | OpaqueId |
| `Idempotency-Key` | header | sim | UUID v4 por intenção. Recibo por 24h. Mudança de payload/precondição retorna 409. Segredo de chave não é reexibido. |
| `If-Match` | header | sim | ETag forte obtido em consulta. Ausência 428; revisão antiga 412. |

Sem corpo de requisição.

Exemplo completo de requisição (substitua os identificadores fictícios):

```sh
curl --request DELETE 'https://api.staging.agilink.io/v1/domains/domain_example/dns-records/record_example' \
  --header 'Authorization: Bearer <credencial>' \
  --header 'Idempotency-Key: 10000000-0000-4000-8000-000000000001' \
  --header 'If-Match: "20000000-0000-4000-8000-000000000001"'
```

Resposta: `202`. Sucesso. Exemplo fictício.

| Header | Significado | Exemplo |
| --- | --- | --- |
| `X-Request-Id` | Identificador gerado pelo servidor, inclusive para falhas e replays. | — |
| `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" |
| `Location` | Operação a acompanhar. | /v1/operations/op_example |
| `Retry-After` | Segundos até a próxima consulta. | 1 |

```json
{
  "data": {
    "id": "op_example",
    "appId": "app_loja",
    "type": "link.resync",
    "status": "queued",
    "createdAt": "2026-10-19T20:00:00Z",
    "updatedAt": "2026-10-19T20:00:00Z",
    "revision": "20000000-0000-4000-8000-000000000001",
    "result": null,
    "error": null
  },
  "meta": {
    "requestId": "req_00000000000040008000000000000001"
  }
}
```

Erros previstos: `400`, `401`, `403`, `404`, `409`, `412`, `413`, `422`, `428`, `429`, `500`, `503`. Veja [códigos e repetição](/api/errors/).

## GET /apps/{appId}/template-defaults

Padrões por app.

Permissão: `template_bindings:read`. Credencial: sessão humana ou chave de API com acesso ao aplicativo.

| Parâmetro | Local | Obrigatório | Significado |
| --- | --- | --- | --- |
| `appId` | path | sim | OpaqueId |

Sem corpo de requisição.

Exemplo completo de requisição (substitua os identificadores fictícios):

```sh
curl --request GET 'https://api.staging.agilink.io/v1/apps/app_loja/template-defaults' \
  --header 'Authorization: Bearer <credencial>'
```

Resposta: `200`. Sucesso. Exemplo fictício.

| Header | Significado | Exemplo |
| --- | --- | --- |
| `X-Request-Id` | Identificador gerado pelo servidor, inclusive para falhas e replays. | — |
| `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": {
    "appId": "app_loja",
    "scope": "app",
    "revision": "20000000-0000-4000-8000-000000000001",
    "enabled": true,
    "current": {
      "android": {
        "mode": "inherit"
      },
      "ios": {
        "mode": "inherit"
      },
      "recovery": {
        "mode": "inherit"
      }
    },
    "effective": {
      "android": {
        "mode": "inherit"
      },
      "ios": {
        "mode": "inherit"
      },
      "recovery": {
        "mode": "inherit"
      }
    },
    "inherited": {
      "android": {
        "mode": "inherit"
      },
      "ios": {
        "mode": "inherit"
      },
      "recovery": {
        "mode": "inherit"
      }
    },
    "templateData": {}
  },
  "meta": {
    "requestId": "req_00000000000040008000000000000001"
  }
}
```

Erros previstos: `400`, `401`, `403`, `404`, `422`, `429`, `500`, `503`. Veja [códigos e repetição](/api/errors/).

## PUT /apps/{appId}/template-defaults

Padrões por app.

Permissão: `template_bindings:update`. Credencial: sessão humana ou chave de API com acesso ao aplicativo.

| Parâmetro | Local | Obrigatório | Significado |
| --- | --- | --- | --- |
| `appId` | path | sim | OpaqueId |
| `Idempotency-Key` | header | sim | UUID v4 por intenção. Recibo por 24h. Mudança de payload/precondição retorna 409. Segredo de chave não é reexibido. |
| `If-Match` | header | sim | ETag forte obtido em consulta. Ausência 428; revisão antiga 412. |

Corpo: `application/json`. Campos desconhecidos são rejeitados.

| Campo | Tipo | Obrigatório | Restrição |
| --- | --- | --- | --- |
| `baseTemplateId` | — | sim | Valores: android, ios, recovery |
| `choice` | TemplateChoice | sim | Consulte o schema para restrições e campos internos |

```json
{
  "baseTemplateId": "android",
  "choice": {
    "mode": "official"
  }
}
```

Exemplo completo de requisição (substitua os identificadores fictícios):

```sh
curl --request PUT 'https://api.staging.agilink.io/v1/apps/app_loja/template-defaults' \
  --header 'Authorization: Bearer <credencial>' \
  --header 'Idempotency-Key: 10000000-0000-4000-8000-000000000001' \
  --header 'If-Match: "20000000-0000-4000-8000-000000000001"' \
  --header 'Content-Type: application/json' \
  --data '{"baseTemplateId":"android","choice":{"mode":"official"}}'
```

Resposta: `200`. Sucesso. Exemplo fictício.

| Header | Significado | Exemplo |
| --- | --- | --- |
| `X-Request-Id` | Identificador gerado pelo servidor, inclusive para falhas e replays. | — |
| `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": {
    "appId": "app_loja",
    "scope": "app",
    "revision": "20000000-0000-4000-8000-000000000001",
    "enabled": true,
    "current": {
      "android": {
        "mode": "inherit"
      },
      "ios": {
        "mode": "inherit"
      },
      "recovery": {
        "mode": "inherit"
      }
    },
    "effective": {
      "android": {
        "mode": "inherit"
      },
      "ios": {
        "mode": "inherit"
      },
      "recovery": {
        "mode": "inherit"
      }
    },
    "inherited": {
      "android": {
        "mode": "inherit"
      },
      "ios": {
        "mode": "inherit"
      },
      "recovery": {
        "mode": "inherit"
      }
    },
    "templateData": {}
  },
  "meta": {
    "requestId": "req_00000000000040008000000000000001"
  }
}
```

Erros previstos: `400`, `401`, `403`, `404`, `409`, `412`, `413`, `415`, `422`, `428`, `429`, `500`, `503`. Veja [códigos e repetição](/api/errors/).

## GET /domains/{domainId}/template-defaults

Padrões de templates por plataforma.

Permissão: `template_bindings:read`. Credencial: sessão humana ou chave de API com acesso ao aplicativo.

| Parâmetro | Local | Obrigatório | Significado |
| --- | --- | --- | --- |
| `domainId` | path | sim | OpaqueId |

Sem corpo de requisição.

Exemplo completo de requisição (substitua os identificadores fictícios):

```sh
curl --request GET 'https://api.staging.agilink.io/v1/domains/domain_example/template-defaults' \
  --header 'Authorization: Bearer <credencial>'
```

Resposta: `200`. Sucesso. Exemplo fictício.

| Header | Significado | Exemplo |
| --- | --- | --- |
| `X-Request-Id` | Identificador gerado pelo servidor, inclusive para falhas e replays. | — |
| `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": {
    "appId": "app_loja",
    "scope": "app",
    "revision": "20000000-0000-4000-8000-000000000001",
    "enabled": true,
    "current": {
      "android": {
        "mode": "inherit"
      },
      "ios": {
        "mode": "inherit"
      },
      "recovery": {
        "mode": "inherit"
      }
    },
    "effective": {
      "android": {
        "mode": "inherit"
      },
      "ios": {
        "mode": "inherit"
      },
      "recovery": {
        "mode": "inherit"
      }
    },
    "inherited": {
      "android": {
        "mode": "inherit"
      },
      "ios": {
        "mode": "inherit"
      },
      "recovery": {
        "mode": "inherit"
      }
    },
    "templateData": {}
  },
  "meta": {
    "requestId": "req_00000000000040008000000000000001"
  }
}
```

Erros previstos: `400`, `401`, `403`, `404`, `422`, `429`, `500`, `503`. Veja [códigos e repetição](/api/errors/).

## PUT /domains/{domainId}/template-defaults

Padrões de templates por plataforma.

Permissão: `template_bindings:update`. Credencial: sessão humana ou chave de API com acesso ao aplicativo.

| Parâmetro | Local | Obrigatório | Significado |
| --- | --- | --- | --- |
| `domainId` | path | sim | OpaqueId |
| `Idempotency-Key` | header | sim | UUID v4 por intenção. Recibo por 24h. Mudança de payload/precondição retorna 409. Segredo de chave não é reexibido. |
| `If-Match` | header | sim | ETag forte obtido em consulta. Ausência 428; revisão antiga 412. |

Corpo: `application/json`. Campos desconhecidos são rejeitados.

| Campo | Tipo | Obrigatório | Restrição |
| --- | --- | --- | --- |
| `baseTemplateId` | — | sim | Valores: android, ios, recovery |
| `choice` | TemplateChoice | sim | Consulte o schema para restrições e campos internos |

```json
{
  "baseTemplateId": "android",
  "choice": {
    "mode": "official"
  }
}
```

Exemplo completo de requisição (substitua os identificadores fictícios):

```sh
curl --request PUT 'https://api.staging.agilink.io/v1/domains/domain_example/template-defaults' \
  --header 'Authorization: Bearer <credencial>' \
  --header 'Idempotency-Key: 10000000-0000-4000-8000-000000000001' \
  --header 'If-Match: "20000000-0000-4000-8000-000000000001"' \
  --header 'Content-Type: application/json' \
  --data '{"baseTemplateId":"android","choice":{"mode":"official"}}'
```

Resposta: `200`. Sucesso. Exemplo fictício.

| Header | Significado | Exemplo |
| --- | --- | --- |
| `X-Request-Id` | Identificador gerado pelo servidor, inclusive para falhas e replays. | — |
| `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": {
    "appId": "app_loja",
    "scope": "app",
    "revision": "20000000-0000-4000-8000-000000000001",
    "enabled": true,
    "current": {
      "android": {
        "mode": "inherit"
      },
      "ios": {
        "mode": "inherit"
      },
      "recovery": {
        "mode": "inherit"
      }
    },
    "effective": {
      "android": {
        "mode": "inherit"
      },
      "ios": {
        "mode": "inherit"
      },
      "recovery": {
        "mode": "inherit"
      }
    },
    "inherited": {
      "android": {
        "mode": "inherit"
      },
      "ios": {
        "mode": "inherit"
      },
      "recovery": {
        "mode": "inherit"
      }
    },
    "templateData": {}
  },
  "meta": {
    "requestId": "req_00000000000040008000000000000001"
  }
}
```

Erros previstos: `400`, `401`, `403`, `404`, `409`, `412`, `413`, `415`, `422`, `428`, `429`, `500`, `503`. Veja [códigos e repetição](/api/errors/).

## GET /links/{linkId}/template-selection

Ler/alterar apresentação por plataforma.

Permissão: `template_bindings:read`. Credencial: sessão humana ou chave de API com acesso ao aplicativo.

| Parâmetro | Local | Obrigatório | Significado |
| --- | --- | --- | --- |
| `linkId` | path | sim | LinkId |

Sem corpo de requisição.

Exemplo completo de requisição (substitua os identificadores fictícios):

```sh
curl --request GET 'https://api.staging.agilink.io/v1/links/go.example.com~-ofertas~-tenis/template-selection' \
  --header 'Authorization: Bearer <credencial>'
```

Resposta: `200`. Sucesso. Exemplo fictício.

| Header | Significado | Exemplo |
| --- | --- | --- |
| `X-Request-Id` | Identificador gerado pelo servidor, inclusive para falhas e replays. | — |
| `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": {
    "appId": "app_loja",
    "scope": "app",
    "revision": "20000000-0000-4000-8000-000000000001",
    "enabled": true,
    "current": {
      "android": {
        "mode": "inherit"
      },
      "ios": {
        "mode": "inherit"
      },
      "recovery": {
        "mode": "inherit"
      }
    },
    "effective": {
      "android": {
        "mode": "inherit"
      },
      "ios": {
        "mode": "inherit"
      },
      "recovery": {
        "mode": "inherit"
      }
    },
    "inherited": {
      "android": {
        "mode": "inherit"
      },
      "ios": {
        "mode": "inherit"
      },
      "recovery": {
        "mode": "inherit"
      }
    },
    "templateData": {}
  },
  "meta": {
    "requestId": "req_00000000000040008000000000000001"
  }
}
```

Erros previstos: `400`, `401`, `403`, `404`, `422`, `429`, `500`, `503`. Veja [códigos e repetição](/api/errors/).

## PUT /links/{linkId}/template-selection

Ler/alterar apresentação por plataforma.

Permissão: `template_bindings:update`. Credencial: sessão humana ou chave de API com acesso ao aplicativo.

| Parâmetro | Local | Obrigatório | Significado |
| --- | --- | --- | --- |
| `linkId` | path | sim | LinkId |
| `Idempotency-Key` | header | sim | UUID v4 por intenção. Recibo por 24h. Mudança de payload/precondição retorna 409. Segredo de chave não é reexibido. |
| `If-Match` | header | sim | ETag forte obtido em consulta. Ausência 428; revisão antiga 412. |

Corpo: `application/json`. Campos desconhecidos são rejeitados.

| Campo | Tipo | Obrigatório | Restrição |
| --- | --- | --- | --- |
| `baseTemplateId` | — | sim | Valores: android, ios, recovery |
| `choice` | TemplateChoice | sim | Consulte o schema para restrições e campos internos |

```json
{
  "baseTemplateId": "android",
  "choice": {
    "mode": "official"
  }
}
```

Exemplo completo de requisição (substitua os identificadores fictícios):

```sh
curl --request PUT 'https://api.staging.agilink.io/v1/links/go.example.com~-ofertas~-tenis/template-selection' \
  --header 'Authorization: Bearer <credencial>' \
  --header 'Idempotency-Key: 10000000-0000-4000-8000-000000000001' \
  --header 'If-Match: "20000000-0000-4000-8000-000000000001"' \
  --header 'Content-Type: application/json' \
  --data '{"baseTemplateId":"android","choice":{"mode":"official"}}'
```

Resposta: `200`. Sucesso. Exemplo fictício.

| Header | Significado | Exemplo |
| --- | --- | --- |
| `X-Request-Id` | Identificador gerado pelo servidor, inclusive para falhas e replays. | — |
| `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": {
    "appId": "app_loja",
    "scope": "app",
    "revision": "20000000-0000-4000-8000-000000000001",
    "enabled": true,
    "current": {
      "android": {
        "mode": "inherit"
      },
      "ios": {
        "mode": "inherit"
      },
      "recovery": {
        "mode": "inherit"
      }
    },
    "effective": {
      "android": {
        "mode": "inherit"
      },
      "ios": {
        "mode": "inherit"
      },
      "recovery": {
        "mode": "inherit"
      }
    },
    "inherited": {
      "android": {
        "mode": "inherit"
      },
      "ios": {
        "mode": "inherit"
      },
      "recovery": {
        "mode": "inherit"
      }
    },
    "templateData": {}
  },
  "meta": {
    "requestId": "req_00000000000040008000000000000001"
  }
}
```

Erros previstos: `400`, `401`, `403`, `404`, `409`, `412`, `413`, `415`, `422`, `428`, `429`, `500`, `503`. Veja [códigos e repetição](/api/errors/).

## GET /template-catalog

Modelos oficiais, plataformas e capacidades.

Permissão: `templates:read`. Credencial: sessão humana ou chave de API com acesso ao aplicativo.

| Parâmetro | Local | Obrigatório | Significado |
| --- | --- | --- | --- |
| `appId` | query | sim | AppId |

Sem corpo de requisição.

Exemplo completo de requisição (substitua os identificadores fictícios):

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

Resposta: `200`. Sucesso. Exemplo fictício.

| Header | Significado | Exemplo |
| --- | --- | --- |
| `X-Request-Id` | Identificador gerado pelo servidor, inclusive para falhas e replays. | — |
| `Cache-Control` | Respostas administrativas não podem ser armazenadas. | no-store, no-transform |

```json
{
  "data": [
    {
      "id": "android",
      "rendererContractVersion": 1,
      "states": [
        "manual",
        "opening",
        "fallback"
      ],
      "actions": [
        "open-app",
        "open-browser"
      ],
      "nativeVariables": [
        "link.titulo",
        "link.descricao",
        "app.nome"
      ],
      "themes": {
        "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"
        }
      }
    },
    {
      "id": "ios",
      "rendererContractVersion": 1,
      "states": [
        "opening",
        "fallback"
      ],
      "actions": [
        "open-app",
        "install",
        "open-browser"
      ],
      "nativeVariables": [
        "link.titulo",
        "link.descricao",
        "app.nome"
      ],
      "themes": {
        "light": {
          "background": "#f8fafc",
          "surface": "#ffffff",
          "border": "#e2e8f0",
          "text": "#0f172a",
          "muted": "#64748b",
          "accent": "#0284c7",
          "secondary": "#0f172a",
          "tertiary": "#f1f5f9"
        },
        "dark": {
          "background": "#0c0d0e",
          "surface": "#141517",
          "border": "#26272b",
          "text": "#f4f4f5",
          "muted": "#a1a1aa",
          "accent": "#0284c7",
          "secondary": "#27272a",
          "tertiary": "#1c1d20"
        }
      }
    },
    {
      "id": "recovery",
      "rendererContractVersion": 1,
      "states": [
        "copy-only",
        "default",
        "copied",
        "manual",
        "fallback"
      ],
      "actions": [
        "copy-install",
        "install",
        "open-app",
        "copy-clip"
      ],
      "nativeVariables": [
        "link.titulo",
        "link.descricao",
        "app.nome"
      ],
      "themes": {
        "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"
        }
      }
    }
  ],
  "pagination": {
    "hasMore": false,
    "nextCursor": null
  },
  "meta": {
    "requestId": "req_00000000000040008000000000000001"
  }
}
```

Erros previstos: `400`, `401`, `403`, `404`, `422`, `429`, `500`, `503`. Veja [códigos e repetição](/api/errors/).

## GET /template-catalog/{baseId}/schema

Campos, variáveis, tipos e restrições.

Permissão: `templates:read`. Credencial: sessão humana ou chave de API com acesso ao aplicativo.

| Parâmetro | Local | Obrigatório | Significado |
| --- | --- | --- | --- |
| `baseId` | path | sim | OpaqueId |
| `appId` | query | sim | AppId |

Sem corpo de requisição.

Exemplo completo de requisição (substitua os identificadores fictícios):

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

Resposta: `200`. Sucesso. Exemplo fictício.

| Header | Significado | Exemplo |
| --- | --- | --- |
| `X-Request-Id` | Identificador gerado pelo servidor, inclusive para falhas e replays. | — |
| `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"
  }
}
```

Erros previstos: `400`, `401`, `403`, `404`, `422`, `429`, `500`, `503`. Veja [códigos e repetição](/api/errors/).

## GET /template-choices

Seleções válidas para contexto app/domínio/link.

Permissão: `templates:read`. Credencial: sessão humana ou chave de API com acesso ao aplicativo.

| Parâmetro | Local | Obrigatório | Significado |
| --- | --- | --- | --- |
| `appId` | query | sim | AppId |
| `limit` | query | não | integer |
| `cursor` | query | não | Cursor |

Sem corpo de requisição.

Exemplo completo de requisição (substitua os identificadores fictícios):

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

Resposta: `200`. Sucesso. Exemplo fictício.

| Header | Significado | Exemplo |
| --- | --- | --- |
| `X-Request-Id` | Identificador gerado pelo servidor, inclusive para falhas e replays. | — |
| `Cache-Control` | Respostas administrativas não podem ser armazenadas. | no-store, no-transform |

```json
{
  "data": [
    {
      "templateId": "60000000-0000-4000-8000-000000000001",
      "version": 1,
      "baseTemplateId": "android",
      "name": "Página da loja",
      "variables": []
    }
  ],
  "pagination": {
    "hasMore": false,
    "nextCursor": null
  },
  "meta": {
    "requestId": "req_00000000000040008000000000000001"
  }
}
```

Erros previstos: `400`, `401`, `403`, `404`, `422`, `429`, `500`, `503`. Veja [códigos e repetição](/api/errors/).

## GET /templates

Biblioteca e criação por app.

Permissão: `templates:read`. Credencial: sessão humana ou chave de API com acesso ao aplicativo.

| Parâmetro | Local | Obrigatório | Significado |
| --- | --- | --- | --- |
| `appId` | query | sim | AppId |
| `limit` | query | não | integer |
| `cursor` | query | não | Cursor |
| `archived` | query | não | — |

Sem corpo de requisição.

Exemplo completo de requisição (substitua os identificadores fictícios):

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

Resposta: `200`. Sucesso. Exemplo fictício.

| Header | Significado | Exemplo |
| --- | --- | --- |
| `X-Request-Id` | Identificador gerado pelo servidor, inclusive para falhas e replays. | — |
| `Cache-Control` | Respostas administrativas não podem ser armazenadas. | no-store, no-transform |

```json
{
  "data": [
    {
      "id": "60000000-0000-4000-8000-000000000001",
      "appId": "app_loja",
      "name": "Página da loja",
      "baseTemplateId": "android",
      "archived": false,
      "revision": "20000000-0000-4000-8000-000000000001",
      "createdAt": "2026-10-19T20:00:00Z",
      "updatedAt": "2026-10-19T20:00:00Z"
    }
  ],
  "pagination": {
    "hasMore": false,
    "nextCursor": null
  },
  "meta": {
    "requestId": "req_00000000000040008000000000000001"
  }
}
```

Erros previstos: `400`, `401`, `403`, `404`, `422`, `429`, `500`, `503`. Veja [códigos e repetição](/api/errors/).

## POST /templates

Biblioteca e criação por app.

Permissão: `templates:create`. Credencial: sessão humana ou chave de API com acesso ao aplicativo.

| Parâmetro | Local | Obrigatório | Significado |
| --- | --- | --- | --- |
| `Idempotency-Key` | header | sim | UUID v4 por intenção. Recibo por 24h. Mudança de payload/precondição retorna 409. Segredo de chave não é reexibido. |

Corpo: `application/json`. Campos desconhecidos são rejeitados.

| Campo | Tipo | Obrigatório | Restrição |
| --- | --- | --- | --- |
| `appId` | AppId | sim | Consulte o schema para restrições e campos internos |
| `name` | string | sim | Máximo 100 caracteres |
| `baseTemplateId` | — | sim | Valores: android, ios, recovery |
| `config` | TemplateConfig | não | Consulte o schema para restrições e campos internos |

```json
{
  "appId": "app_loja",
  "name": "Página da loja",
  "baseTemplateId": "android",
  "config": {
    "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": []
  }
}
```

Exemplo completo de requisição (substitua os identificadores fictícios):

```sh
curl --request POST 'https://api.staging.agilink.io/v1/templates' \
  --header 'Authorization: Bearer <credencial>' \
  --header 'Idempotency-Key: 10000000-0000-4000-8000-000000000001' \
  --header 'Content-Type: application/json' \
  --data '{"appId":"app_loja","name":"Página da loja","baseTemplateId":"android","config":{"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":[]}}'
```

Resposta: `201`. Criado. Exemplo fictício.

| Header | Significado | Exemplo |
| --- | --- | --- |
| `X-Request-Id` | Identificador gerado pelo servidor, inclusive para falhas e replays. | — |
| `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" |
| `Location` | Endereço relativo do recurso criado. | /v1/templates/60000000-0000-4000-8000-000000000001 |

```json
{
  "data": {
    "template": {
      "id": "60000000-0000-4000-8000-000000000001",
      "appId": "app_loja",
      "name": "Página da loja",
      "baseTemplateId": "android",
      "archived": false,
      "revision": "20000000-0000-4000-8000-000000000001",
      "createdAt": "2026-10-19T20:00:00Z",
      "updatedAt": "2026-10-19T20:00:00Z"
    },
    "draft": {
      "templateId": "60000000-0000-4000-8000-000000000001",
      "config": {
        "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": []
      },
      "revision": "20000000-0000-4000-8000-000000000001",
      "baseVersion": null,
      "updatedAt": "2026-10-19T20:00:00Z"
    },
    "revision": "20000000-0000-4000-8000-000000000001"
  },
  "meta": {
    "requestId": "req_00000000000040008000000000000001"
  }
}
```

Erros previstos: `400`, `401`, `403`, `404`, `409`, `413`, `415`, `422`, `429`, `500`, `503`. Veja [códigos e repetição](/api/errors/).

## GET /templates/{templateId}

Detalhe, nome e arquivamento.

Permissão: `templates:read`. Credencial: sessão humana ou chave de API com acesso ao aplicativo.

| Parâmetro | Local | Obrigatório | Significado |
| --- | --- | --- | --- |
| `templateId` | path | sim | OpaqueId |

Sem corpo de requisição.

Exemplo completo de requisição (substitua os identificadores fictícios):

```sh
curl --request GET 'https://api.staging.agilink.io/v1/templates/60000000-0000-4000-8000-000000000001' \
  --header 'Authorization: Bearer <credencial>'
```

Resposta: `200`. Sucesso. Exemplo fictício.

| Header | Significado | Exemplo |
| --- | --- | --- |
| `X-Request-Id` | Identificador gerado pelo servidor, inclusive para falhas e replays. | — |
| `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": {
    "template": {
      "id": "60000000-0000-4000-8000-000000000001",
      "appId": "app_loja",
      "name": "Página da loja",
      "baseTemplateId": "android",
      "archived": false,
      "revision": "20000000-0000-4000-8000-000000000001",
      "createdAt": "2026-10-19T20:00:00Z",
      "updatedAt": "2026-10-19T20:00:00Z"
    },
    "draft": {
      "templateId": "60000000-0000-4000-8000-000000000001",
      "config": {
        "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": []
      },
      "revision": "20000000-0000-4000-8000-000000000001",
      "baseVersion": null,
      "updatedAt": "2026-10-19T20:00:00Z"
    },
    "revision": "20000000-0000-4000-8000-000000000001"
  },
  "meta": {
    "requestId": "req_00000000000040008000000000000001"
  }
}
```

Erros previstos: `400`, `401`, `403`, `404`, `422`, `429`, `500`, `503`. Veja [códigos e repetição](/api/errors/).

## PATCH /templates/{templateId}

Detalhe, nome e arquivamento.

Permissão: `templates:update`. Credencial: sessão humana ou chave de API com acesso ao aplicativo.

| Parâmetro | Local | Obrigatório | Significado |
| --- | --- | --- | --- |
| `templateId` | path | sim | OpaqueId |
| `Idempotency-Key` | header | sim | UUID v4 por intenção. Recibo por 24h. Mudança de payload/precondição retorna 409. Segredo de chave não é reexibido. |
| `If-Match` | header | sim | ETag forte obtido em consulta. Ausência 428; revisão antiga 412. |

Corpo: `application/json`. Campos desconhecidos são rejeitados.

| Campo | Tipo | Obrigatório | Restrição |
| --- | --- | --- | --- |
| `name` | string | não | Máximo 100 caracteres |
| `archived` | boolean | não | Consulte o schema para restrições e campos internos |

```json
{
  "name": "Página editada"
}
```

Exemplo completo de requisição (substitua os identificadores fictícios):

```sh
curl --request PATCH 'https://api.staging.agilink.io/v1/templates/60000000-0000-4000-8000-000000000001' \
  --header 'Authorization: Bearer <credencial>' \
  --header 'Idempotency-Key: 10000000-0000-4000-8000-000000000001' \
  --header 'If-Match: "20000000-0000-4000-8000-000000000001"' \
  --header 'Content-Type: application/json' \
  --data '{"name":"Página editada"}'
```

Resposta: `200`. Sucesso. Exemplo fictício.

| Header | Significado | Exemplo |
| --- | --- | --- |
| `X-Request-Id` | Identificador gerado pelo servidor, inclusive para falhas e replays. | — |
| `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": {
    "template": {
      "id": "60000000-0000-4000-8000-000000000001",
      "appId": "app_loja",
      "name": "Página da loja",
      "baseTemplateId": "android",
      "archived": false,
      "revision": "20000000-0000-4000-8000-000000000001",
      "createdAt": "2026-10-19T20:00:00Z",
      "updatedAt": "2026-10-19T20:00:00Z"
    },
    "draft": {
      "templateId": "60000000-0000-4000-8000-000000000001",
      "config": {
        "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": []
      },
      "revision": "20000000-0000-4000-8000-000000000001",
      "baseVersion": null,
      "updatedAt": "2026-10-19T20:00:00Z"
    },
    "revision": "20000000-0000-4000-8000-000000000001"
  },
  "meta": {
    "requestId": "req_00000000000040008000000000000001"
  }
}
```

Erros previstos: `400`, `401`, `403`, `404`, `409`, `412`, `413`, `415`, `422`, `428`, `429`, `500`, `503`. Veja [códigos e repetição](/api/errors/).

## POST /templates/{templateId}/duplicate

Duplicar rascunho ou versão.

Permissão: `templates:create`. Credencial: sessão humana ou chave de API com acesso ao aplicativo.

| Parâmetro | Local | Obrigatório | Significado |
| --- | --- | --- | --- |
| `templateId` | path | sim | OpaqueId |
| `Idempotency-Key` | header | sim | UUID v4 por intenção. Recibo por 24h. Mudança de payload/precondição retorna 409. Segredo de chave não é reexibido. |

Corpo: `application/json`. Campos desconhecidos são rejeitados.

| Campo | Tipo | Obrigatório | Restrição |
| --- | --- | --- | --- |
| `name` | string | sim | Máximo 100 caracteres |
| `sourceVersion` | integer | não | Consulte o schema para restrições e campos internos |
| `draftRevision` | Revision | não | Consulte o schema para restrições e campos internos |

```json
{
  "name": "Cópia",
  "draftRevision": "20000000-0000-4000-8000-000000000001"
}
```

Exemplo completo de requisição (substitua os identificadores fictícios):

```sh
curl --request POST 'https://api.staging.agilink.io/v1/templates/60000000-0000-4000-8000-000000000001/duplicate' \
  --header 'Authorization: Bearer <credencial>' \
  --header 'Idempotency-Key: 10000000-0000-4000-8000-000000000001' \
  --header 'Content-Type: application/json' \
  --data '{"name":"Cópia","draftRevision":"20000000-0000-4000-8000-000000000001"}'
```

Resposta: `201`. Criado. Exemplo fictício.

| Header | Significado | Exemplo |
| --- | --- | --- |
| `X-Request-Id` | Identificador gerado pelo servidor, inclusive para falhas e replays. | — |
| `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" |
| `Location` | Endereço relativo do recurso criado. | /v1/templates/60000000-0000-4000-8000-000000000001 |

```json
{
  "data": {
    "template": {
      "id": "60000000-0000-4000-8000-000000000001",
      "appId": "app_loja",
      "name": "Página da loja",
      "baseTemplateId": "android",
      "archived": false,
      "revision": "20000000-0000-4000-8000-000000000001",
      "createdAt": "2026-10-19T20:00:00Z",
      "updatedAt": "2026-10-19T20:00:00Z"
    },
    "draft": {
      "templateId": "60000000-0000-4000-8000-000000000001",
      "config": {
        "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": []
      },
      "revision": "20000000-0000-4000-8000-000000000001",
      "baseVersion": null,
      "updatedAt": "2026-10-19T20:00:00Z"
    },
    "revision": "20000000-0000-4000-8000-000000000001"
  },
  "meta": {
    "requestId": "req_00000000000040008000000000000001"
  }
}
```

Erros previstos: `400`, `401`, `403`, `404`, `409`, `413`, `415`, `422`, `429`, `500`, `503`. Veja [códigos e repetição](/api/errors/).

## GET /templates/{templateId}/draft

Consultar/salvar rascunho com revisão própria.

Permissão: `templates:read`. Credencial: sessão humana ou chave de API com acesso ao aplicativo.

| Parâmetro | Local | Obrigatório | Significado |
| --- | --- | --- | --- |
| `templateId` | path | sim | OpaqueId |

Sem corpo de requisição.

Exemplo completo de requisição (substitua os identificadores fictícios):

```sh
curl --request GET 'https://api.staging.agilink.io/v1/templates/60000000-0000-4000-8000-000000000001/draft' \
  --header 'Authorization: Bearer <credencial>'
```

Resposta: `200`. Sucesso. Exemplo fictício.

| Header | Significado | Exemplo |
| --- | --- | --- |
| `X-Request-Id` | Identificador gerado pelo servidor, inclusive para falhas e replays. | — |
| `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": {
    "templateId": "60000000-0000-4000-8000-000000000001",
    "config": {
      "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": []
    },
    "revision": "20000000-0000-4000-8000-000000000001",
    "baseVersion": null,
    "updatedAt": "2026-10-19T20:00:00Z"
  },
  "meta": {
    "requestId": "req_00000000000040008000000000000001"
  }
}
```

Erros previstos: `400`, `401`, `403`, `404`, `422`, `429`, `500`, `503`. Veja [códigos e repetição](/api/errors/).

## PUT /templates/{templateId}/draft

Consultar/salvar rascunho com revisão própria.

Permissão: `templates:update`. Credencial: sessão humana ou chave de API com acesso ao aplicativo.

| Parâmetro | Local | Obrigatório | Significado |
| --- | --- | --- | --- |
| `templateId` | path | sim | OpaqueId |
| `Idempotency-Key` | header | sim | UUID v4 por intenção. Recibo por 24h. Mudança de payload/precondição retorna 409. Segredo de chave não é reexibido. |
| `If-Match` | header | sim | ETag forte obtido em consulta. Ausência 428; revisão antiga 412. |

Corpo: `application/json`. Campos desconhecidos são rejeitados.

| Campo | Tipo | Obrigatório | Restrição |
| --- | --- | --- | --- |
| `config` | TemplateConfig | sim | Consulte o schema para restrições e campos internos |

```json
{
  "config": {
    "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": []
  }
}
```

Exemplo completo de requisição (substitua os identificadores fictícios):

```sh
curl --request PUT 'https://api.staging.agilink.io/v1/templates/60000000-0000-4000-8000-000000000001/draft' \
  --header 'Authorization: Bearer <credencial>' \
  --header 'Idempotency-Key: 10000000-0000-4000-8000-000000000001' \
  --header 'If-Match: "20000000-0000-4000-8000-000000000001"' \
  --header 'Content-Type: application/json' \
  --data '{"config":{"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":[]}}'
```

Resposta: `200`. Sucesso. Exemplo fictício.

| Header | Significado | Exemplo |
| --- | --- | --- |
| `X-Request-Id` | Identificador gerado pelo servidor, inclusive para falhas e replays. | — |
| `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": {
    "templateId": "60000000-0000-4000-8000-000000000001",
    "config": {
      "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": []
    },
    "revision": "20000000-0000-4000-8000-000000000001",
    "baseVersion": null,
    "updatedAt": "2026-10-19T20:00:00Z"
  },
  "meta": {
    "requestId": "req_00000000000040008000000000000001"
  }
}
```

Erros previstos: `400`, `401`, `403`, `404`, `409`, `412`, `413`, `415`, `422`, `428`, `429`, `500`, `503`. Veja [códigos e repetição](/api/errors/).

## POST /templates/{templateId}/validate

Validar configuração e variáveis.

Permissão: `templates:validate`. Credencial: sessão humana ou chave de API com acesso ao aplicativo.

| Parâmetro | Local | Obrigatório | Significado |
| --- | --- | --- | --- |
| `templateId` | path | sim | OpaqueId |
| `Idempotency-Key` | header | sim | UUID v4 por intenção. Recibo por 24h. Mudança de payload/precondição retorna 409. Segredo de chave não é reexibido. |

Corpo: `application/json`. Campos desconhecidos são rejeitados.

| Campo | Tipo | Obrigatório | Restrição |
| --- | --- | --- | --- |
| `config` | TemplateConfig | sim | Consulte o schema para restrições e campos internos |
| `usage` | — | não | Valores: link, default |

```json
{
  "config": {
    "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": []
  },
  "usage": "link"
}
```

Exemplo completo de requisição (substitua os identificadores fictícios):

```sh
curl --request POST 'https://api.staging.agilink.io/v1/templates/60000000-0000-4000-8000-000000000001/validate' \
  --header 'Authorization: Bearer <credencial>' \
  --header 'Idempotency-Key: 10000000-0000-4000-8000-000000000001' \
  --header 'Content-Type: application/json' \
  --data '{"config":{"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":[]},"usage":"link"}'
```

Resposta: `200`. Sucesso. Exemplo fictício.

| Header | Significado | Exemplo |
| --- | --- | --- |
| `X-Request-Id` | Identificador gerado pelo servidor, inclusive para falhas e replays. | — |
| `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": {
    "valid": true,
    "config": {
      "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": []
    },
    "usage": "link"
  },
  "meta": {
    "requestId": "req_00000000000040008000000000000001"
  }
}
```

Erros previstos: `400`, `401`, `403`, `404`, `409`, `413`, `415`, `422`, `429`, `500`, `503`. Veja [códigos e repetição](/api/errors/).

## POST /templates/{templateId}/preview

Prévia com dados autorizados, sem publicação.

Permissão: `templates:preview`. Credencial: sessão humana ou chave de API com acesso ao aplicativo.

| Parâmetro | Local | Obrigatório | Significado |
| --- | --- | --- | --- |
| `templateId` | path | sim | OpaqueId |
| `Idempotency-Key` | header | sim | UUID v4 por intenção. Recibo por 24h. Mudança de payload/precondição retorna 409. Segredo de chave não é reexibido. |

Corpo: `application/json`. Campos desconhecidos são rejeitados.

| Campo | Tipo | Obrigatório | Restrição |
| --- | --- | --- | --- |
| `config` | TemplateConfig | não | Consulte o schema para restrições e campos internos |
| `linkId` | LinkId | não | Consulte o schema para restrições e campos internos |
| `templateData` | object | não | Consulte o schema para restrições e campos internos |

```json
{
  "config": {
    "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": []
  }
}
```

Exemplo completo de requisição (substitua os identificadores fictícios):

```sh
curl --request POST 'https://api.staging.agilink.io/v1/templates/60000000-0000-4000-8000-000000000001/preview' \
  --header 'Authorization: Bearer <credencial>' \
  --header 'Idempotency-Key: 10000000-0000-4000-8000-000000000001' \
  --header 'Content-Type: application/json' \
  --data '{"config":{"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":[]}}'
```

Resposta: `200`. Sucesso. Exemplo fictício.

| Header | Significado | Exemplo |
| --- | --- | --- |
| `X-Request-Id` | Identificador gerado pelo servidor, inclusive para falhas e replays. | — |
| `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": {
    "templateId": "60000000-0000-4000-8000-000000000001",
    "config": {
      "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": []
    },
    "content": {
      "heading": "Loja"
    },
    "sideEffects": false,
    "rendererContractVersion": 1
  },
  "meta": {
    "requestId": "req_00000000000040008000000000000001"
  }
}
```

Erros previstos: `400`, `401`, `403`, `404`, `409`, `413`, `415`, `422`, `429`, `500`, `503`. Veja [códigos e repetição](/api/errors/).

## GET /templates/{templateId}/versions

Listar/preparar snapshots imutáveis.

Permissão: `templates:read`. Credencial: sessão humana ou chave de API com acesso ao aplicativo.

| Parâmetro | Local | Obrigatório | Significado |
| --- | --- | --- | --- |
| `templateId` | path | sim | OpaqueId |
| `limit` | query | não | integer |
| `cursor` | query | não | Cursor |

Sem corpo de requisição.

Exemplo completo de requisição (substitua os identificadores fictícios):

```sh
curl --request GET 'https://api.staging.agilink.io/v1/templates/60000000-0000-4000-8000-000000000001/versions' \
  --header 'Authorization: Bearer <credencial>'
```

Resposta: `200`. Sucesso. Exemplo fictício.

| Header | Significado | Exemplo |
| --- | --- | --- |
| `X-Request-Id` | Identificador gerado pelo servidor, inclusive para falhas e replays. | — |
| `Cache-Control` | Respostas administrativas não podem ser armazenadas. | no-store, no-transform |

```json
{
  "data": [
    {
      "templateId": "60000000-0000-4000-8000-000000000001",
      "version": 1,
      "state": "prepared",
      "config": {
        "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": []
      },
      "checksum": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
      "usage": "link",
      "authorId": "40000000-0000-4000-8000-000000000001",
      "createdAt": "2026-10-19T20:00:00Z"
    }
  ],
  "pagination": {
    "hasMore": false,
    "nextCursor": null
  },
  "meta": {
    "requestId": "req_00000000000040008000000000000001"
  }
}
```

Erros previstos: `400`, `401`, `403`, `404`, `422`, `429`, `500`, `503`. Veja [códigos e repetição](/api/errors/).

## POST /templates/{templateId}/versions

Listar/preparar snapshots imutáveis.

Permissão: `templates:snapshot`. Credencial: sessão humana ou chave de API com acesso ao aplicativo.

| Parâmetro | Local | Obrigatório | Significado |
| --- | --- | --- | --- |
| `templateId` | path | sim | OpaqueId |
| `Idempotency-Key` | header | sim | UUID v4 por intenção. Recibo por 24h. Mudança de payload/precondição retorna 409. Segredo de chave não é reexibido. |
| `If-Match` | header | sim | ETag forte obtido em consulta. Ausência 428; revisão antiga 412. |

Corpo: `application/json`. Campos desconhecidos são rejeitados.

| Campo | Tipo | Obrigatório | Restrição |
| --- | --- | --- | --- |
| `draftRevision` | Revision | sim | Consulte o schema para restrições e campos internos |
| `usage` | — | não | Valores: link, default |

```json
{
  "draftRevision": "20000000-0000-4000-8000-000000000001",
  "usage": "link"
}
```

Exemplo completo de requisição (substitua os identificadores fictícios):

```sh
curl --request POST 'https://api.staging.agilink.io/v1/templates/60000000-0000-4000-8000-000000000001/versions' \
  --header 'Authorization: Bearer <credencial>' \
  --header 'Idempotency-Key: 10000000-0000-4000-8000-000000000001' \
  --header 'If-Match: "20000000-0000-4000-8000-000000000001"' \
  --header 'Content-Type: application/json' \
  --data '{"draftRevision":"20000000-0000-4000-8000-000000000001","usage":"link"}'
```

Resposta: `201`. Criado. Exemplo fictício.

| Header | Significado | Exemplo |
| --- | --- | --- |
| `X-Request-Id` | Identificador gerado pelo servidor, inclusive para falhas e replays. | — |
| `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" |
| `Location` | Endereço relativo do recurso criado. | /v1/templates/60000000-0000-4000-8000-000000000001/versions/1 |

```json
{
  "data": {
    "template": {
      "id": "60000000-0000-4000-8000-000000000001",
      "appId": "app_loja",
      "name": "Página da loja",
      "baseTemplateId": "android",
      "archived": false,
      "revision": "20000000-0000-4000-8000-000000000001",
      "createdAt": "2026-10-19T20:00:00Z",
      "updatedAt": "2026-10-19T20:00:00Z"
    },
    "version": {
      "templateId": "60000000-0000-4000-8000-000000000001",
      "version": 1,
      "state": "prepared",
      "config": {
        "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": []
      },
      "checksum": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
      "usage": "link",
      "authorId": "40000000-0000-4000-8000-000000000001",
      "createdAt": "2026-10-19T20:00:00Z"
    },
    "draft": {
      "revision": "20000000-0000-4000-8000-000000000001",
      "baseVersion": 1,
      "updatedAt": "2026-10-19T20:00:00Z"
    },
    "revision": "20000000-0000-4000-8000-000000000001"
  },
  "meta": {
    "requestId": "req_00000000000040008000000000000001"
  }
}
```

Erros previstos: `400`, `401`, `403`, `404`, `409`, `412`, `413`, `415`, `422`, `428`, `429`, `500`, `503`. Veja [códigos e repetição](/api/errors/).

## GET /templates/{templateId}/versions/{version}

Consultar snapshot.

Permissão: `templates:read`. Credencial: sessão humana ou chave de API com acesso ao aplicativo.

| Parâmetro | Local | Obrigatório | Significado |
| --- | --- | --- | --- |
| `templateId` | path | sim | OpaqueId |
| `version` | path | sim | OpaqueId |

Sem corpo de requisição.

Exemplo completo de requisição (substitua os identificadores fictícios):

```sh
curl --request GET 'https://api.staging.agilink.io/v1/templates/60000000-0000-4000-8000-000000000001/versions/1' \
  --header 'Authorization: Bearer <credencial>'
```

Resposta: `200`. Sucesso. Exemplo fictício.

| Header | Significado | Exemplo |
| --- | --- | --- |
| `X-Request-Id` | Identificador gerado pelo servidor, inclusive para falhas e replays. | — |
| `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": {
    "templateId": "60000000-0000-4000-8000-000000000001",
    "version": 1,
    "state": "prepared",
    "config": {
      "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": []
    },
    "checksum": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
    "usage": "link",
    "authorId": "40000000-0000-4000-8000-000000000001",
    "createdAt": "2026-10-19T20:00:00Z"
  },
  "meta": {
    "requestId": "req_00000000000040008000000000000001"
  }
}
```

Erros previstos: `400`, `401`, `403`, `404`, `422`, `429`, `500`, `503`. Veja [códigos e repetição](/api/errors/).

## GET /templates/{templateId}/availability

Versões disponíveis para associação.

Permissão: `templates:read`. Credencial: sessão humana ou chave de API com acesso ao aplicativo.

| Parâmetro | Local | Obrigatório | Significado |
| --- | --- | --- | --- |
| `templateId` | path | sim | OpaqueId |
| `limit` | query | não | integer |
| `cursor` | query | não | Cursor |

Sem corpo de requisição.

Exemplo completo de requisição (substitua os identificadores fictícios):

```sh
curl --request GET 'https://api.staging.agilink.io/v1/templates/60000000-0000-4000-8000-000000000001/availability' \
  --header 'Authorization: Bearer <credencial>'
```

Resposta: `200`. Sucesso. Exemplo fictício.

| Header | Significado | Exemplo |
| --- | --- | --- |
| `X-Request-Id` | Identificador gerado pelo servidor, inclusive para falhas e replays. | — |
| `Cache-Control` | Respostas administrativas não podem ser armazenadas. | no-store, no-transform |

```json
{
  "data": [
    {
      "version": 1,
      "confirmedAt": "2026-10-19T20:00:00Z"
    }
  ],
  "pagination": {
    "hasMore": false,
    "nextCursor": null
  },
  "meta": {
    "requestId": "req_00000000000040008000000000000001"
  }
}
```

Erros previstos: `400`, `401`, `403`, `404`, `422`, `429`, `500`, `503`. Veja [códigos e repetição](/api/errors/).

## POST /templates/{templateId}/publish

Publicar versão com alvos explícitos.

Permissão: `templates:publish`. Credencial: sessão humana ou chave de API com acesso ao aplicativo.

| Parâmetro | Local | Obrigatório | Significado |
| --- | --- | --- | --- |
| `templateId` | path | sim | OpaqueId |
| `Idempotency-Key` | header | sim | UUID v4 por intenção. Recibo por 24h. Mudança de payload/precondição retorna 409. Segredo de chave não é reexibido. |
| `If-Match` | header | sim | ETag forte obtido em consulta. Ausência 428; revisão antiga 412. |

Corpo: `application/json`. Campos desconhecidos são rejeitados.

| Campo | Tipo | Obrigatório | Restrição |
| --- | --- | --- | --- |
| `version` | integer | não | Consulte o schema para restrições e campos internos |
| `draftRevision` | Revision | não | Consulte o schema para restrições e campos internos |
| `usage` | — | não | Valores: link, default |
| `targets` | array | sim | Consulte o schema para restrições e campos internos |

```json
{
  "version": 1,
  "targets": []
}
```

Exemplo completo de requisição (substitua os identificadores fictícios):

```sh
curl --request POST 'https://api.staging.agilink.io/v1/templates/60000000-0000-4000-8000-000000000001/publish' \
  --header 'Authorization: Bearer <credencial>' \
  --header 'Idempotency-Key: 10000000-0000-4000-8000-000000000001' \
  --header 'If-Match: "20000000-0000-4000-8000-000000000001"' \
  --header 'Content-Type: application/json' \
  --data '{"version":1,"targets":[]}'
```

Resposta: `202`. Sucesso. Exemplo fictício.

| Header | Significado | Exemplo |
| --- | --- | --- |
| `X-Request-Id` | Identificador gerado pelo servidor, inclusive para falhas e replays. | — |
| `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" |
| `Location` | Publicação a acompanhar. | /v1/template-publications/60000000-0000-4000-8000-000000000001 |
| `Retry-After` | Segundos até a próxima consulta. | 1 |

```json
{
  "data": {
    "id": "60000000-0000-4000-8000-000000000001",
    "appId": "app_loja",
    "revision": "20000000-0000-4000-8000-000000000001",
    "action": "publish",
    "baseTemplateId": "android",
    "choice": {
      "mode": "custom",
      "templateId": "60000000-0000-4000-8000-000000000001",
      "version": 1
    },
    "state": "queued",
    "phase": "version",
    "error": null,
    "versionAvailability": "prepared",
    "createdAt": "2026-10-19T20:00:00Z",
    "updatedAt": "2026-10-19T20:00:00Z",
    "targets": []
  },
  "meta": {
    "requestId": "req_00000000000040008000000000000001"
  }
}
```

Erros previstos: `400`, `401`, `403`, `404`, `409`, `412`, `413`, `415`, `422`, `428`, `429`, `500`, `503`. Veja [códigos e repetição](/api/errors/).

## POST /templates/{templateId}/restore

Restaurar versão confirmada.

Permissão: `templates:publish`. Credencial: sessão humana ou chave de API com acesso ao aplicativo.

| Parâmetro | Local | Obrigatório | Significado |
| --- | --- | --- | --- |
| `templateId` | path | sim | OpaqueId |
| `Idempotency-Key` | header | sim | UUID v4 por intenção. Recibo por 24h. Mudança de payload/precondição retorna 409. Segredo de chave não é reexibido. |
| `If-Match` | header | sim | ETag forte obtido em consulta. Ausência 428; revisão antiga 412. |

Corpo: `application/json`. Campos desconhecidos são rejeitados.

| Campo | Tipo | Obrigatório | Restrição |
| --- | --- | --- | --- |
| `version` | integer | não | Consulte o schema para restrições e campos internos |
| `mode` | — | não | Valores: official, inherit |
| `targets` | array | sim | Consulte o schema para restrições e campos internos |

```json
{
  "version": 1,
  "targets": []
}
```

Exemplo completo de requisição (substitua os identificadores fictícios):

```sh
curl --request POST 'https://api.staging.agilink.io/v1/templates/60000000-0000-4000-8000-000000000001/restore' \
  --header 'Authorization: Bearer <credencial>' \
  --header 'Idempotency-Key: 10000000-0000-4000-8000-000000000001' \
  --header 'If-Match: "20000000-0000-4000-8000-000000000001"' \
  --header 'Content-Type: application/json' \
  --data '{"version":1,"targets":[]}'
```

Resposta: `202`. Sucesso. Exemplo fictício.

| Header | Significado | Exemplo |
| --- | --- | --- |
| `X-Request-Id` | Identificador gerado pelo servidor, inclusive para falhas e replays. | — |
| `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" |
| `Location` | Publicação a acompanhar. | /v1/template-publications/60000000-0000-4000-8000-000000000001 |
| `Retry-After` | Segundos até a próxima consulta. | 1 |

```json
{
  "data": {
    "id": "60000000-0000-4000-8000-000000000001",
    "appId": "app_loja",
    "revision": "20000000-0000-4000-8000-000000000001",
    "action": "publish",
    "baseTemplateId": "android",
    "choice": {
      "mode": "custom",
      "templateId": "60000000-0000-4000-8000-000000000001",
      "version": 1
    },
    "state": "queued",
    "phase": "version",
    "error": null,
    "versionAvailability": "prepared",
    "createdAt": "2026-10-19T20:00:00Z",
    "updatedAt": "2026-10-19T20:00:00Z",
    "targets": []
  },
  "meta": {
    "requestId": "req_00000000000040008000000000000001"
  }
}
```

Erros previstos: `400`, `401`, `403`, `404`, `409`, `412`, `413`, `415`, `422`, `428`, `429`, `500`, `503`. Veja [códigos e repetição](/api/errors/).

## GET /template-publications

Listar publicações por app/template/alvo.

Permissão: `templates:read`. Credencial: sessão humana ou chave de API com acesso ao aplicativo.

| Parâmetro | Local | Obrigatório | Significado |
| --- | --- | --- | --- |
| `appId` | query | sim | AppId |
| `limit` | query | não | integer |
| `cursor` | query | não | Cursor |
| `baseTemplateId` | query | não | BaseId |

Sem corpo de requisição.

Exemplo completo de requisição (substitua os identificadores fictícios):

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

Resposta: `200`. Sucesso. Exemplo fictício.

| Header | Significado | Exemplo |
| --- | --- | --- |
| `X-Request-Id` | Identificador gerado pelo servidor, inclusive para falhas e replays. | — |
| `Cache-Control` | Respostas administrativas não podem ser armazenadas. | no-store, no-transform |

```json
{
  "data": [
    {
      "id": "60000000-0000-4000-8000-000000000001",
      "appId": "app_loja",
      "revision": "20000000-0000-4000-8000-000000000001",
      "action": "publish",
      "baseTemplateId": "android",
      "choice": {
        "mode": "custom",
        "templateId": "60000000-0000-4000-8000-000000000001",
        "version": 1
      },
      "state": "queued",
      "phase": "version",
      "error": null,
      "versionAvailability": "prepared",
      "createdAt": "2026-10-19T20:00:00Z",
      "updatedAt": "2026-10-19T20:00:00Z",
      "targets": []
    }
  ],
  "pagination": {
    "hasMore": false,
    "nextCursor": null
  },
  "meta": {
    "requestId": "req_00000000000040008000000000000001"
  }
}
```

Erros previstos: `400`, `401`, `403`, `404`, `422`, `429`, `500`, `503`. Veja [códigos e repetição](/api/errors/).

## GET /template-publications/{publicationId}

Estado detalhado por destino.

Permissão: `templates:read`. Credencial: sessão humana ou chave de API com acesso ao aplicativo.

| Parâmetro | Local | Obrigatório | Significado |
| --- | --- | --- | --- |
| `publicationId` | path | sim | OpaqueId |

Sem corpo de requisição.

Exemplo completo de requisição (substitua os identificadores fictícios):

```sh
curl --request GET 'https://api.staging.agilink.io/v1/template-publications/70000000-0000-4000-8000-000000000001' \
  --header 'Authorization: Bearer <credencial>'
```

Resposta: `200`. Sucesso. Exemplo fictício.

| Header | Significado | Exemplo |
| --- | --- | --- |
| `X-Request-Id` | Identificador gerado pelo servidor, inclusive para falhas e replays. | — |
| `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": {
    "id": "60000000-0000-4000-8000-000000000001",
    "appId": "app_loja",
    "revision": "20000000-0000-4000-8000-000000000001",
    "action": "publish",
    "baseTemplateId": "android",
    "choice": {
      "mode": "custom",
      "templateId": "60000000-0000-4000-8000-000000000001",
      "version": 1
    },
    "state": "queued",
    "phase": "version",
    "error": null,
    "versionAvailability": "prepared",
    "createdAt": "2026-10-19T20:00:00Z",
    "updatedAt": "2026-10-19T20:00:00Z",
    "targets": []
  },
  "meta": {
    "requestId": "req_00000000000040008000000000000001"
  }
}
```

Erros previstos: `400`, `401`, `403`, `404`, `422`, `429`, `500`, `503`. Veja [códigos e repetição](/api/errors/).

## POST /template-publications/{publicationId}/retry

Repetir tentativa recuperável.

Permissão: `templates:retry`. Credencial: sessão humana ou chave de API com acesso ao aplicativo.

| Parâmetro | Local | Obrigatório | Significado |
| --- | --- | --- | --- |
| `publicationId` | path | sim | OpaqueId |
| `Idempotency-Key` | header | sim | UUID v4 por intenção. Recibo por 24h. Mudança de payload/precondição retorna 409. Segredo de chave não é reexibido. |
| `If-Match` | header | sim | ETag forte obtido em consulta. Ausência 428; revisão antiga 412. |

Corpo: `application/json`. Campos desconhecidos são rejeitados.

| Campo | Tipo | Obrigatório | Restrição |
| --- | --- | --- | --- |


```json
{}
```

Exemplo completo de requisição (substitua os identificadores fictícios):

```sh
curl --request POST 'https://api.staging.agilink.io/v1/template-publications/70000000-0000-4000-8000-000000000001/retry' \
  --header 'Authorization: Bearer <credencial>' \
  --header 'Idempotency-Key: 10000000-0000-4000-8000-000000000001' \
  --header 'If-Match: "20000000-0000-4000-8000-000000000001"' \
  --header 'Content-Type: application/json' \
  --data '{}'
```

Resposta: `202`. Sucesso. Exemplo fictício.

| Header | Significado | Exemplo |
| --- | --- | --- |
| `X-Request-Id` | Identificador gerado pelo servidor, inclusive para falhas e replays. | — |
| `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" |
| `Location` | Publicação a acompanhar. | /v1/template-publications/60000000-0000-4000-8000-000000000001 |
| `Retry-After` | Segundos até a próxima consulta. | 1 |

```json
{
  "data": {
    "id": "60000000-0000-4000-8000-000000000001",
    "appId": "app_loja",
    "revision": "20000000-0000-4000-8000-000000000001",
    "action": "publish",
    "baseTemplateId": "android",
    "choice": {
      "mode": "custom",
      "templateId": "60000000-0000-4000-8000-000000000001",
      "version": 1
    },
    "state": "queued",
    "phase": "version",
    "error": null,
    "versionAvailability": "prepared",
    "createdAt": "2026-10-19T20:00:00Z",
    "updatedAt": "2026-10-19T20:00:00Z",
    "targets": []
  },
  "meta": {
    "requestId": "req_00000000000040008000000000000001"
  }
}
```

Erros previstos: `400`, `401`, `403`, `404`, `409`, `412`, `413`, `415`, `422`, `428`, `429`, `500`, `503`. Veja [códigos e repetição](/api/errors/).
