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