Enviando API

Introdução

A API do Enviando foi desenvolvida para facilitar a gestão logística da sua empresa, permitindo o cadastro de produtos, a criação de pedidos e a integração com o WMS Enviando para um controle eficiente da sua operação.

Com suporte tanto para REST quanto para GraphQL, a API oferece flexibilidade na obtenção e manipulação de dados, permitindo consultas otimizadas e adaptadas às necessidades do seu sistema. Seja para um e-commerce, marketplace ou operação de distribuição, a API do Enviando proporciona uma integração robusta para melhorar a eficiência no gerenciamento de pedidos e estoque.

Autenticação

O processo de autenticação deverá ser realizado via token, para obtê-lo, entre em contato com o suporte.

O token deve ser enviado no header da requisição

            
curl --location --request GET 'https://domain.enviando.nordware.io/webapi/order/ORDER_NUMBER/SLUG' --header 'Authorization: Bearer SEU_TOKEN'
            
        

URL da API

Segue o mesmo modelo do Enviando. Exemplo:  
/webapi/

Endpoints

A API possui os seguintes endpoints:

                
// REST
GET /webapi/product/SLUG
GET /webapi/order/ORDER_NUMBER/SLUG
GET /webapi/order/SLUG

POST /webapi/product/SLUG
POST /webapi/product/stock/SLUG
POST /webapi/order/SLUG

PATCH /webapi/product/CODE/SLUG
PATCH /webapi/product/SLUG?product_code=PRODUCT_CODE

// GraphQL
POST /webapi/graphql
                
            

Exemplo de Requisição REST

Produtos

GET /webapi/product/SLUG Parâmetros da requisição
Nome Tipo Local Obrigatório Descrição
slug string Path Sim Slug da conta cadastrada no Enviando
product_code string Query Não Código do produto no Enviando (SKU)
page integer Query Não Número da página para resultados paginados, caso aplicável. Por padrão é 1

Resposta

                
// HTTP 200
[
  {
    "id": "1",
    "code": "PRODUCT_CODE",
    "description": "DESC"
    ...
  }
  ...
]
                
            

Resposta caso nenhum produto seja encontrado

                
// HTTP 404
{
  "detail": "Product not found"
}
                
            

Pedidos

GET /webapi/order/ORDER_NUMBER/SLUG Parâmetros da requisição
Nome Tipo Local Obrigatório Descrição
slug string Path Sim Slug da conta cadastrada no Enviando
order_number integer Path Sim Número do pedido no Enviando

Resposta

                
// HTTP 200
{
  "id": 1,
  "order": "1",
  "orderSource": "Enviando API",
  "orderDate": "2025-01-01",
  "invoiceNumber": "1",
  "invoiceSeries": "1"
  ...
}
                
            

Resposta caso o pedido não seja encontrado

                
// HTTP 404
{
  "detail": "Order not found"
}
                
            

Listar pedidos

GET /webapi/order/SLUG

Retorna uma lista resumida dos pedidos da conta, ordenada do mais recente para o mais antigo. A resposta contém apenas os campos principais (para detalhes completos, utilize o endpoint GET /webapi/order/ORDER_NUMBER/SLUG).

Parâmetros da requisição
Nome Tipo Local Obrigatório Descrição
slug string Path Sim Slug da conta cadastrada no Enviando
page integer Query Não Número da página para resultados paginados (100 por página). Por padrão é 1
order integer Query Não Número do pedido no Enviando
order_source_number string Query Não Número do pedido no canal de origem
invoice_number integer Query Não Número da nota fiscal
tracking_code string Query Não Código de rastreamento
order_status_alt string Query Não Status do pedido: 1=Separação, 2=Conferência, 3=Expedição, 4=Volumes, 5=Despachado, 6=Sincronizado, 7=Cancelado, 8=Falha, 9=Removido
order_priority string Query Não Prioridade do pedido: 1=Urgente, 2=Prioritário, 3=Normal
store integer Query Não Id da loja
shipping_type_id integer Query Não Id do tipo de envio
shipping_name string Query Não Nome do destinatário (busca parcial)
client_document string Query Não CPF ou CNPJ do cliente
postal_code string Query Não CEP do destinatário (apenas dígitos serão considerados)
item_code string Query Não SKU de um item do pedido
item_gtin string Query Não GTIN de um item do pedido
item_serial string Query Não Serial de um item do pedido
batch string Query Não Lote de um item do pedido
order_date_gte string (YYYY-MM-DD) Query Não Data inicial do pedido
order_date_lte string (YYYY-MM-DD) Query Não Data final do pedido
integrated_at_gte string (YYYY-MM-DD) Query Não Data inicial da integração do pedido
integrated_at_lte string (YYYY-MM-DD) Query Não Data final da integração do pedido
invoice_authorized_at_gte string (YYYY-MM-DD) Query Não Data inicial da autorização da nota
invoice_authorized_at_lte string (YYYY-MM-DD) Query Não Data final da autorização da nota
send_to_separate_gte string (YYYY-MM-DD) Query Não Data inicial do envio para separação
send_to_separate_lte string (YYYY-MM-DD) Query Não Data final do envio para separação
dispatch_at_gte string (YYYY-MM-DD) Query Não Data inicial do despacho
dispatch_at_lte string (YYYY-MM-DD) Query Não Data final do despacho
without_label_tracking boolean Query Não Quando true, retorna apenas pedidos sem etiqueta ou rastreio (força status Separação)

Resposta

                
// HTTP 200
[
  {
    "id": 1,
    "order": "1",
    "orderSource": "Enviando API",
    "orderSourceNumber": "1",
    "orderDate": "2025-01-01",
    "status": "ATD",
    "statusName": "Atendido",
    "isCancelled": false,
    "invoiceNumber": "1",
    "trackingCode": "BR1234567890",
    "accountSlug": "minha-conta",
    "storeCode": "1",
    "clientName": "Cliente Exemplo",
    "createdAt": "2025-01-01T10:00:00"
  }
  ...
]
                
            

Resposta caso nenhum pedido seja encontrado

                
// HTTP 404
{
  "detail": "Orders not found"
}
                
            

Para criar um produto

POST /webapi/product/SLUG

Campos code e description são obrigatórios.

Corpo da requisição

                
{
  "code": "BALA5073",
  "gtin": "837349293486",
  "description": "Bala de goma",
  "is_active": true,
  "external_stock": 100,
  "minimal_stock": 100,
  "published_stock": 100,
  "unitary_value": 1.5,
  "url_image": "",
  "weight": 1.68
}
                
            

Resposta

                
// HTTP 200
{
  "message": "Product BALA5073 added with success"
}
                
            

Resposta caso o produto já exista

                
// HTTP 400
{
  "detail": "Product already exists"
}
                
            

Para atualizar um produto

PATCH /webapi/product/CODE/SLUG

Você pode enviar os mesmos campos utilizados na criação. Somente os campos enviados serão atualizados.

Corpo da requisição

                
{
  "description": "Nova descrição",
}
                
            

Resposta

                
// HTTP 200
{
  "message": "Product BALA5073 updated with success"
}
                
            

Resposta caso nenhum produto seja encontrado

                
// HTTP 400
{
  "detail": "Product not found
}
                
            

Para atualizar um produto pelo SKU

PATCH /webapi/product/SLUG?product_code=PRODUCT_CODE

Alternativa ao endpoint anterior, indicada quando o SKU contém caracteres especiais, como barra, que não podem ser enviados no caminho da URL. Você pode enviar os mesmos campos utilizados na criação. Somente os campos enviados serão atualizados.

O SKU deve ser enviado como parâmetro de consulta, com os caracteres especiais codificados. Um SKU como 7908859905336/2 deve ser enviado como product_code=7908859905336%2F2.

Corpo da requisição

                
{
  "description": "Nova descrição",
}
                
            

Resposta

                
// HTTP 200
{
  "message": "Product BALA5073 updated with success"
}
                
            

Resposta caso nenhum produto seja encontrado

                
// HTTP 404
{
  "detail": "Product not found"
}
                
            

Para mapear o estoque de um produto

POST /webapi/stock/product/SLUG

Corpo da requisição

                
{
  "code": "BALA5073",
  "address": "A1-1-MOV-1-1",
  "quantity": 1000
}
                
            

Resposta

                
// HTTP 200
{
  "message": "1000 of BALA5073 added to A1-1-MOV-1-1"
}
                
            

Para criar um pedido

POST /webapi/order/SLUG

Esses são os dados mínimos para criar um pedido.

Corpo da requisição

                
{
  "number": "1",
  "date": "2025-01-01",
  "store": "1",
  "situation": "Atendido",
  "items": [
    {
      "item": {
        "code": "PRODUTO1",
        "gtin": "123456789",
        "description": "Produto 1",
        "quantity": 1
      }
    }
  ],
  "kits": [
    {
      "item": {
        "code": "PRODUTO1",
        "gtin": "123456789",
        "description": "Produto 1",
        "quantity": 1,
        "unitaryValue": 10,
        "weight": 10
      }
    }
  ],
  "client": {
    "name": "João da Silva",
    "cnpj": "",
    "email": "",
    "cellPhone": "",
    "city": "São Paulo",
    "province": "SP",
    "postalCode": "12345678",
    "district": "Centro",
    "number": "123",
    "address": "Rua Brasil",
    "complement": ""
  },
  "transport": {
    "volumes": [
      {
        "volume": {
          "idService": "1"
        }
      }
    ],
    "addressDelivery": {
      "name": "João da Silva",
      "cnpj": "",
      "cellPhone": "",
      "city": "São Paulo",
      "province": "SP",
      "postalCode": "12345678",
      "district": "Centro",
      "number": "123",
      "address": "Rua Brasil",
      "complement": ""
    }
  }
}
                
            

Tabela de situações do pedido

Nome
Em Aberto
Atendido
Cancelado
Em andamento
Venda Agenciada
Em digitação
Verificado

O pedido só segue para a separação com o status: Atendido

Se o pedido possuir nota fiscal, será necessário adicionar o campo invoice ao JSON

                
{
  ...
  "invoice": {
    "series": "1",
    "number": "1",
    "accessKey": "12345678901234567890123456789012345678901234",
    "situation": "5",
    "value": "500",
    "issueDate": "2025-01-01",
    "xml": ""
  },
  ...
}
                
            

Tabela de situações possíveis para a nota fiscal

Código Nome
1 Pendente
2 Cancelada
3 Aguardando recibo
4 Rejeitada
5 Autorizada
6 Emitida DANFE
7 Registrada
8 Aguardando protocolo
9 Denegada
10 Consulta situação
11 Bloqueada

O pedido só segue para a separação com o status da nota: 5 ou 6

O XML da nota fiscal deve ser enviado em base64. Exemplos de XML suportados: Exemplo 1 Exemplo 2

Caso o pedido possua etiqueta de rastreio, será necessário adicionar o campo tracking ao JSON.

                
{
 ...
  "tracking": {
    "trackingCode": "AK123456789BR",
    "label": "JVBERi0xLjQKMSAwIG9iago8PAovVGl0bGUgKP7/AE..."
  }
 ...
}
                
            

Caso o campo "kits" seja entregue, o campo "items" não será utilizado porém, continua sendo obrigatório a passagem dos dados desse campo.

A etiqueta deve ser um arquivo PDF em base64.

Resposta

                
// HTTP 200
{
  "message": "Order 1 added with success"
}
                
            

Resposta em caso de falha

                
// HTTP 400
{
  "detail": "Mensagem detalhada do erro.",
}
                
            

Exemplo de Requisição GraphQL

POST /webapi/graphql

Produtos

                
query Product {
    products(filters: {slug: "SLUG"}) {
        code
        description
    }
}
                
            

Resposta

                
{
  "data": {
    "products": [
      {
        "code": "PRODUCT_CODE",
        "description": "DESC"
      }
    ]
  }
}
                
            

Pedidos

                
query Orders {
    orders(filters: {slug: "SLUG"}) {
        order
        orderDate
        orderSource
    }
}
                
            

Resposta

                
{
  "data": {
    "orders": [
      {
        "order": "1",
        "orderDate": "2025-01-01",
        "orderSource": "Enviando API"
      }
    ]
  }
}
                
            

Estoque

                
query Stocks {
    stocks(filters: {slug: "SLUG"}) {
        id
        quantity
        product {
            code
            description
        }
    }
}
                
            

Resposta

                
{
  "data": {
    "stocks": [
      {
        "id": "1",
        "quantity": 10,
        "product": {
          "code": "PRODUCT_CODE",
          "description": "DESC"
        }
      }
    ]
  }
}
                
            

Para criar um produto

POST /webapi/graphql

Campos slug, code e description são obrigatórios.

                
mutation {
  createProduct(
    productData: {
      slug: "SLUG"
      code: "BALA5073"
      gtin: "837349293486"
      description: "Bala de goma"
      isActive: true
      externalStock: 100
      publishedStock: 100
      unitaryValue: 1.5
      urlImage: ""
      weight: 0.98
    }
  )
}
                
            

Resposta

                
{
  "data": {
    "createProduct": "Product BALA5073 added with success"
  }
}
                
            

Para atualizar um produto

POST /webapi/graphql

Você pode enviar os mesmos campos utilizados na criação. Somente os campos enviados serão atualizados.

Campos slug e id são obrigatórios.

                
mutation {
  updateProduct(
    productData: {
      slug: "SLUG"
      id: 123
      description: "Nova descrição."
    }
  )
}
                
            

Resposta

                
{
  "data": {
    "createProduct": "Product BALA5073 updated with success"
  }
}
                
            

Para mapear o estoque de um produto

POST /webapi/graphql
                
mutation {
  mapStock(
    slug: "SLUG"
    code: "BALA5073"
    address: "A1-1-D-D-D"
    quantity: 100
  )
}
                
            

Resposta

                
{
  "data": {
    "mapStock": "100 of BALA5073 added to A1-1-D-D-D"
  }
}
                
            

Para criar um pedido

POST /webapi/graphql
                
mutation {
  createOrder(
    slug: "SLUG"
    order: {
      number: "1"
      date: "2025-01-01"
      store: "1"
      situation: "Atendido"
      items: [
        {
          item: {
            code: "PRODUTO1"
            gtin: "123456789"
            description: "Produto 1"
            quantity: 1
          }
        }
        {
          item: {
            code: "PRODUTO2"
            gtin: "123456780"
            description: "Produto 2"
            quantity: 1
          }
        }
      ]
      client: {
        name: "João da Silva"
        cnpj: ""
        email: ""
        cellPhone: ""
        city: "São Paulo"
        province: "SP"
        postalCode: "12345678"
        district: "Centro"
        number: "123"
        address: "Rua Brasil"
        complement: ""
      }
      transport: {
        addressDelivery: {
          name: "João da Silva"
          cnpj: ""
          cellPhone: ""
          city: "São Paulo"
          province: "SP"
          postalCode: "12345678"
          district: "Centro"
          number: "123"
          address: "Rua Brasil"
          complement: ""
        }
        volumes: [
          {
            volume: {
              idService: "1"
            }
          }
        ]
      }
    }
  )
}
                
            

Tabela de situações do pedido

Nome
Em Aberto
Atendido
Cancelado
Em andamento
Venda Agenciada
Em digitação
Verificado

O pedido só segue para a separação com o status: Atendido

Se o pedido possuir nota fiscal, será necessário adicionar o campo invoice

                
invoice: {
    number: "1"
    series: "1"
    accessKey: "12345678901234567890123456789012345678901234"
    situation: "5"
    issueDate: "2025-01-01"
    value: "500"
    xml: ""
}
                
            

Tabela de situações possíveis para a nota fiscal

Código Nome
1 Pendente
2 Cancelada
3 Aguardando recibo
4 Rejeitada
5 Autorizada
6 Emitida DANFE
7 Registrada
8 Aguardando protocolo
9 Denegada
10 Consulta situação
11 Bloqueada

O pedido só segue para a separação com o status da nota: 5 ou 6

O XML da nota fiscal deve ser enviado em base64. Exemplos de XML suportados: Exemplo 1 Exemplo 2

Caso o pedido possua etiqueta de rastreio, será necessário adicionar o campo tracking ao JSON.

                
tracking: {
    trackingCode: "AK123456789BR"
    label: "JVBERi0xLjQKMSAwIG9iago8PAovVGl0bGUgKP7/AE..."
}
                
            

A etiqueta deve ser um arquivo PDF em base64.

Resposta

                
{
  "data": {
    "createOrder": "Order 1 added with success"
  }
}
                
            

Sincronizações

Na configuração da conta, é possível adicionar as URLs para a sincronização do status do pedido, bem como a do código de rastreamento.

Status do pedido

O campo a ser preenchido é: URL de sincronização de status do pedido.

Código de rastreamento

O campo a ser preenchido é: URL de sincronização de rastreio do pedido.

Estoque

O campo a ser preenchido é: URL de atualização de estoque.

Se sua API requer autenticação, é possível adicionar o token no campo: Token de acesso a API, que será enviado no header da requisição.

Caso as URLs sejam configuradas, o Enviando enviará uma requisição POST para a URL configurada com o seguinte corpo:

Status do pedido

                
{
  "order": "123",
  "account_slug": "slug",
  "status": "DISPATCHED"
}
                
            

Código de rastreio

                
{
  "order": "123",
  "account_slug": "slug",
  "tracking_code": "AK123456789BR",
  "service_id": "1",
  "invoice_number": "000009", # null se não houver nota fiscal
  "invoice_series": "1", # null se não houver nota fiscal
  "invoice_key": "12345678901234567890123456789012345678901234", # null se não houver nota fiscal
}
                
            

Estoque

                
{
  "product_id": "12345678",
  "product_code": "B001",
  "account_slug": "slug",
  "quantity": "100",
}
                
            

Para criação dos logs de sincronização de status e de rastreio, o status da resposta deve ser 200.