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.
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}.
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étodo | Endpoint | Uso |
|---|---|---|
| POST | /api2/vendalink | Cria 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.
Cria a venda personalizada, seus itens e o link de checkout.
Headers
Bearer {{token}}.application/json.Campos
true, solicita o agendamento do e-mail. Padrão: false.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"
}
}
]
}
}
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ário | Resposta |
|---|---|
| Primeira requisição com a chave | 201 Created. |
| Mesma chave e mesmo payload | 200 OK, registro original e idempotent_replay=true. |
| Mesma chave e payload diferente | 409 Conflict. |
| Chave ausente ou inválida | 400 Bad Request. |
Consultar venda
Consulta a venda criada. A resposta usa o mesmo objeto vendalink retornado na criação.
Retorna a venda e seu estado atual.
curl "{{route}}/api2/vendalink?id={{vendalink_id}}" \
-H "Authorization: Bearer {{token}}" \
-H "Accept: application/json"
Estados
| Estado | Significado |
|---|---|
pending | Link disponível e sem pedido vinculado. |
converted | Pedido criado; order_increment_id preenchido. |
expired | Prazo 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.
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"
}
]
}
]
}
}
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.
| Tipo | Valor esperado |
|---|---|
drop_down, radio | option_type_id. |
checkbox, multiple | Array de option_type_id. |
field, area | Texto. |
date | YYYY-MM-DD. |
time | HH:mm. |
date_time | YYYY-MM-DDTHH:mm. |
file | Nã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-Keypara cada nova venda e preserve a chave ao repetir exatamente a mesma operação. - Consulte
/api2/vendalink/optionsantes de enviar produtos com opções personalizadas. - Trate o
checkout_urlcomo dado sensível — não o publique em logs abertos nem em canais compartilhados. - Deixe o servidor calcular o total; envie apenas
items[].pricecomo preço comercial de cada item. - Valide
email_sente a listawarningsna resposta quando usarsend_email=true.
Evitar
- Reutilizar a mesma
Idempotency-Keycom payload diferente — resulta em409 Conflict. - Enviar um campo de total no corpo — o total é sempre calculado pelo servidor.
- Preencher
items[].optionssem 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[].priceenviado.
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
| Status | Quando ocorre |
|---|---|
400 | JSON inválido, campo ausente, formato inválido ou chave de idempotência ausente. |
401 | Token ausente, inválido, revogado ou expirado. |
403 | Token sem permissão para o recurso. |
404 | Venda, SKU, store ou cupom não encontrado. |
409 | Chave de idempotência reutilizada com outro payload. |
422 | Produto, opção ou cupom existe, mas a combinação não pode criar a venda. |
500 | Falha técnica inesperada. |
{
"success": false,
"error": "Descrição objetiva do erro.",
"field": "items.0.options.123"
}