Logística

Países

Listar países

GET https://api.dooki.com.br/v2/{alias}/logistics/countries

Response

[
    {
        "code": "BR",
        "name": "Brasil"
    },
]

Armazéns

Listar armazéns

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",
    },
}

Criar armazéns

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.

Visualizar armazém

GET https://api.dooki.com.br/v2/{alias}/logistics/warehouses/{id}

Atualizar armazém

PUT https://api.dooki.com.br/v2/{alias}/logistics/warehouses/{id}

Excluir armazém

DELETE https://api.dooki.com.br/v2/{alias}/logistics/warehouses/{id}

Estoques

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.

Listar estoques

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",
            }
        }
    },
}

Criar estoque

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.

Visualizar estoque

GET https://api.dooki.com.br/v2/{alias}/logistics/stocks/{id}

Atualizar estoque

PUT https://api.dooki.com.br/v2/{alias}/logistics/stocks/{id}

Excluir estoque

DELETE https://api.dooki.com.br/v2/{alias}/logistics/stocks/{id}

Reservas de estoque

Acesso as informações de reserva de estoque criada para pedidos. Includes disponíveis: orders.

Listar reservas de estoque

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

Embalagens

Listar embalagens

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,
        },
    ]
}

Criar embalagem

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).

Visualizar embalagem

GET https://api.dooki.com.br/v2/{alias}/logistics/boxes/{id}

Atualizar embalagem

PUT https://api.dooki.com.br/v2/{alias}/logistics/boxes/{id}

Excluir embalagem

DELETE https://api.dooki.com.br/v2/{alias}/logistics/boxes/{id}

Transportadoras

Listar transportadoras

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": ">"
    },
}

Criar transportadora

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 <

Visualizar transportadora

GET https://api.dooki.com.br/v2/{alias}/logistics/carriers/{id}

Atualizar transportadora

PUT https://api.dooki.com.br/v2/{alias}/logistics/carriers/{id}

Excluir transportadora

DELETE https://api.dooki.com.br/v2/{alias}/logistics/carriers/{id}

Preços de frete (planilhas)

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
        },
    ]
}

Filtros personalizados

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.

Listar preços de uma transportadora

GET https://api.dooki.com.br/v2/{alias}/logistics/carriers/{carrierId}/prices

Criar preço para uma transportadora

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.

Visualizar preço

GET https://api.dooki.com.br/v2/{alias}/logistics/carriers/{carrierId}/prices/{id}

Atualizar preço

PUT https://api.dooki.com.br/v2/{alias}/logistics/carriers/{carrierId}/prices/{id}

Excluir preço

DELETE https://api.dooki.com.br/v2/{alias}/logistics/carriers/{carrierId}/prices/{id}

Exportar preços

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.

Consulta de CEP

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
    }
}

Consultar CEP

GET https://api.dooki.com.br/v2/{alias}/logistics/zipcode/{zipcode}

Calcular frete

Request

{
    "zipcode": "14940000",
    "total": 430.00,
    "origin": "product_page",
    "utm_email": "john@snow.com",
    "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
        },
    }
}

Calcular frete

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)

API de frete

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,
    "cart": {
        "promocode": null,
        "customer": {
            "document": "00000000000",
            "email": "foo@bar.com.br"
        }
    },
    "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)

cart

Objeto do carrinho (pode ser vazio)

cart.promocode

Cupom de desconto

cart.customer

Objeto do cliente (pode ser vazio)

cart.customer.document

CPF ou CNPJ do cliente

cart.customer.email

E-mail do cliente

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;

Segurança nas 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!

Atualizado