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

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

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

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

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.

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

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

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

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.

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!

Last updated