---
title: "POST /links/validate"
description: "Validar entrada e indicar conflitos conhecidos sem reservar endereço — parâmetros, schemas e exemplos completos."
sidebar:
  hidden: true
---

**Validar entrada e indicar conflitos conhecidos sem reservar endereço.** Contrato v1 · disponível em produção e homologação · operação `validateLinks`. [Guia funcional](/produto/links/) · [Índice](/api/operacoes/) · [Schemas](/referencia/) · [Testar em sandbox](/console/?operation=validateLinks).

## Autenticação e efeito

Permissão: `links:validate`. Sessão humana ou chave de servidor limitada ao proprietário e aos aplicativos autorizados. OAuth/MCP ainda não estão disponíveis. Uma chave de exemplo deve incluir somente esta permissão e as leituras necessárias ao seu fluxo, restrita a `app_loja`; emita-a na área autenticada de desenvolvedores.

Disponível em produção e homologação; sujeito às capacidades do app e à configuração do provedor. OAuth só será aceito após B1b. Campos desconhecidos rejeitados. Consulte os ADRs para regras semânticas além do JSON Schema.

O efeito é autenticado, auditado e pode gerar publicação eventual e eventos do recurso. Links/domínios/templates podem precisar de propagação antes de aparecerem publicamente. Não muda identidade de link implicitamente. Dependências e capabilities podem bloquear a ação. O status confirma a persistência descrita, sem prometer propagação global imediata.

## Parâmetros

| Nome | Local | Obrigatório | Tipo e restrições |
| --- | --- | --- | --- |
| `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. IdempotencyKey; {"type":"string","maxLength":36,"pattern":"^[a-f0-9]{8}-[a-f0-9]{4}-4[a-f0-9]{3}-[89ab][a-f0-9]{3}-[a-f0-9]{12}$"} |



## Corpo e semântica

Content-Type: `application/json`. Campos desconhecidos são rejeitados no envelope.

| Campo | Tipo | Obrigatório | Significado e limites |
| --- | --- | --- | --- |
| `appId` | string | sim | Aplicativo proprietário; precisa estar autorizado. Até 500 caracteres; Formato validado pelo schema |
| `domain` | Domain | sim | Hostname, sem protocolo ou caminho.  |
| `prefix` | string | não | Prefixo de caminho, sem barras. Até 200 caracteres; Formato validado pelo schema |
| `slug` | string | sim | Segmento final da identidade. Até 200 caracteres; Formato validado pelo schema |
| `folderId` | string ou null | não | Valor tipado; formato e restrições completos no schema abaixo.  |
| `campaignId` | string ou null | não | Valor tipado; formato e restrições completos no schema abaixo.  |
| `lifecycle` | LinkLifecycle | não | Valor tipado; formato e restrições completos no schema abaixo.  |
| `lifecycle.archived` | boolean | sim | Valor tipado; formato e restrições completos no schema abaixo.  |
| `lifecycle.paused` | boolean | sim | Valor tipado; formato e restrições completos no schema abaixo.  |
| `lifecycle.startsAt` | AnalyticsInstant ou null | sim | Valor tipado; formato e restrições completos no schema abaixo.  |
| `lifecycle.expiresAt` | AnalyticsInstant ou null | sim | Fim de validade; não amplia concessões.  |
| `lifecycle.fallbackUrl` | string ou null | sim | Valor tipado; formato e restrições completos no schema abaixo.  |
| `utm` | UtmParameters | não | Valor tipado; formato e restrições completos no schema abaixo.  |
| `utm.utm_source` | string | não | Valor tipado; formato e restrições completos no schema abaixo. Até 200 caracteres; Formato validado pelo schema |
| `utm.utm_medium` | string | não | Valor tipado; formato e restrições completos no schema abaixo. Até 200 caracteres; Formato validado pelo schema |
| `utm.utm_campaign` | string | não | Valor tipado; formato e restrições completos no schema abaixo. Até 200 caracteres; Formato validado pelo schema |
| `utm.utm_term` | string | não | Valor tipado; formato e restrições completos no schema abaixo. Até 200 caracteres; Formato validado pelo schema |
| `utm.utm_content` | string | não | Valor tipado; formato e restrições completos no schema abaixo. Até 200 caracteres; Formato validado pelo schema |
| `title` | string ou null | não | Título público.  |
| `description` | string ou null | não | Texto de apresentação.  |
| `imageUrl` | string ou null | não | Valor tipado; formato e restrições completos no schema abaixo.  |
| `desktopUrl` | string ou null | não | Valor tipado; formato e restrições completos no schema abaixo.  |
| `playStoreUrl` | string ou null | não | Valor tipado; formato e restrições completos no schema abaixo.  |
| `appStoreUrl` | string ou null | não | Valor tipado; formato e restrições completos no schema abaixo.  |
| `appPath` | string ou null | não | Valor tipado; formato e restrições completos no schema abaixo.  |
| `parameters` | Parameters | não | Parâmetros tipados do link; limites UTF-8 também se aplicam.  |
| `webOnly` | boolean | não | Direcionamento web; exige destino web válido.  |
| `behavior` | manual / automatic / intelligent | não | Valor tipado; formato e restrições completos no schema abaixo.  |
| `group` | main / operational | não | Grupo main/operational; diferente de pasta/campanha.  |
| `templateData` | object | não | Valor tipado; formato e restrições completos no schema abaixo.  |
| `templateSelection` | object | não | Herança, oficial ou versão customizada publicada.  |
| `templateSelection.android` | object ou object ou object | não | Valor tipado; formato e restrições completos no schema abaixo.  |
| `templateSelection.android.mode` | objeto | sim | Valor tipado; formato e restrições completos no schema abaixo.  |
| `templateSelection.android.mode` | objeto | sim | Valor tipado; formato e restrições completos no schema abaixo.  |
| `templateSelection.android.mode` | objeto | sim | Valor tipado; formato e restrições completos no schema abaixo.  |
| `templateSelection.android.templateId` | string | sim | Valor tipado; formato e restrições completos no schema abaixo. uuid |
| `templateSelection.android.version` | integer | sim | Valor tipado; formato e restrições completos no schema abaixo. Mínimo 1 |
| `templateSelection.ios` | object ou object ou object | não | Valor tipado; formato e restrições completos no schema abaixo.  |
| `templateSelection.ios.mode` | objeto | sim | Valor tipado; formato e restrições completos no schema abaixo.  |
| `templateSelection.ios.mode` | objeto | sim | Valor tipado; formato e restrições completos no schema abaixo.  |
| `templateSelection.ios.mode` | objeto | sim | Valor tipado; formato e restrições completos no schema abaixo.  |
| `templateSelection.ios.templateId` | string | sim | Valor tipado; formato e restrições completos no schema abaixo. uuid |
| `templateSelection.ios.version` | integer | sim | Valor tipado; formato e restrições completos no schema abaixo. Mínimo 1 |
| `templateSelection.recovery` | object ou object ou object | não | Valor tipado; formato e restrições completos no schema abaixo.  |
| `templateSelection.recovery.mode` | objeto | sim | Valor tipado; formato e restrições completos no schema abaixo.  |
| `templateSelection.recovery.mode` | objeto | sim | Valor tipado; formato e restrições completos no schema abaixo.  |
| `templateSelection.recovery.mode` | objeto | sim | Valor tipado; formato e restrições completos no schema abaixo.  |
| `templateSelection.recovery.templateId` | string | sim | Valor tipado; formato e restrições completos no schema abaixo. uuid |
| `templateSelection.recovery.version` | integer | sim | Valor tipado; formato e restrições completos no schema abaixo. Mínimo 1 |

Omitir campos opcionais usa o default documentado ou preserva o valor em PATCH. `null` só é aceito nos campos cujo schema permite null, com efeito de limpar/desvincular indicado no guia. Arrays enviados substituem a coleção quando o endpoint define atualização completa; não implicam merge. Identificadores/owner/app de um recurso existente não são transferidos por PATCH. Herança de templates/UTMs segue o guia, sem alterar links anteriores por cópia automática.

### Request mínimo

```json
{
  "appId": "app_loja",
  "domain": "go.example.com",
  "slug": "tenis"
}
```

### Request completo de referência

```json
{
  "appId": "app_loja",
  "domain": "go.example.com",
  "prefix": "ofertas",
  "slug": "tenis",
  "title": "Tênis da campanha",
  "desktopUrl": "https://shop.example.com/produtos/tenis",
  "appPath": "produtos/tenis"
}
```



## cURL

`AGILINK_API_KEY` deve ficar no servidor. Os placeholders abaixo são fictícios. Preserve Idempotency-Key e payload ao repetir uma intenção após timeout.

```sh
curl --request POST 'https://api.staging.agilink.io/v1/links/validate' \
  --header 'Authorization: Bearer <credencial>' \
  --header 'Idempotency-Key: 10000000-0000-4000-8000-000000000001' \
  --header 'Content-Type: application/json' \
  --data '{"appId":"app_loja","domain":"go.example.com","prefix":"ofertas","slug":"tenis","title":"Tênis da campanha","desktopUrl":"https://shop.example.com/produtos/tenis","appPath":"produtos/tenis"}'
```

## JavaScript / TypeScript

```js
// Node.js 22+. Defina AGILINK_API_KEY no ambiente do servidor.
const response = await fetch('https://api.staging.agilink.io/v1/links/validate', {
  method: 'POST',
  headers: {
  "Authorization": `Bearer ${process.env.AGILINK_API_KEY}`,
  "Idempotency-Key": "10000000-0000-4000-8000-000000000001",
  "Content-Type": "application/json"
},
  body: JSON.stringify({
  "appId": "app_loja",
  "domain": "go.example.com",
  "prefix": "ofertas",
  "slug": "tenis",
  "title": "Tênis da campanha",
  "desktopUrl": "https://shop.example.com/produtos/tenis",
  "appPath": "produtos/tenis"
}),
  redirect: 'error', signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error('HTTP '+response.status+' requestId='+response.headers.get('X-Request-Id'));
const result = await response.json();
console.log(result);
```

## Python

```python
# Python 3.10+; pip install requests
import os
import requests
headers = {
  "Authorization": "Bearer " + os.environ["AGILINK_API_KEY"],
  "Idempotency-Key": "10000000-0000-4000-8000-000000000001"
}
response = requests.request(
    'POST', 'https://api.staging.agilink.io/v1/links/validate',
    headers=headers, json={"appId":"app_loja","domain":"go.example.com","prefix":"ofertas","slug":"tenis","title":"Tênis da campanha","desktopUrl":"https://shop.example.com/produtos/tenis","appPath":"produtos/tenis"},
    timeout=30, allow_redirects=False)
if not 200 <= response.status_code < 300:
    raise RuntimeError(f'HTTP {response.status_code}; requestId={response.headers.get("X-Request-Id")}')
result = response.json()
print(result)
```

## Response 200

Sucesso. Exemplo fictício.

| Header | Significado | Exemplo |
| --- | --- | --- |
| `X-Request-Id` | Identificador gerado pelo servidor, inclusive para falhas e replays. | conforme resposta |
| `Cache-Control` | Respostas administrativas não podem ser armazenadas. | no-store, no-transform |
| `ETag` | Revisão forte, a enviar em If-Match na alteração. | "20000000-0000-4000-8000-000000000001" |

```json
{
  "data": {
    "valid": true,
    "available": true,
    "normalized": {
      "appId": "app_loja",
      "domain": "go.example.com",
      "prefix": "ofertas",
      "slug": "tenis",
      "title": "Tênis",
      "desktopUrl": "https://shop.example.com/"
    }
  },
  "meta": {
    "requestId": "req_00000000000040008000000000000001"
  }
}
```

| Campo | Tipo | Obrigatório | Significado e limites |
| --- | --- | --- | --- |
| `data` | LinkValidation | sim | Resultado tipado da operação.  |
| `data.valid` | objeto | sim | Valor tipado; formato e restrições completos no schema abaixo.  |
| `data.available` | boolean | sim | Valor tipado; formato e restrições completos no schema abaixo.  |
| `data.normalized` | LinkCreate | sim | Valor tipado; formato e restrições completos no schema abaixo.  |
| `data.normalized.appId` | string | sim | Aplicativo proprietário; precisa estar autorizado. Até 500 caracteres; Formato validado pelo schema |
| `data.normalized.domain` | Domain | sim | Hostname, sem protocolo ou caminho.  |
| `data.normalized.prefix` | string | não | Prefixo de caminho, sem barras. Até 200 caracteres; Formato validado pelo schema |
| `data.normalized.slug` | string | sim | Segmento final da identidade. Até 200 caracteres; Formato validado pelo schema |
| `data.normalized.folderId` | string ou null | não | Valor tipado; formato e restrições completos no schema abaixo.  |
| `data.normalized.campaignId` | string ou null | não | Valor tipado; formato e restrições completos no schema abaixo.  |
| `data.normalized.lifecycle` | LinkLifecycle | não | Valor tipado; formato e restrições completos no schema abaixo.  |
| `data.normalized.lifecycle.archived` | boolean | sim | Valor tipado; formato e restrições completos no schema abaixo.  |
| `data.normalized.lifecycle.paused` | boolean | sim | Valor tipado; formato e restrições completos no schema abaixo.  |
| `data.normalized.lifecycle.startsAt` | AnalyticsInstant ou null | sim | Valor tipado; formato e restrições completos no schema abaixo.  |
| `data.normalized.lifecycle.expiresAt` | AnalyticsInstant ou null | sim | Fim de validade; não amplia concessões.  |
| `data.normalized.lifecycle.fallbackUrl` | string ou null | sim | Valor tipado; formato e restrições completos no schema abaixo.  |
| `data.normalized.utm` | UtmParameters | não | Valor tipado; formato e restrições completos no schema abaixo.  |
| `data.normalized.utm.utm_source` | string | não | Valor tipado; formato e restrições completos no schema abaixo. Até 200 caracteres; Formato validado pelo schema |
| `data.normalized.utm.utm_medium` | string | não | Valor tipado; formato e restrições completos no schema abaixo. Até 200 caracteres; Formato validado pelo schema |
| `data.normalized.utm.utm_campaign` | string | não | Valor tipado; formato e restrições completos no schema abaixo. Até 200 caracteres; Formato validado pelo schema |
| `data.normalized.utm.utm_term` | string | não | Valor tipado; formato e restrições completos no schema abaixo. Até 200 caracteres; Formato validado pelo schema |
| `data.normalized.utm.utm_content` | string | não | Valor tipado; formato e restrições completos no schema abaixo. Até 200 caracteres; Formato validado pelo schema |
| `data.normalized.title` | string ou null | não | Título público.  |
| `data.normalized.description` | string ou null | não | Texto de apresentação.  |
| `data.normalized.imageUrl` | string ou null | não | Valor tipado; formato e restrições completos no schema abaixo.  |
| `data.normalized.desktopUrl` | string ou null | não | Valor tipado; formato e restrições completos no schema abaixo.  |
| `data.normalized.playStoreUrl` | string ou null | não | Valor tipado; formato e restrições completos no schema abaixo.  |
| `data.normalized.appStoreUrl` | string ou null | não | Valor tipado; formato e restrições completos no schema abaixo.  |
| `data.normalized.appPath` | string ou null | não | Valor tipado; formato e restrições completos no schema abaixo.  |
| `data.normalized.parameters` | Parameters | não | Parâmetros tipados do link; limites UTF-8 também se aplicam.  |
| `data.normalized.webOnly` | boolean | não | Direcionamento web; exige destino web válido.  |
| `data.normalized.behavior` | manual / automatic / intelligent | não | Valor tipado; formato e restrições completos no schema abaixo.  |
| `data.normalized.group` | main / operational | não | Grupo main/operational; diferente de pasta/campanha.  |
| `data.normalized.templateData` | object | não | Valor tipado; formato e restrições completos no schema abaixo.  |
| `data.normalized.templateSelection` | object | não | Herança, oficial ou versão customizada publicada.  |
| `data.normalized.templateSelection.android` | object ou object ou object | não | Valor tipado; formato e restrições completos no schema abaixo.  |
| `data.normalized.templateSelection.android.mode` | objeto | sim | Valor tipado; formato e restrições completos no schema abaixo.  |
| `data.normalized.templateSelection.android.mode` | objeto | sim | Valor tipado; formato e restrições completos no schema abaixo.  |
| `data.normalized.templateSelection.android.mode` | objeto | sim | Valor tipado; formato e restrições completos no schema abaixo.  |
| `data.normalized.templateSelection.android.templateId` | string | sim | Valor tipado; formato e restrições completos no schema abaixo. uuid |
| `data.normalized.templateSelection.android.version` | integer | sim | Valor tipado; formato e restrições completos no schema abaixo. Mínimo 1 |
| `data.normalized.templateSelection.ios` | object ou object ou object | não | Valor tipado; formato e restrições completos no schema abaixo.  |
| `data.normalized.templateSelection.ios.mode` | objeto | sim | Valor tipado; formato e restrições completos no schema abaixo.  |
| `data.normalized.templateSelection.ios.mode` | objeto | sim | Valor tipado; formato e restrições completos no schema abaixo.  |
| `data.normalized.templateSelection.ios.mode` | objeto | sim | Valor tipado; formato e restrições completos no schema abaixo.  |
| `data.normalized.templateSelection.ios.templateId` | string | sim | Valor tipado; formato e restrições completos no schema abaixo. uuid |
| `data.normalized.templateSelection.ios.version` | integer | sim | Valor tipado; formato e restrições completos no schema abaixo. Mínimo 1 |
| `data.normalized.templateSelection.recovery` | object ou object ou object | não | Valor tipado; formato e restrições completos no schema abaixo.  |
| `data.normalized.templateSelection.recovery.mode` | objeto | sim | Valor tipado; formato e restrições completos no schema abaixo.  |
| `data.normalized.templateSelection.recovery.mode` | objeto | sim | Valor tipado; formato e restrições completos no schema abaixo.  |
| `data.normalized.templateSelection.recovery.mode` | objeto | sim | Valor tipado; formato e restrições completos no schema abaixo.  |
| `data.normalized.templateSelection.recovery.templateId` | string | sim | Valor tipado; formato e restrições completos no schema abaixo. uuid |
| `data.normalized.templateSelection.recovery.version` | integer | sim | Valor tipado; formato e restrições completos no schema abaixo. Mínimo 1 |
| `meta` | object | sim | Correlação e informações da resposta.  |
| `meta.requestId` | RequestId | sim | Identificador de correlação gerado pelo servidor.  |

## Falhas, revisão e repetição

Idempotency-Key UUID v4 é obrigatório, por intenção e credencial, por 24 horas. Em resultado incerto, repita exatamente o mesmo método, URL, corpo, revisão e chave. Alterar a intenção exige nova chave. Segredos de emissão não são reexibidos. Esta operação não exige If-Match. Não faça retry automático ilimitado.

| Status | Significado |
| --- | --- |
| 400 | Cabeçalho, query, cursor ou JSON inválido. |
| 401 | Credencial inválida, expirada ou revogada. |
| 403 | Operação sem permissão ou capacidade desabilitada. |
| 404 | Recurso inexistente ou fora dos aplicativos autorizados. |
| 409 | Conflito de identidade/idempotência; operação em andamento ou segredo já exibido. |
| 413 | Corpo excede o limite. |
| 415 | Content-Type incompatível. |
| 422 | JSON bem formado com dados de domínio inválidos. |
| 429 | Quota excedida. Respeitar Retry-After. |
| 500 | Falha interna. Use requestId para diagnóstico. |
| 503 | Dependência indisponível; resultado da mutação pode ser incerto. |

### Exemplo 401

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

### Exemplo 403

```json
{
  "error": {
    "code": "insufficient_permission",
    "message": "Operação sem permissão ou capacidade desabilitada.",
    "requestId": "req_00000000000040008000000000000001",
    "documentationUrl": "https://docs.agilink.io/api/errors/#insufficient-permission"
  }
}
```

### Exemplo 409

```json
{
  "error": {
    "code": "idempotency_conflict",
    "message": "Conflito de identidade/idempotência; operação em andamento ou segredo já exibido.",
    "requestId": "req_00000000000040008000000000000001",
    "documentationUrl": "https://docs.agilink.io/api/errors/#idempotency-conflict"
  }
}
```

### Exemplo 429

```json
{
  "error": {
    "code": "rate_limited",
    "message": "Quota excedida. Respeitar Retry-After.",
    "requestId": "req_00000000000040008000000000000001",
    "documentationUrl": "https://docs.agilink.io/api/errors/#rate-limited"
  }
}
```

## Schema completo e próximos passos

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

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "appId": {
      "type": "string",
      "maxLength": 500,
      "minLength": 1,
      "pattern": "^[^/\\u0000-\\u001f\\u007f]+$"
    },
    "domain": {
      "$ref": "#/components/schemas/Domain"
    },
    "prefix": {
      "type": "string",
      "maxLength": 200,
      "pattern": "^(?!.*~-)(?!\\.{1,2}$)[A-Za-z0-9._~-]*$"
    },
    "slug": {
      "type": "string",
      "maxLength": 200,
      "pattern": "^(?!.*~-)(?!\\.{1,2}$)[A-Za-z0-9._~-]*$",
      "minLength": 1
    },
    "folderId": {
      "anyOf": [
        {
          "type": "string",
          "format": "uuid"
        },
        {
          "type": "null"
        }
      ]
    },
    "campaignId": {
      "anyOf": [
        {
          "type": "string",
          "format": "uuid"
        },
        {
          "type": "null"
        }
      ]
    },
    "lifecycle": {
      "$ref": "#/components/schemas/LinkLifecycle"
    },
    "utm": {
      "$ref": "#/components/schemas/UtmParameters"
    },
    "title": {
      "anyOf": [
        {
          "type": "string",
          "maxLength": 1000,
          "pattern": "^[^\\u0000-\\u001f\\u007f]*$"
        },
        {
          "type": "null"
        }
      ]
    },
    "description": {
      "anyOf": [
        {
          "type": "string",
          "maxLength": 4000,
          "pattern": "^[^\\u0000-\\u001f\\u007f]*$"
        },
        {
          "type": "null"
        }
      ]
    },
    "imageUrl": {
      "anyOf": [
        {
          "type": "string",
          "maxLength": 4096,
          "format": "uri",
          "pattern": "^https://[^/@?#\\s]+(?:[/?#]|$)"
        },
        {
          "type": "null"
        }
      ]
    },
    "desktopUrl": {
      "anyOf": [
        {
          "type": "string",
          "maxLength": 4096,
          "format": "uri",
          "pattern": "^https://[^/@?#\\s]+(?:[/?#]|$)"
        },
        {
          "type": "null"
        }
      ]
    },
    "playStoreUrl": {
      "anyOf": [
        {
          "type": "string",
          "maxLength": 4096,
          "format": "uri",
          "pattern": "^https://[^/@?#\\s]+(?:[/?#]|$)"
        },
        {
          "type": "null"
        }
      ]
    },
    "appStoreUrl": {
      "anyOf": [
        {
          "type": "string",
          "maxLength": 4096,
          "format": "uri",
          "pattern": "^https://[^/@?#\\s]+(?:[/?#]|$)"
        },
        {
          "type": "null"
        }
      ]
    },
    "appPath": {
      "anyOf": [
        {
          "type": "string",
          "maxLength": 2048,
          "minLength": 1,
          "pattern": "^(?!/)(?!.*[?#\\\\])(?!.*(?:^|/)\\.{1,2}(?:/|$))[^/]+(?:/[^/]+)*$"
        },
        {
          "type": "null"
        }
      ]
    },
    "parameters": {
      "$ref": "#/components/schemas/Parameters"
    },
    "webOnly": {
      "type": "boolean"
    },
    "behavior": {
      "enum": [
        "manual",
        "automatic",
        "intelligent"
      ]
    },
    "group": {
      "enum": [
        "main",
        "operational"
      ]
    },
    "templateData": {
      "type": "object",
      "additionalProperties": {
        "type": [
          "string",
          "number",
          "boolean"
        ]
      }
    },
    "templateSelection": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "android": {
          "oneOf": [
            {
              "type": "object",
              "additionalProperties": false,
              "properties": {
                "mode": {
                  "const": "inherit"
                }
              },
              "required": [
                "mode"
              ]
            },
            {
              "type": "object",
              "additionalProperties": false,
              "properties": {
                "mode": {
                  "const": "official"
                }
              },
              "required": [
                "mode"
              ]
            },
            {
              "type": "object",
              "additionalProperties": false,
              "properties": {
                "mode": {
                  "const": "custom"
                },
                "templateId": {
                  "type": "string",
                  "format": "uuid"
                },
                "version": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "required": [
                "mode",
                "templateId",
                "version"
              ]
            }
          ]
        },
        "ios": {
          "oneOf": [
            {
              "type": "object",
              "additionalProperties": false,
              "properties": {
                "mode": {
                  "const": "inherit"
                }
              },
              "required": [
                "mode"
              ]
            },
            {
              "type": "object",
              "additionalProperties": false,
              "properties": {
                "mode": {
                  "const": "official"
                }
              },
              "required": [
                "mode"
              ]
            },
            {
              "type": "object",
              "additionalProperties": false,
              "properties": {
                "mode": {
                  "const": "custom"
                },
                "templateId": {
                  "type": "string",
                  "format": "uuid"
                },
                "version": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "required": [
                "mode",
                "templateId",
                "version"
              ]
            }
          ]
        },
        "recovery": {
          "oneOf": [
            {
              "type": "object",
              "additionalProperties": false,
              "properties": {
                "mode": {
                  "const": "inherit"
                }
              },
              "required": [
                "mode"
              ]
            },
            {
              "type": "object",
              "additionalProperties": false,
              "properties": {
                "mode": {
                  "const": "official"
                }
              },
              "required": [
                "mode"
              ]
            },
            {
              "type": "object",
              "additionalProperties": false,
              "properties": {
                "mode": {
                  "const": "custom"
                },
                "templateId": {
                  "type": "string",
                  "format": "uuid"
                },
                "version": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "required": [
                "mode",
                "templateId",
                "version"
              ]
            }
          ]
        }
      },
      "required": []
    }
  },
  "required": [
    "appId",
    "domain",
    "slug"
  ]
}
```

</details>

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

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

</details>

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