---
title: "GET /v1/links/{id}"
description: "Resolver metadados públicos"
sidebar:
  hidden: true
---

Operação pública/SDK existente, separada da Platform API administrativa. [Guia funcional](/sdk/contratos-publicos/) · [Índice dos 13 endpoints](/sdk/endpoints-publicos/) · [Schemas navegáveis](/contratos-publicos/) · [JSON Schema](/contracts/public-openapi.json). Não envie Authorization administrativo. Tokens/capacidades transitórias dos exemplos são fictícios.


## GET /v1/links/{id}

Resolver metadados públicos. Contrato público existente, separado de administração. Detecção exige opt-in; não chamar sua rota Edge interna diretamente. Capacidades e validade são revalidadas no servidor.

Base de exemplo: `https://edge.agilink.invalid/functions/v1/api`.

| Parâmetro | Local | Obrigatório |
| --- | --- | --- |
| `id` | path | sim |
| `appId` | query | sim |

Sem corpo de requisição. Associações também aceitam HEAD com corpo de resposta vazio.

```sh
curl --request GET 'https://edge.agilink.invalid/functions/v1/api/v1/links/go.example.com~-a~-produto?appId=app_loja'
```

Resposta `200`: Sucesso; exemplos fictícios. ACKs de telemetria devem ser lidos por evento.

```json
{
  "version": 1,
  "link": {
    "id": "go.example.com~-a~-produto",
    "appId": "app_loja",
    "domain": "go.example.com",
    "prefix": "a",
    "slug": "produto",
    "appPath": "produto/123",
    "title": "Produto",
    "description": null,
    "imageUrl": null,
    "webUrl": "https://shop.example.com/produto/123",
    "webOnly": false,
    "parameters": {
      "sku": "123"
    }
  }
}
```

Erros documentados: `400`, `403`, `404`, `503`. Erros do Worker podem ter corpo vazio. Etapas de recuperação podem responder `200 {"accepted":false}`; ACK HTTP não significa conteúdo exibido. Consulte os schemas e o guia para condições, validade, retry e envelopes.

## JavaScript / TypeScript

```js
const response = await fetch("https://edge.agilink.invalid/functions/v1/api/v1/links/go.example.com~-a~-produto?appId=app_loja", { method: "GET" });
if (!response.ok) throw new Error('HTTP ' + response.status);
const result = await response.json();
// Confira accepted e o ACK de cada evento. Não registre tokens transitórios.
```

## Python

```python
import json
import requests
response = requests.request("GET", "https://edge.agilink.invalid/functions/v1/api/v1/links/go.example.com~-a~-produto?appId=app_loja", timeout=30)
response.raise_for_status()
result = response.json()
# Confira accepted/ACK, sem registrar tokens transitórios.
```

## Campos, limites e semântica

Os schemas abaixo descrevem obrigatoriedade, tipos, defaults, enums e limites; referências apontam para components.schemas do contrato baixável. Omitir opcionais usa o comportamento do contrato; null só é aceito onde declarado. A API pública não usa os envelopes, If-Match ou Idempotency-Key administrativos. Eventos e etapas de recuperação usam seus próprios IDs, deduplicação e capacidade transitória. Não repita um resgate como se fosse leitura: consulte o estado e os limites do [ciclo de recuperação](/sdk/contratos-publicos/). A resolução não gera clique administrativo; telemetria é client_reported. Associação nativa publicada exige verificação em aparelho. Sem paginação administrativa; requests não concedem acesso de gerenciamento.

### Request schema

```json
{
  "description": "Sem corpo; parâmetros na URL conforme acima."
}
```

### Response schema

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://agilink.io/contracts/native-links/v1/resolution.schema.json",
  "title": "Agilink resolution v1",
  "type": "object",
  "required": [
    "version",
    "link"
  ],
  "additionalProperties": false,
  "properties": {
    "version": {
      "const": 1
    },
    "link": {
      "type": "object",
      "required": [
        "id",
        "appId",
        "domain",
        "prefix",
        "slug",
        "appPath",
        "title",
        "description",
        "imageUrl",
        "webUrl",
        "webOnly",
        "parameters"
      ],
      "additionalProperties": false,
      "properties": {
        "id": {
          "type": "string"
        },
        "appId": {
          "type": "string"
        },
        "domain": {
          "type": "string"
        },
        "prefix": {
          "type": "string"
        },
        "slug": {
          "type": "string"
        },
        "appPath": {
          "type": [
            "string",
            "null"
          ],
          "maxLength": 2048
        },
        "title": {
          "type": [
            "string",
            "null"
          ],
          "maxLength": 1000
        },
        "description": {
          "type": [
            "string",
            "null"
          ],
          "maxLength": 4000
        },
        "imageUrl": {
          "type": [
            "string",
            "null"
          ],
          "maxLength": 4096
        },
        "webUrl": {
          "type": [
            "string",
            "null"
          ],
          "maxLength": 4096
        },
        "webOnly": {
          "type": "boolean"
        },
        "parameters": {
          "type": "object"
        }
      },
      "allOf": [
        {
          "if": {
            "properties": {
              "webOnly": {
                "const": true
              }
            }
          },
          "then": {
            "properties": {
              "webUrl": {
                "type": "string",
                "minLength": 1
              }
            }
          }
        }
      ]
    }
  }
}
```

Headers: Content-Type application/json nas respostas JSON. Erros aplicáveis são os listados acima e podem ter corpo vazio; 429 exige respeitar Retry-After quando fornecido, sem tentativas ilimitadas. Não trate HTTP 200/ACK como confirmação de conteúdo exibido, instalação ou detecção certa.
