Comment on page
Logística
GET https://api.dooki.com.br/v2/{alias}/logistics/countries
Response
[
{
"code": "BR",
"name": "Brasil"
},
]
GET https://api.dooki.com.br/v2/{alias}/logistics/warehouses
Request
{
"country_code": "BR",
"name": "Doca 1",
"zipcode": "14940000",
"street": "Street Test",
"number": 200,
"neighborhood": "Centro",
"city": "Ibitinga",
"state": "SP"
}
Response
{
"data": {
"id": 1,
"country_code": "BR",
"name": "Doca 1",
"zipcode": "14940000",
"street": "Street Test",
"number": 200,
"complement": null,
"neighborhood": "Centro",
"city": "Ibitinga",
"state": "SP",
},
}
POST https://api.dooki.com.br/v2/{alias}/logistics/warehouses
Parâmetro | Tipo | Obrigatório | Descrição |
country_code | string | Sim | Código do país. |
name | string | Sim | Nome do armazém. |
zipcode | string | Sim | CEP do armazém. |
street | string | Sim | Rua do armazém. |
number | string | Sim | Número do armazém. |
complement | string | Não | Complemento do armazém. |
neighborhood | string | Sim | Bairro do armazém. |
city | string | Sim | Cidade do armazém. |
state | string | Sim | Estado do armazém. |
GET https://api.dooki.com.br/v2/{alias}/logistics/warehouses/{id}
PUT https://api.dooki.com.br/v2/{alias}/logistics/warehouses/{id}
DELETE https://api.dooki.com.br/v2/{alias}/logistics/warehouses/{id}
O lojista pode ter um cadastro de múltiplos estoques onde ele pode associar posteriormente os SKUS com suas respectivas quantidades. Um exemplo prático é permitir que ele consiga trabalhar com estoques de fornecedores externos com diferentes prazos de entrega.
Caso um SKU estiver relacionado a um estoque, a disponibilidade final de entrega será sempre a maior.
GET https://api.dooki.com.br/v2/{alias}/logistics/stocks
Request
{
"name": "Estoque pronta entrega",
"delivery_days": 1,
"warehouse_id": 4
}
Response
{
"data": {
"id": 3,
"warehouse_id": 4,
"name": "Estoque pronta entrega",
"delivery_days": 1,
"warehouse": {
"data": {
"id": 4,
"country_code": "BR",
"name": "Doca 1",
"zipcode": 14940000,
"street": "Street Test",
"number": "200",
"complement": null,
"neighborhood": "Centro",
"city": "Ibitinga",
"state": "SP",
}
}
},
}
POST https://api.dooki.com.br/v2/{alias}/logistics/stocks
Parâmetro | Tipo | Obrigatório | Descrição |
name | string | Sim | Nome do estoque. |
delivery_days | int | Sim | Dias de entrega do estoque. |
warehouse_id | int | Não | ID do armazém. |
GET https://api.dooki.com.br/v2/{alias}/logistics/stocks/{id}
PUT https://api.dooki.com.br/v2/{alias}/logistics/stocks/{id}
DELETE https://api.dooki.com.br/v2/{alias}/logistics/stocks/{id}
Acesso as informações de reserva de estoque criada para pedidos.
Includes disponíveis: orders.
GET https://api.dooki.com.br/v2/{alias}/logistics/stock-reservation
Também é possível acessar as informações de uma reserva de estoque em específico
GET https://api.dooki.com.br/v2/{alias}/logistics/stock-reservation/{id}
Response ao listar reservas de estoque
{
"id": 17,
"order_id": 04,
"sku_id": 2020,
"stock_id": 19,
"sku": "170800-111202",
"sku_name": "Jogo",
"order_status": "handling_products",
"order_status_name": "Produtos em separação",
"order_number": 3329438969873,
"customer_name": "John Doe",
"quantity": 1,
"previous_quantity": 999992,
"authorized_at": "2020-05-20 03:33:04",
"cancelled_at": null,
"created_at": {
"date": "2020-05-19 17:07:25.000000",
"timezone_type": 3,
"timezone": "America/Sao_Paulo"
},
"updated_at": {
"date": "2020-05-20 03:33:04.000000",
"timezone_type": 3,
"timezone": "America/Sao_Paulo"
},
"stock": {
"data": {
"id": 11,
"warehouse_id": 92,
"priority": false,
"auto_refill": true,
"name": "Estoque",
"delivery_days": 5,
"created_at": {
"date": "2018-05-28 12:45:46.000000",
"timezone_type": 3,
"timezone": "America/Sao_Paulo"
},
"updated_at": {
"date": "2020-05-04 18:46:39.000000",
"timezone_type": 3,
"timezone": "America/Sao_Paulo"
},
"warehouse": {
"data": {
"id": 29,
"country_code": "BR",
"name": "Armazém",
"zipcode": "14940000",
"street": "Av. D. Pedro IV",
"number": "982",
"complement": null,
"neighborhood": "Centro",
"city": "Ibitinga",
"state": "SP",
"created_at": {
"date": "2018-05-28 12:22:48.000000",
"timezone_type": 3,
"timezone": "America/Sao_Paulo"
},
"updated_at": {
"date": "2018-05-28 12:22:48.000000",
"timezone_type": 3,
"timezone": "America/Sao_Paulo"
}
}
}
}
}
}
É possível utilizar filtros nesse endpoint por parâmetro, são eles:
sku_id
, stock_id
, order_id
e busca por nome de produto ou sku, pelo parâmetro q
.
Exemplos:
GET https://api.dooki.com.br/v2/{alias}/logistics/stock-reservation?order_id=32
GET https://api.dooki.com.br/v2/{alias}/logistics/stock-reservation?q=Jogo
GET https://api.dooki.com.br/v2/{alias}/logistics/boxes
Request
{
"name": "Embalagem Test",
"outer_width": 12,
"outer_length": 12,
"outer_depth": 12,
"empty_weight": 12,
"inner_width": 12,
"inner_length": 12,
"inner_depth": 12,
"max_weight": 12
}
Response
{
"data": [
{
"id": 1,
"name": "Embalagem Test",
"outer_width": 12,
"outer_length": 12,
"outer_depth": 12,
"inner_width": 12,
"inner_length": 12,
"inner_depth": 12,
"empty_weight": 12,
"max_weigth": 0,
},
]
}
POST https://api.dooki.com.br/v2/{alias}/logistics/boxes
Parâmetro | Tipo | Obrigatório | Descrição |
name | string | Sim | Nome da embalagem. |
outer_width | float | Sim | Largura externa da embalagem (em cm). |
outer_length | float | Sim | Comprimento externo da embalagem (em cm). |
outer_depth | float | Sim | Altura externa da embalagem (em cm). |
inner_width | float | Sim | Largura interna da embalagem (em cm). |
inner_length | float | Sim | Comprimento interno da embalagem (em cm). |
inner_depth | float | Sim | Altura interna da embalagem (em cm). |
max_weight | float | Sim | Peso máximo da embalagem (em kg). |
empty_weight | float | Sim | Peso da embalagem vazia (em kg). |
GET https://api.dooki.com.br/v2/{alias}/logistics/boxes/{id}
PUT https://api.dooki.com.br/v2/{alias}/logistics/boxes/{id}
DELETE https://api.dooki.com.br/v2/{alias}/logistics/boxes/{id}
GET https://api.dooki.com.br/v2/{alias}/logistics/carriers
Request
{
"active": true,
"name": "PAC",
"only_backup_use": false,
"origin_zipcode": "14940000",
"increment_percent": 0,
"max_weight": 100,
"active_cubic_weight": false,
"cubic_weight_factor": 0,
"min_cubic_weight": 10,
"weight_param": "real",
"weight_condition": ">"
}
Response
{
"data": {
"id": 1,
"active": true,
"name": "PAC",
"only_backup_use": false,
"origin_zipcode": "14940000",
"increment_percent": 0,
"max_weight": 100,
"active_cubic_weight": false,
"cubic_weight_factor": 0,
"min_cubic_weight": 10,
"weight_param": "real",
"weight_condition": ">"
},
}
POST https://api.dooki.com.br/v2/{alias}/logistics/carriers
Parâmetro | Tipo | Obrigatório | Descrição |
active | boolean | Sim | Marca se a transportadora está ativa ou não. |
name | string | Sim | Nome da transportadora. |
only_backup_use | boolean | Sim | Marca se a transportadora será utilizada somente para backup em caso de falha de algum webservice. |
origin_zipcode | string | Sim | CEP de origem. |
increment_percent | float | Sim | Porcentagem adicional no preço de entrega. Valor padrão: 0 |
max_weight | float | Sim | Peso máximo que a transportadora suporta (em kg). |
active_cubic_weight | boolean | Sim | Marca se será considerado o peso cúbico. |
cubic_weight_factor | float | Sim | Fator de cubagem. |
min_cubic_weight | float | Sim | Peso real mínimo para que o peso cúbico seja considerado. |
weight_param | string | Sim | Marca qual o peso será considerado como parâmetro. Valores aceitos: real ou cubic |
weight_condition | string | Sim | Condicional que compara os dois tipos de pesos. Valores aceitos: > ou < |
GET https://api.dooki.com.br/v2/{alias}/logistics/carriers/{id}
PUT https://api.dooki.com.br/v2/{alias}/logistics/carriers/{id}
DELETE https://api.dooki.com.br/v2/{alias}/logistics/carriers/{id}
Request
{
"id": 117936,
"carrier_id": 42,
"description": "ACRE - CAPITAL",
"zipcode_min": 69900000,
"zipcode_max": 69920999,
"max_weight": 1,
"min_weight": 0,
"price": 66.51,
"extra_weight_price": 0,
"delivery_days": 8,
"increment_percent": 10
}
Response
{
"data": [
{
"id": 117936,
"carrier_id": 42,
"description": "ACRE - CAPITAL",
"zipcode_min": 69900000,
"zipcode_max": 69920999,
"max_weight": 1,
"min_weight": 0,
"price": 66.51,
"extra_weight_price": 0,
"delivery_days": 8,
"increment_percent": 10
},
{
"id": 117937,
"carrier_id": 42,
"description": "ACRE - CAPITAL",
"zipcode_min": 69900000,
"zipcode_max": 69920999,
"max_weight": 2,
"min_weight": 1.00,
"price": 86.62,
"extra_weight_price": 0,
"delivery_days": 8,
"increment_percent": 10
},
{
"id": 117938,
"carrier_id": 42,
"description": "ACRE - CAPITAL",
"zipcode_min": 69900000,
"zipcode_max": 69920999,
"max_weight": 3,
"min_weight": 2.00,
"price": 107.54,
"extra_weight_price": 0,
"delivery_days": 8,
"increment_percent": 10
},
]
}
Esse tipo de filtro não utiliza a sintaxe global. Neste caso, o parâmetro é passado individualmente via query string na URL.
Parâmetro | Tipo | Descrição |
zipcode | string | Faz o filtro de registros de acordo com o CEP informado. |
GET https://api.dooki.com.br/v2/{alias}/logistics/carriers/{carrierId}/prices
POST https://api.dooki.com.br/v2/{alias}/logistics/carriers/{carrierId}/prices
Parâmetro | Tipo | Obrigatório | Descrição |
carrier_id | int | Sim | ID da transportadora. |
description | string | Sim | Descrição da faixa de CEP. |
zipcode_min | string | Sim | CEP inicial. |
zipcode_max | string | Sim | CEP final. |
price | float | Sim | Preço do frete. |
delivery_days | int | Sim | Dias para entrega. |
extra_weight_price | float | Sim | Valor extra por kilo adicional. |
increment_percent | float | Não | Porcentagem adicional no valor do frete. |
GET https://api.dooki.com.br/v2/{alias}/logistics/carriers/{carrierId}/prices/{id}
PUT https://api.dooki.com.br/v2/{alias}/logistics/carriers/{carrierId}/prices/{id}
DELETE https://api.dooki.com.br/v2/{alias}/logistics/carriers/{carrierId}/prices/{id}
GET https://api.dooki.com.br/v2/{alias}/logistics/carriers/{carrierId}/prices/export
Dica: os filtros de busca também estão disponíveis no endpoint de exportação.
O sistema enviará para o usuário um e-mail com o link para download da planilha com os registros.
Response de consulta de CEP
{
"data": {
"zipcode": "01505010",
"street": "Rua Anita Ferraz",
"neighborhood": "Sé",
"city": "São Paulo",
"uf": "SP",
"source": "database",
"city_id": 173
}
}
GET https://api.dooki.com.br/v2/{alias}/logistics/zipcode/{zipcode}
Request
{
"zipcode": "14940000",
"total": 430.00,
"origin": "product_page",
"utm_email": "[email protected]",
"skus_ids": [1233, 2123, 3423, 41233, 54423],
"quantities": [1, 1, 1, 2, 2]
}
Response de cálculo de frete
{
"data": {
"INTELIPOST_CORREIOS_PAC_1": {
"id": "INTELIPOST_CORREIOS_PAC_1",
"service_id": 1,
"service_name": "Correios PAC",
"service_display_name": "Correios PAC",
"service_type_id": 1,
"service_type_name": "Correios",
"price": 0,
"delivery_time": 18,
"quote_id": 3517956284,
"gateway": "intelipost",
"zipcode": "14940000",
"street": null,
"neighborhood": null,
"city": "Ibitinga",
"uf": "SP",
"source": "database",
"city_id": 3,
"formated_delivery_time": "até 18 dias úteis",
"formated_price": "Grátis",
"free_shipment": true,
"real_price": 0
},
"INTELIPOST_CORREIOS_SEDEX_2": {
"id": "INTELIPOST_CORREIOS_SEDEX_2",
"service_id": 2,
"service_name": "Correios Sedex",
"service_display_name": "Correios Sedex",
"service_type_id": 2,
"service_type_name": "Correios",
"price": 24.32,
"delivery_time": 13,
"quote_id": 3517956284,
"gateway": "intelipost",
"zipcode": "14940000",
"street": null,
"neighborhood": null,
"city": "Ibitinga",
"uf": "SP",
"source": "database",
"city_id": 3,
"formated_delivery_time": "até 13 dias úteis",
"formated_price": "R$ 24,32",
"free_shipment": false,
"real_price": 24.32
},
}
}
POST https://api.dooki.com.br/v2/{alias}/logistics/shipping-costs
Parâmetro | Tipo | Obrigatório | Descrição |
zipcode | string | Sim | CEP de entrega. |
total | float | Sim | Valor total da compra. |
origin | string | Não | Origem da consulta. Exemplo: product_page , cart |
utm_email | string | Não | E-mail do cliente que está consultando o frete. |
skus_ids | array | Sim | IDs dos SKUS. |
quantities | array | Sim | Quantidades dos SKUS (precisa seguir a ordem que os skus_ids foram declarados) |
Com este recurso é possível conectar APIS externas de cálculo de frete de serviços que não são integrados nativamente na Yampi.
Para habilitar este recurso, o lojista precisa criar uma API de frete pelo painel da Yampi, acessando o menu Configurações > Logística > API de Frete
Você deverá cadastrar:
- Nome da API
- URL da API
- Headers (optional)
Já com sua API cadastrada, quando um comprador solicitar um cálculo de frete, a Yampi enviará um request via POST para a URL informada. O formato do payload será:
{
"zipcode": "14940472",
"amount": 120.00,
"skus": [
{
"id": 1231233,
"product_id": 12313,
"sku": "716237816313213",
"price": 12.00,
"quantity": 2,
"length": 1,
"width": 1,
"height": 1,
"weight": 1,
"availability_days": 1,
"platform": {
"name": "shopify",
"external_id": 1231231231313
}
}
]
}
Campo | Descrição |
zipcode | CEP de entrega |
amount | Valor do carrinho de compras |
skus.id | ID do SKU na Yampi |
skus.product_id | ID do Produto na Yampi |
skus.sku | Código SKU |
skus.quantity | Quantidade do item no carrinho |
skus.length | Comprimento do SKU (unitário) |
skus.width | Largura do SKU (unitário) |
skus.height | Altura do SKU (unitário) |
skus.weight | Peso do SKU (unitário e em KG) |
skus.platform.name | Nome da plataforma externa que o SKU pertence |
skus.platform.id | ID do SKU na plataforma externa |
skus.availability_days | Prazo de postagem (em dias) |
Após receber o request da Yampi, sua aplicação deverá, obrigatoriamente, retornar a cotação de frete no seguinte formato:
{
"quotes": [
{
"name": "OPÇÃO FRETE 1",
"service": "SEDEX",
"price": 37.5,
"days": 36,
"quote_id" : 1 // opcional
},
{
"name": "OPÇÃO FRETE 2",
"service": "PAC",
"price": 37.5,
"days": 36,
"quote_id" : 1 // opcional
}
]
}
Importante:
- sua aplicação deve responder a request em até 5 segundos, no máximo. Caso contrário, a Yampi irá abortar a request;
- A API de frete será automaticamente desativada se detectarmos 20 falhas de requisições.
A validação da requisição serve para verificar se realmente ela foi enviado pela Yampi, e é de extrema importância a sua utilização para que suas transações estejam seguras.
Para cada API de frete é gerada uma chave secreta, onde utilizamos dela para gerar uma assinatura em cima do body da solicitação.
- Valor do header X-Yampi-Hmac-SHA256. Vamos chamar esse valor de "assinatura da requisição";
- Corpo da requisição. Com esses dois valores, basta realizar o base64 do algoritmo HMAC-SHA256 do corpo da requisição utilizando a chave secreta da API de frete e comparar com a assinatura da requisição. Se os valores forem iguais, excelente. Caso contrário, não fomos nós que enviamos essa requisição!
Last modified 1yr ago