Logo da Plataforma Yep
API REST · Plataforma Yep Documentação técnica para integrações homologadas

Venda por Link

Contrato para integrações externas criarem vendas personalizadas e obterem o link de finalização do pedido. Em uma única operação, o endpoint cria a venda, seus itens e o link de checkout — o total é calculado pelo servidor. Depois é possível consultar a venda e as opções personalizadas aceitas por cada produto.

REST JSON Bearer Token Novo em 2026

Visão geral

A Venda por Link expõe um contrato POST para criar a venda e o link, e dois contratos GET auxiliares — um para consultar o estado da venda e outro para descobrir as opções personalizadas de um produto. Todas as requisições e respostas usam application/json e exigem Authorization: Bearer {token}.

V1
Versão do contratoEstrutura estável para integrações externas.
POST
Criação atômicaVenda, itens e link em uma única operação.
16–64
Idempotency-KeyCaracteres para retry seguro sem duplicar a venda.
3
EndpointsCriar a venda, consultar e listar as opções.
O total da venda é sempre calculado pelo servidor a partir dos itens enviados. O consumidor não deve enviar um campo de total. O price de cada item é o preço comercial definido pela integração.

Endpoints

Resumo dos contratos disponíveis. Base URL nos exemplos: /api2. Toda chamada exige Authorization: Bearer {{token}}.

MétodoEndpointUso
POST/api2/vendalinkCria a venda, seus itens e o link de checkout.
GET/api2/vendalink?id={id}Consulta a venda e seu estado atual.
GET/api2/vendalink/options?sku={sku}&store_id={store_id}Consulta as opções personalizadas aceitas por um produto.

Autenticação

Use o fluxo OAuth 2.0 da API REST Yep para gerar um token e envie-o em todas as chamadas. Consulte OAuth 2.0 para o fluxo completo.

curl -X POST "{{route}}/api2/oauth/token" \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d "client_id={{client_id}}" \
  -d "client_secret={{client_secret}}" \
  -d "grant_type=client_credentials"
Authorization: Bearer {{token}}
Accept: application/json
Content-Type: application/json

Criar venda e link

Cria a venda e todos os itens em uma única operação, retornando o link de finalização. O total é calculado pelo servidor.

POST/api2/vendalink

Cria a venda personalizada, seus itens e o link de checkout.

JSONIdempotenteNovo

Headers

Authorization Obrigatório
Bearer {{token}}.
Content-Type Obrigatório
application/json.
Idempotency-Key Obrigatório
Identificador único de 16 a 64 caracteres usado para retry seguro. Veja Idempotência.

Campos

email Obrigatório
String. E-mail válido do destinatário, com até 150 caracteres.
store_id Obrigatório
Inteiro. Store view ativa usada para catálogo, moeda, URL e e-mail.
coupon_code Opcional
String. Código de cupom existente e ativo.
send_email Opcional
Boolean. Quando true, solicita o agendamento do e-mail. Padrão: false.
expires_at Opcional
ISO 8601. Data futura de expiração do link.
items Obrigatório
Array. Lista com pelo menos um item.
items[].sku Obrigatório
String. SKU existente e habilitado para a store.
items[].qty Obrigatório
Number. Quantidade maior que zero.
items[].price Obrigatório
Number. Preço unitário maior que zero, com até duas casas decimais. É o preço comercial definido pela integração.
items[].options Condicional
Object. A chave é o option_id e o valor depende do tipo da opção. Consulte as opções do produto antes de enviar.

Exemplo de requisição

curl -X POST "{{route}}/api2/vendalink" \
  -H "Authorization: Bearer {{token}}" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: 6ec51e29-038d-4dbd-9be9-d6940935f103" \
  -d '{
    "email": "[email protected]",
    "store_id": 1,
    "coupon_code": "BEMVINDO10",
    "send_email": false,
    "expires_at": "2026-07-23T23:59:59-03:00",
    "items": [
      {
        "sku": "SKU-001",
        "qty": 2,
        "price": 149.90,
        "options": {
          "123": "456",
          "124": "Texto personalizado",
          "125": "2026-07-20",
          "126": "14:30"
        }
      }
    ]
  }'

Resposta — 201 Created

{
  "success": true,
  "vendalink": {
    "id": 87,
    "status": "pending",
    "email": "[email protected]",
    "store_id": 1,
    "coupon_code": "BEMVINDO10",
    "total": 299.80,
    "currency": "BRL",
    "checkout_url": "https://loja.exemplo.com/vendalink/venda/index/id/TOKEN",
    "expires_at": "2026-07-24T02:59:59+00:00",
    "order_increment_id": null,
    "email_sent": false,
    "created_at": "2026-07-16T19:30:00+00:00",
    "items": [
      {
        "id": 201,
        "sku": "SKU-001",
        "qty": 2,
        "price": 149.90,
        "row_total": 299.80,
        "options": {
          "123": "456",
          "124": "Texto personalizado",
          "125": "2026-07-20",
          "126": "14:30"
        }
      }
    ]
  }
}
Se a venda for criada, mas o envio do e-mail não puder ser agendado, a criação não será desfeita. A resposta indicará email_sent=false e poderá trazer uma lista warnings. O link de checkout deve ser tratado como dado sensível e não deve ser publicado em logs abertos.

Idempotência

A Idempotency-Key garante que reenviar exatamente a mesma requisição não crie uma segunda venda. Gere uma nova chave para cada nova venda e preserve a chave ao repetir a mesma operação.

CenárioResposta
Primeira requisição com a chave201 Created.
Mesma chave e mesmo payload200 OK, registro original e idempotent_replay=true.
Mesma chave e payload diferente409 Conflict.
Chave ausente ou inválida400 Bad Request.

Consultar venda

Consulta a venda criada. A resposta usa o mesmo objeto vendalink retornado na criação.

GET/api2/vendalink?id={{vendalink_id}}por ID

Retorna a venda e seu estado atual.

curl "{{route}}/api2/vendalink?id={{vendalink_id}}" \
  -H "Authorization: Bearer {{token}}" \
  -H "Accept: application/json"

Estados

EstadoSignificado
pendingLink disponível e sem pedido vinculado.
convertedPedido criado; order_increment_id preenchido.
expiredPrazo encerrado sem conversão.

Opções do produto

Retorna os identificadores e formatos necessários para preencher items[].options. Consulte este endpoint antes de enviar produtos com opções personalizadas.

GET/api2/vendalink/options?sku={{product_sku}}&store_id={{store_id}}

Lista as opções personalizadas aceitas por um produto.

curl "{{route}}/api2/vendalink/options?sku={{product_sku}}&store_id={{store_id}}" \
  -H "Authorization: Bearer {{token}}" \
  -H "Accept: application/json"

Resposta — 200 OK

{
  "success": true,
  "product": {
    "sku": "SKU-001",
    "name": "Produto de exemplo",
    "catalog_price": 159.90,
    "options": [
      {
        "option_id": 123,
        "title": "Cor",
        "type": "drop_down",
        "required": true,
        "values": [
          {
            "option_type_id": 456,
            "title": "Azul",
            "price": 0,
            "price_type": "fixed"
          }
        ]
      }
    ]
  }
}
O preço de catálogo retornado aqui é informativo; o valor efetivo da venda será o items[].price enviado na criação.

Formatos das opções

O valor de cada chave em items[].options depende do type da opção retornado acima.

TipoValor esperado
drop_down, radiooption_type_id.
checkbox, multipleArray de option_type_id.
field, areaTexto.
dateYYYY-MM-DD.
timeHH:mm.
date_timeYYYY-MM-DDTHH:mm.
fileNão suportado no JSON da V1.

Recomendações para integração

Boas práticas consolidadas para integrações que criam vendas personalizadas com a Plataforma Yep.

Recomendado

  • Gere uma nova Idempotency-Key para cada nova venda e preserve a chave ao repetir exatamente a mesma operação.
  • Consulte /api2/vendalink/options antes de enviar produtos com opções personalizadas.
  • Trate o checkout_url como dado sensível — não o publique em logs abertos nem em canais compartilhados.
  • Deixe o servidor calcular o total; envie apenas items[].price como preço comercial de cada item.
  • Valide email_sent e a lista warnings na resposta quando usar send_email=true.

Evitar

  • Reutilizar a mesma Idempotency-Key com payload diferente — resulta em 409 Conflict.
  • Enviar um campo de total no corpo — o total é sempre calculado pelo servidor.
  • Preencher items[].options sem antes consultar o endpoint de opções do produto.
  • Usar o preço de catálogo como valor da venda — o valor efetivo é o items[].price enviado.

Fluxo recomendado

Consulte as opções do produto → monte o payload com items[].options no formato correto → envie o POST com uma Idempotency-Key nova → entregue o checkout_url ao cliente → acompanhe o estado da venda por GET /api2/vendalink?id={id} até converted ou expired.

Erros comuns

StatusQuando ocorre
400JSON inválido, campo ausente, formato inválido ou chave de idempotência ausente.
401Token ausente, inválido, revogado ou expirado.
403Token sem permissão para o recurso.
404Venda, SKU, store ou cupom não encontrado.
409Chave de idempotência reutilizada com outro payload.
422Produto, opção ou cupom existe, mas a combinação não pode criar a venda.
500Falha técnica inesperada.
{
  "success": false,
  "error": "Descrição objetiva do erro.",
  "field": "items.0.options.123"
}