> For the complete documentation index, see [llms.txt](https://desenvolvedores.skyhub.com.br/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://desenvolvedores.skyhub.com.br/frete/como-homologar-frete.md).

# Como Homologar

É possível criar a própria política de logística ao implantar uma URL de frete que será responsável pela cotação do cálculo (de frete) para os produtos integrados. Abaixo é apresentada a estrutura esperada para a cotação do frete via URL.&#x20;

Uma vez desenvolvida, a URL deverá ser encaminhada ao time de API para que sejam realizadas as devidas validações.

### Regras para a implementação

Para garantir uma boa experiência para os compradores, o serviço de frete deve responder em **até&#x20;**<mark style="color:red;">**400 ms**</mark>. Caso o serviço demore mais do que 400 ms para responder, o cálculo de frete será realizado através da <mark style="color:green;">**planilha de contingência**</mark> cadastrada pelo *seller* no portal do marketplace.

Em relação a cotação para o cliente, o marketplace Americanas irá apresentar a opção mais barata entre as disponíveis; o segundo ponto é a entrega mais rápida, seguindo as regras do *buybox*, caso haja mais de uma resposta de cotação positiva.

{% hint style="warning" %}
**Importante ressaltar que o servidor da Americanas se localiza na Virgínia.**

A localização do servidor deve ser levada em consideração para que a URL seja capaz de responder em tempo adequado.
{% endhint %}

Os dados utilizados para a homologação são fictícios, não possuindo vínculo com nenhuma conta em produção, ou seja, serão realizadas requisições com dados aleatórios de um produto de teste que não pertencerá a uma loja em produção, porém espera-se <mark style="color:green;">**sucesso**</mark> na requisição.

Caso a URL a ser validada possua regras que impeçam o sucesso ao ser informado um SKU fictício não será possível dar andamento ao processo de homologação.

{% hint style="info" %}
A homologação consiste em garantir que a URL informada esteja respondendo em tempo hábil (até **400 ms**) e que não existam impeditivos para a cotação do frete, que deverá levar em consideração especialmente as informações de **CEP** e **dimensões** apresentadas.
{% endhint %}

### POST - Teste unitário para homologação

Para validação serão realizadas requisições unitárias do método POST para a URL desenvolvida.&#x20;

{% hint style="warning" %}
Todas as requisições contarão com dados fictícios e por este motivo é imprescindível que a URL não possua bloqueios de SKU.
{% endhint %}

#### Request body:

```
{
    "destinationZip": 22041001,
    "volumes": [
        {
            "sku": "SKU_1",
            "quantity": 2,
            "price": 15.20,
            "height": 0.55,
            "length": 0.63,
            "width": 0.21,
            "weight": 1.00
        },
        {
            "sku": "SKU_2",
            "quantity": 1,
            "price": 53.99,
            "height": 0.3,
            "length": 0.2,
            "width": 0.1,
            "weight": 1.75
        }
    ]
}
```

#### Formato dos dados:

<table data-header-hidden><thead><tr><th width="174.33333333333331" align="center">Campo JSON</th><th width="152" align="center">Tipo de Dado</th><th align="center">Descrição</th></tr></thead><tbody><tr><td align="center"><strong>Campo JSON</strong></td><td align="center"><strong>Tipo de Dado</strong></td><td align="center"><strong>Descrição</strong></td></tr><tr><td align="center"><strong>destinationZip</strong></td><td align="center">inteiro</td><td align="center">CEP de destino que será passado como um inteiro.<br><em>Por exemplo: 5010010 para o CEP “05010-010″</em></td></tr><tr><td align="center"><strong>volumes</strong></td><td align="center">array</td><td align="center">Lista de itens</td></tr><tr><td align="center"><strong>sku</strong></td><td align="center">string</td><td align="center">SKU do Parceiro <strong>*</strong></td></tr><tr><td align="center"><strong>quantity</strong></td><td align="center">integer</td><td align="center">Unidades da venda</td></tr><tr><td align="center"><strong>price</strong></td><td align="center">double</td><td align="center">Preço de venda do produto</td></tr><tr><td align="center"><strong>height</strong></td><td align="center">double</td><td align="center">Altura em metros</td></tr><tr><td align="center"><strong>width</strong></td><td align="center">double</td><td align="center">Largura em metros</td></tr><tr><td align="center"><strong>length</strong></td><td align="center">double</td><td align="center">Comprimento em metros</td></tr><tr><td align="center"><strong>weight</strong></td><td align="center">double</td><td align="center">Peso em quilos (Kg)</td></tr></tbody></table>

{% hint style="info" %}
(\*) Em caso de produto variável, o SKU na requisição será o da **variação**.
{% endhint %}

#### Example request:

```
curl --location --request POST 'https://URL_PARCEIRO' \
--header 'Accept: application/json' \
--header 'Content-Type: application/json' \
--data '{
    "destinationZip": 22041001,
    "volumes": [
        {
            "sku": "SKU_1",
            "quantity": 2,
            "price": 15.20,
            "height": 0.55,
            "length": 0.63,
            "width": 0.21,
            "weight": 1.00
        },
        {
            "sku": "SKU_2",
            "quantity": 1,
            "price": 53.99,
            "height": 0.3,
            "length": 0.2,
            "width": 0.1,
            "weight": 1.75
        }
    ]
}'
```

### Resposta (response) esperada

Ao executar a requisição apresentada acima, a API espera como resposta um JSON válido contendo as seguintes informações:&#x20;

#### Response esperado:

{% hint style="success" %}
200 \[Success] - OK: Deverá ser retornado um body cujo padrão pode ser visualizado a seguir:
{% endhint %}

```
{
  "shippingQuotes": [
    {
      "shippingCost": 13,
      "deliveryTime": 3,
      "shippingEstimateId": "b413bfe83d704c76bd4f81f99abf30c9",
      "shippingMethodId": "8-Correios",
      "shippingMethodName": "Sedex",
      "shippingMethodDisplayName": "Sedex"
    }
  ]
}
```

#### Formato dos dados:

<table data-header-hidden><thead><tr><th width="282.3333333333333" align="center">Campo JSON</th><th width="144" align="center">Tipo de Dado</th><th align="center">Descrição</th></tr></thead><tbody><tr><td align="center"><strong>Campo JSON</strong></td><td align="center"><strong>Tipo de Dado</strong></td><td align="center"><strong>Descrição</strong></td></tr><tr><td align="center"><strong>shippingQuotes</strong></td><td align="center">array</td><td align="center">Lista com resultados do cálculo de frete. Só será considerada a PRIMEIRA posição</td></tr><tr><td align="center"><strong>shippingCost</strong></td><td align="center">double</td><td align="center">Valor do frete</td></tr><tr><td align="center"><strong>deliveryTime</strong></td><td align="center">integer</td><td align="center">Objeto que trará as informações de prazo da entrega</td></tr><tr><td align="center"><strong>shippingEstimateId</strong></td><td align="center">string</td><td align="center">Identificador único gerado durante o cálculo do frete</td></tr><tr><td align="center"><strong>shippingMethodId</strong></td><td align="center">string</td><td align="center">ID da transportadora/tipo de frete selecionado</td></tr><tr><td align="center"><strong>shippingMethodName</strong></td><td align="center">string</td><td align="center">Nome da transportadora/tipo de frete selecionado</td></tr><tr><td align="center"><strong>shippingMethodDisplayName</strong></td><td align="center">string</td><td align="center">Nome do frete selecionado exibido para o cliente</td></tr></tbody></table>

{% hint style="danger" %}
**Todos os campos do response devem ser apresentados conforme descritos.**

Caso esteja informando em caixa alta uma letra que deve ser em caixa baixa, a requisição retornará erro.
{% endhint %}

### Exceções

Caso não haja atendimento para um determinado range de CEP, basta retornar o erro HTTP <mark style="color:red;">**404**</mark> \[not found]. Sugerimos a inclusão de uma mensagem padrão conforme exemplo abaixo:

```
{
  "message": "Região de entrega não atendida".
}
```

{% hint style="warning" %}
**Importante reforçar que caso o tempo de resposta ultrapasse o limite de&#x20;**<mark style="color:red;">**400 ms**</mark>**&#x20;haverá um retorno&#x20;**<mark style="color:red;">**499**</mark>**&#x20;\[timeout] e a&#x20;**<mark style="color:green;">**tabela de contingência**</mark>**&#x20;será acionada.**

Neste caso, é essencial que a loja possua uma tabela de contingência cadastrada e atualizada no portal da Americanas, evitando que perca vendas.
{% endhint %}
