Compras
Base: https://api.nivesistemas.com.br · 35 endpoints
GET /purchases
Seção intitulada “GET /purchases”Listar compras
curl -X GET "https://api.nivesistemas.com.br/purchases" \ -H "Authorization: Bearer sl_live_exemplo_abc123xyz789" \ -H "X-Store-Slug: loja-demo"const res = await fetch("https://api.nivesistemas.com.br/purchases", { method: "GET", headers: { Authorization: "Bearer sl_live_exemplo_abc123xyz789", "X-Store-Slug": "loja-demo", },});const data = await res.json();import requests
res = requests.request( "GET", "https://api.nivesistemas.com.br/purchases", headers={ "Authorization": "Bearer sl_live_exemplo_abc123xyz789", "X-Store-Slug": "loja-demo", },)print(res.json())GET /purchases/:id
Seção intitulada “GET /purchases/:id”Detalhe da compra
Parâmetros de rota: id
curl -X GET "https://api.nivesistemas.com.br/purchases/{id}" \ -H "Authorization: Bearer sl_live_exemplo_abc123xyz789" \ -H "X-Store-Slug: loja-demo"const res = await fetch("https://api.nivesistemas.com.br/purchases/{id}", { method: "GET", headers: { Authorization: "Bearer sl_live_exemplo_abc123xyz789", "X-Store-Slug": "loja-demo", },});const data = await res.json();import requests
res = requests.request( "GET", "https://api.nivesistemas.com.br/purchases/{id}", headers={ "Authorization": "Bearer sl_live_exemplo_abc123xyz789", "X-Store-Slug": "loja-demo", },)print(res.json())POST /purchases
Seção intitulada “POST /purchases”Criar compra em rascunho
Corpo (JSON)
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
supplierId |
uuid | não | Fornecedor |
invoiceNumber |
string | não | Número da NF-e de entrada |
invoiceSeries |
string | não | Série da NF-e de entrada |
accessKey |
string | não | Chave de acesso (44 dígitos) da NF-e de entrada — necessária para gerar NF-e de devolução ao fornecedor |
notes |
string | não | Observações |
freightValue |
number | não | Frete da nota (rateado no custo de entrada) |
insuranceValue |
number | não | Seguro da nota (rateado no custo de entrada) |
otherExpenses |
number | não | Outras despesas da nota (rateadas no custo de entrada) |
ipiValue |
number | não | IPI da nota (entra no custo conforme costIncludesIpi da loja) |
curl -X POST "https://api.nivesistemas.com.br/purchases" \ -H "Authorization: Bearer sl_live_exemplo_abc123xyz789" \ -H "X-Store-Slug: loja-demo" \ -H "Content-Type: application/json" \ -d '{"supplierId":"00000000-0000-0000-0000-000000000000","invoiceNumber":"","invoiceSeries":"","accessKey":"","notes":"","freightValue":0,"insuranceValue":0,"otherExpenses":0,"ipiValue":0}'const res = await fetch("https://api.nivesistemas.com.br/purchases", { method: "POST", headers: { Authorization: "Bearer sl_live_exemplo_abc123xyz789", "X-Store-Slug": "loja-demo", "Content-Type": "application/json", }, body: JSON.stringify({ "supplierId": "00000000-0000-0000-0000-000000000000", "invoiceNumber": "", "invoiceSeries": "", "accessKey": "", "notes": "", "freightValue": 0, "insuranceValue": 0, "otherExpenses": 0, "ipiValue": 0 }),});const data = await res.json();import requests
res = requests.request( "POST", "https://api.nivesistemas.com.br/purchases", headers={ "Authorization": "Bearer sl_live_exemplo_abc123xyz789", "X-Store-Slug": "loja-demo", }, json={ "supplierId": "00000000-0000-0000-0000-000000000000", "invoiceNumber": "", "invoiceSeries": "", "accessKey": "", "notes": "", "freightValue": 0, "insuranceValue": 0, "otherExpenses": 0, "ipiValue": 0 },)print(res.json())POST /purchases/import-xml
Seção intitulada “POST /purchases/import-xml”Importar NF-e de compra via XML
Corpo (JSON)
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
xml |
string | sim | Conteúdo XML da NF-e |
Resposta: Quantidades fracionadas (kg, L) são preservadas, o rastro (nLote/qLote/dFab/dVal) vira os lotes das linhas e vFrete/vSeg/vOutro/vIPI preenchem as despesas da compra. 409 Conflict quando a nota já existe — pela chave de acesso ou, em XML sem chave, por fornecedor + número + série. Traz code PURCHASE_XML_DUPLICATE, purchaseId e purchaseReference da compra existente
curl -X POST "https://api.nivesistemas.com.br/purchases/import-xml" \ -H "Authorization: Bearer sl_live_exemplo_abc123xyz789" \ -H "X-Store-Slug: loja-demo" \ -H "Content-Type: application/json" \ -d '{"xml":""}'const res = await fetch("https://api.nivesistemas.com.br/purchases/import-xml", { method: "POST", headers: { Authorization: "Bearer sl_live_exemplo_abc123xyz789", "X-Store-Slug": "loja-demo", "Content-Type": "application/json", }, body: JSON.stringify({ "xml": "" }),});const data = await res.json();import requests
res = requests.request( "POST", "https://api.nivesistemas.com.br/purchases/import-xml", headers={ "Authorization": "Bearer sl_live_exemplo_abc123xyz789", "X-Store-Slug": "loja-demo", }, json={ "xml": "" },)print(res.json())POST /purchases/import-xml-by-key/lookup
Seção intitulada “POST /purchases/import-xml-by-key/lookup”Consultar NF-e de entrada na SEFAZ pela chave (prévia, sem criar compra)
Corpo (JSON)
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
accessKey |
string | sim | Chave de acesso (44 dígitos, DV válido, modelo 55). Consulta NFeDistribuicaoDFe/consChNFe no Ambiente Nacional com o certificado A1 da empresa logada |
Resposta: status FULL traz preview (fornecedor, itens, impostos e totais); status SUMMARY traz o resumo (resNFe) e a Ciência já registrada, se houver. Resultados ficam em cache por empresa/chave; não há novas tentativas automáticas. Erros trazem code (INBOUND_NFE_*), retryAt e manualXmlFallback: 404 não localizada; 403 sem permissão; 410 cancelada, denegada ou fora do prazo; 429 consumo indevido (656, bloqueio de 1 h) ou limite local; 409 PURCHASE_XML_DUPLICATE se já importada
curl -X POST "https://api.nivesistemas.com.br/purchases/import-xml-by-key/lookup" \ -H "Authorization: Bearer sl_live_exemplo_abc123xyz789" \ -H "X-Store-Slug: loja-demo" \ -H "Content-Type: application/json" \ -d '{"accessKey":""}'const res = await fetch("https://api.nivesistemas.com.br/purchases/import-xml-by-key/lookup", { method: "POST", headers: { Authorization: "Bearer sl_live_exemplo_abc123xyz789", "X-Store-Slug": "loja-demo", "Content-Type": "application/json", }, body: JSON.stringify({ "accessKey": "" }),});const data = await res.json();import requests
res = requests.request( "POST", "https://api.nivesistemas.com.br/purchases/import-xml-by-key/lookup", headers={ "Authorization": "Bearer sl_live_exemplo_abc123xyz789", "X-Store-Slug": "loja-demo", }, json={ "accessKey": "" },)print(res.json())POST /purchases/import-xml-by-key/ciencia
Seção intitulada “POST /purchases/import-xml-by-key/ciencia”Registrar Ciência da Operação (evento 210210) para NF-e que só retornou resumo
Corpo (JSON)
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
accessKey |
string | sim | Chave de acesso consultada antes |
confirm |
boolean | sim | Deve ser true — confirmação expressa do usuário. O evento nunca é enviado automaticamente |
Resposta: A Ciência não substitui a manifestação conclusiva (Confirmação, Desconhecimento ou Operação não Realizada). Idempotente: se já registrada, não reenvia. nextQueryAllowedAt indica quando consultar de novo para obter o XML completo
curl -X POST "https://api.nivesistemas.com.br/purchases/import-xml-by-key/ciencia" \ -H "Authorization: Bearer sl_live_exemplo_abc123xyz789" \ -H "X-Store-Slug: loja-demo" \ -H "Content-Type: application/json" \ -d '{"accessKey":"","confirm":true}'const res = await fetch("https://api.nivesistemas.com.br/purchases/import-xml-by-key/ciencia", { method: "POST", headers: { Authorization: "Bearer sl_live_exemplo_abc123xyz789", "X-Store-Slug": "loja-demo", "Content-Type": "application/json", }, body: JSON.stringify({ "accessKey": "", "confirm": true }),});const data = await res.json();import requests
res = requests.request( "POST", "https://api.nivesistemas.com.br/purchases/import-xml-by-key/ciencia", headers={ "Authorization": "Bearer sl_live_exemplo_abc123xyz789", "X-Store-Slug": "loja-demo", }, json={ "accessKey": "", "confirm": True },)print(res.json())GET /purchases/inbound-nfe
Seção intitulada “GET /purchases/inbound-nfe”Listar NF-e de entrada consultadas pela chave, com situação da manifestação e prazo
Query params
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
page |
number | não | Página (padrão 1) |
pageSize |
number | não | Itens por página (1 a 50, padrão 20) |
manifest |
string | não | ALL | PENDING (sem conclusiva) | CIENCIA (ciência sem conclusiva) | CONFIRMATION | UNKNOWN | NOT_PERFORMED |
deadline |
string | não | ALL | VENCENDO (30 dias ou menos) | VENCIDO |
purchase |
string | não | ALL | TO_IMPORT (XML completo guardado e ainda sem compra) | IMPORTED (já virou compra) |
search |
string | não | Emitente (resumo) ou trecho da chave de acesso |
Resposta: Só lê o banco (sem chamar a SEFAZ); exige purchases.manage. Cada item traz manifest (null enquanto não houver conclusiva), ciencia, deadline { level NO_PRAZO | VENCENDO | VENCIDO | SEM_DATA, deadline, daysRemaining, windowDays } e canCiencia/canManifest/canImport (canImport = XML completo guardado e sem compra: dá para importar direto). O prazo parte da emissão da NF-e (padrão 180 dias, configurável em FISCAL_MANIFESTACAO_PRAZO_DIAS) e é só um aviso — confirmar o prazo legal da UF com o contador. counts resume pendentes, vencendo, vencidas e prontas para importar (toImport)
curl -X GET "https://api.nivesistemas.com.br/purchases/inbound-nfe" \ -H "Authorization: Bearer sl_live_exemplo_abc123xyz789" \ -H "X-Store-Slug: loja-demo"const res = await fetch("https://api.nivesistemas.com.br/purchases/inbound-nfe", { method: "GET", headers: { Authorization: "Bearer sl_live_exemplo_abc123xyz789", "X-Store-Slug": "loja-demo", },});const data = await res.json();import requests
res = requests.request( "GET", "https://api.nivesistemas.com.br/purchases/inbound-nfe", headers={ "Authorization": "Bearer sl_live_exemplo_abc123xyz789", "X-Store-Slug": "loja-demo", },)print(res.json())GET /purchases/inbound-nfe/sync-status
Seção intitulada “GET /purchases/inbound-nfe/sync-status”Estado da busca em lote na SEFAZ: último NSU, espera liberada, bloqueio e busca em andamento
Resposta: Só lê o banco e valida o certificado (não chama a SEFAZ); exige purchases.manage. ready=false traz reason (CNPJ/certificado A1 ausente ou vencido). nextSyncAllowedAt é a espera de 1 h que a SEFAZ exige depois de ‘sem documentos novos’; blockedUntil aparece após consumo indevido (656); hasMore indica notas ainda não trazidas (use a busca de novo para continuar)
curl -X GET "https://api.nivesistemas.com.br/purchases/inbound-nfe/sync-status" \ -H "Authorization: Bearer sl_live_exemplo_abc123xyz789" \ -H "X-Store-Slug: loja-demo"const res = await fetch("https://api.nivesistemas.com.br/purchases/inbound-nfe/sync-status", { method: "GET", headers: { Authorization: "Bearer sl_live_exemplo_abc123xyz789", "X-Store-Slug": "loja-demo", },});const data = await res.json();import requests
res = requests.request( "GET", "https://api.nivesistemas.com.br/purchases/inbound-nfe/sync-status", headers={ "Authorization": "Bearer sl_live_exemplo_abc123xyz789", "X-Store-Slug": "loja-demo", },)print(res.json())POST /purchases/inbound-nfe/sync
Seção intitulada “POST /purchases/inbound-nfe/sync”Buscar na SEFAZ todas as NF-e emitidas contra o CNPJ da empresa (NFeDistribuicaoDFe / distNSU)
Resposta: Só por ação do usuário, com o A1 da empresa no Ambiente Nacional; exige purchases.manage. Continua do último NSU guardado (cursor por CNPJ/ambiente) e lê até 10 páginas ou 40 s por chamada: outcome UP_TO_DATE (tudo em dia; nova busca só após 1 h), HAS_MORE (chame de novo para continuar) ou COOLDOWN (dentro da espera, nada foi consultado). Resumos (resNFe) e XMLs (procNFe) entram na lista de NF-e de entrada; canceladas/denegadas e notas emitidas pela própria empresa não aparecem; nada vira compra sem importar. Falha no meio devolve o que já foi salvo com partialError. 429 em consumo indevido (656), que bloqueia o CNPJ por 1 h; 409 se já houver busca em andamento. Auditado em FiscalAuditLog (INBOUND_NFE_DISTDFE_SYNC)
curl -X POST "https://api.nivesistemas.com.br/purchases/inbound-nfe/sync" \ -H "Authorization: Bearer sl_live_exemplo_abc123xyz789" \ -H "X-Store-Slug: loja-demo"const res = await fetch("https://api.nivesistemas.com.br/purchases/inbound-nfe/sync", { method: "POST", headers: { Authorization: "Bearer sl_live_exemplo_abc123xyz789", "X-Store-Slug": "loja-demo", },});const data = await res.json();import requests
res = requests.request( "POST", "https://api.nivesistemas.com.br/purchases/inbound-nfe/sync", headers={ "Authorization": "Bearer sl_live_exemplo_abc123xyz789", "X-Store-Slug": "loja-demo", },)print(res.json())POST /purchases/inbound-nfe/manifest
Seção intitulada “POST /purchases/inbound-nfe/manifest”Manifestação conclusiva do destinatário: Confirmação (210200), Desconhecimento (210220) ou Operação não Realizada (210240)
Corpo (JSON)
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
accessKey |
string | sim | Chave de acesso da NF-e (44 dígitos) |
kind |
string | sim | CONFIRMATION | UNKNOWN | NOT_PERFORMED |
justification |
string | não | Obrigatória em NOT_PERFORMED: 15 a 255 caracteres (alfabeto latino, sem emojis) |
confirm |
boolean | sim | Deve ser true — confirmação expressa. O evento é fiscal e irreversível, e nunca é enviado automaticamente |
Resposta: Não exige Ciência prévia, mas só existe UMA conclusiva por chave: se já registrada, devolve o estado atual (alreadyRegistered: true; differentFromRequested: true quando o tipo pedido era outro) sem reenviar à SEFAZ. Eventos no Ambiente Nacional (cOrgao 91) com o A1 da empresa; 429 em consumo indevido (656), 400 em rejeição da SEFAZ. Auditado em FiscalAuditLog (INBOUND_NFE_MANIFEST)
curl -X POST "https://api.nivesistemas.com.br/purchases/inbound-nfe/manifest" \ -H "Authorization: Bearer sl_live_exemplo_abc123xyz789" \ -H "X-Store-Slug: loja-demo" \ -H "Content-Type: application/json" \ -d '{"accessKey":"","kind":"","justification":"","confirm":true}'const res = await fetch("https://api.nivesistemas.com.br/purchases/inbound-nfe/manifest", { method: "POST", headers: { Authorization: "Bearer sl_live_exemplo_abc123xyz789", "X-Store-Slug": "loja-demo", "Content-Type": "application/json", }, body: JSON.stringify({ "accessKey": "", "kind": "", "justification": "", "confirm": true }),});const data = await res.json();import requests
res = requests.request( "POST", "https://api.nivesistemas.com.br/purchases/inbound-nfe/manifest", headers={ "Authorization": "Bearer sl_live_exemplo_abc123xyz789", "X-Store-Slug": "loja-demo", }, json={ "accessKey": "", "kind": "", "justification": "", "confirm": True },)print(res.json())POST /purchases/import-xml-by-key
Seção intitulada “POST /purchases/import-xml-by-key”Importar como compra a NF-e de entrada obtida pela chave de acesso
Corpo (JSON)
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
accessKey |
string | sim | Chave de acesso (44 dígitos) da NF-e |
fromPreview |
boolean | não | true: importa somente o XML já conferido em /lookup (fluxo da tela). false/omitido: consulta respeitando cache e limites e importa se vier o XML completo |
Resposta: O XML segue o mesmo parser da importação por arquivo e a compra nasce como rascunho. 409 INBOUND_NFE_PREVIEW_REQUIRED sem prévia (fromPreview=true); 422 INBOUND_NFE_SUMMARY_ONLY se só houver resumo; 409 PURCHASE_XML_DUPLICATE se a nota já foi importada
curl -X POST "https://api.nivesistemas.com.br/purchases/import-xml-by-key" \ -H "Authorization: Bearer sl_live_exemplo_abc123xyz789" \ -H "X-Store-Slug: loja-demo" \ -H "Content-Type: application/json" \ -d '{"accessKey":"","fromPreview":true}'const res = await fetch("https://api.nivesistemas.com.br/purchases/import-xml-by-key", { method: "POST", headers: { Authorization: "Bearer sl_live_exemplo_abc123xyz789", "X-Store-Slug": "loja-demo", "Content-Type": "application/json", }, body: JSON.stringify({ "accessKey": "", "fromPreview": true }),});const data = await res.json();import requests
res = requests.request( "POST", "https://api.nivesistemas.com.br/purchases/import-xml-by-key", headers={ "Authorization": "Bearer sl_live_exemplo_abc123xyz789", "X-Store-Slug": "loja-demo", }, json={ "accessKey": "", "fromPreview": True },)print(res.json())PATCH /purchases/:id
Seção intitulada “PATCH /purchases/:id”Atualizar compra
Parâmetros de rota: id
Corpo (JSON)
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
supplierId |
uuid | não | Fornecedor |
freightValue |
number | não | Frete da nota |
insuranceValue |
number | não | Seguro da nota |
otherExpenses |
number | não | Outras despesas da nota |
ipiValue |
number | não | IPI da nota |
Resposta: As despesas são rateadas entre os itens pelo valor de cada um e compõem o custo de entrada ao receber (cada item traz ancillaryCostPerUnit e landedUnitCost). O total da compra não muda
curl -X PATCH "https://api.nivesistemas.com.br/purchases/{id}" \ -H "Authorization: Bearer sl_live_exemplo_abc123xyz789" \ -H "X-Store-Slug: loja-demo" \ -H "Content-Type: application/json" \ -d '{"supplierId":"00000000-0000-0000-0000-000000000000","freightValue":0,"insuranceValue":0,"otherExpenses":0,"ipiValue":0}'const res = await fetch("https://api.nivesistemas.com.br/purchases/{id}", { method: "PATCH", headers: { Authorization: "Bearer sl_live_exemplo_abc123xyz789", "X-Store-Slug": "loja-demo", "Content-Type": "application/json", }, body: JSON.stringify({ "supplierId": "00000000-0000-0000-0000-000000000000", "freightValue": 0, "insuranceValue": 0, "otherExpenses": 0, "ipiValue": 0 }),});const data = await res.json();import requests
res = requests.request( "PATCH", "https://api.nivesistemas.com.br/purchases/{id}", headers={ "Authorization": "Bearer sl_live_exemplo_abc123xyz789", "X-Store-Slug": "loja-demo", }, json={ "supplierId": "00000000-0000-0000-0000-000000000000", "freightValue": 0, "insuranceValue": 0, "otherExpenses": 0, "ipiValue": 0 },)print(res.json())PATCH /purchases/:id/invoice-data
Seção intitulada “PATCH /purchases/:id/invoice-data”Atualizar dados da nota (fornecedor, número, série e chave)
Parâmetros de rota: id
Corpo (JSON)
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
supplierId |
uuid | não | Fornecedor |
invoiceNumber |
string | não | Número da NF-e de entrada |
invoiceSeries |
string | não | Série da NF-e de entrada |
accessKey |
string | não | Chave de acesso (44 dígitos) |
Resposta: Continua disponível depois do recebimento (não mexe em estoque). Bloqueado em compra cancelada e na chave de compra importada por XML
curl -X PATCH "https://api.nivesistemas.com.br/purchases/{id}/invoice-data" \ -H "Authorization: Bearer sl_live_exemplo_abc123xyz789" \ -H "X-Store-Slug: loja-demo" \ -H "Content-Type: application/json" \ -d '{"supplierId":"00000000-0000-0000-0000-000000000000","invoiceNumber":"","invoiceSeries":"","accessKey":""}'const res = await fetch("https://api.nivesistemas.com.br/purchases/{id}/invoice-data", { method: "PATCH", headers: { Authorization: "Bearer sl_live_exemplo_abc123xyz789", "X-Store-Slug": "loja-demo", "Content-Type": "application/json", }, body: JSON.stringify({ "supplierId": "00000000-0000-0000-0000-000000000000", "invoiceNumber": "", "invoiceSeries": "", "accessKey": "" }),});const data = await res.json();import requests
res = requests.request( "PATCH", "https://api.nivesistemas.com.br/purchases/{id}/invoice-data", headers={ "Authorization": "Bearer sl_live_exemplo_abc123xyz789", "X-Store-Slug": "loja-demo", }, json={ "supplierId": "00000000-0000-0000-0000-000000000000", "invoiceNumber": "", "invoiceSeries": "", "accessKey": "" },)print(res.json())DELETE /purchases/:id
Seção intitulada “DELETE /purchases/:id”Excluir compra em rascunho
Parâmetros de rota: id
Resposta: 204 No Content
curl -X DELETE "https://api.nivesistemas.com.br/purchases/{id}" \ -H "Authorization: Bearer sl_live_exemplo_abc123xyz789" \ -H "X-Store-Slug: loja-demo"const res = await fetch("https://api.nivesistemas.com.br/purchases/{id}", { method: "DELETE", headers: { Authorization: "Bearer sl_live_exemplo_abc123xyz789", "X-Store-Slug": "loja-demo", },});const data = await res.json();import requests
res = requests.request( "DELETE", "https://api.nivesistemas.com.br/purchases/{id}", headers={ "Authorization": "Bearer sl_live_exemplo_abc123xyz789", "X-Store-Slug": "loja-demo", },)print(res.json())POST /purchases/:id/lines
Seção intitulada “POST /purchases/:id/lines”Adicionar linha manual
Parâmetros de rota: id
Corpo (JSON)
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
description |
string | sim | Descrição |
quantity |
number | sim | Quantidade |
unitCost |
number | sim | Custo unitário |
curl -X POST "https://api.nivesistemas.com.br/purchases/{id}/lines" \ -H "Authorization: Bearer sl_live_exemplo_abc123xyz789" \ -H "X-Store-Slug: loja-demo" \ -H "Content-Type: application/json" \ -d '{"description":"","quantity":0,"unitCost":0}'const res = await fetch("https://api.nivesistemas.com.br/purchases/{id}/lines", { method: "POST", headers: { Authorization: "Bearer sl_live_exemplo_abc123xyz789", "X-Store-Slug": "loja-demo", "Content-Type": "application/json", }, body: JSON.stringify({ "description": "", "quantity": 0, "unitCost": 0 }),});const data = await res.json();import requests
res = requests.request( "POST", "https://api.nivesistemas.com.br/purchases/{id}/lines", headers={ "Authorization": "Bearer sl_live_exemplo_abc123xyz789", "X-Store-Slug": "loja-demo", }, json={ "description": "", "quantity": 0, "unitCost": 0 },)print(res.json())PUT /purchases/:id/lines/:lineId
Seção intitulada “PUT /purchases/:id/lines/:lineId”Atualizar linha
Parâmetros de rota: id, lineId
Corpo (JSON)
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
quantity |
number | não | Quantidade (até 4 casas em kg/L/m; inteira em UN) |
unitCost |
number | não | Custo unitário |
lots |
object[] | não | Lotes da linha: [{ lotCode, quantity, expiresAt (AAAA-MM-DD), manufacturedAt }]. Substitui os atuais; [] remove. A soma não pode passar da quantidade; o restante entra como saldo sem lote |
curl -X PUT "https://api.nivesistemas.com.br/purchases/{id}/lines/{lineId}" \ -H "Authorization: Bearer sl_live_exemplo_abc123xyz789" \ -H "X-Store-Slug: loja-demo" \ -H "Content-Type: application/json" \ -d '{"quantity":0,"unitCost":0,"lots":null}'const res = await fetch("https://api.nivesistemas.com.br/purchases/{id}/lines/{lineId}", { method: "PUT", headers: { Authorization: "Bearer sl_live_exemplo_abc123xyz789", "X-Store-Slug": "loja-demo", "Content-Type": "application/json", }, body: JSON.stringify({ "quantity": 0, "unitCost": 0, "lots": null }),});const data = await res.json();import requests
res = requests.request( "PUT", "https://api.nivesistemas.com.br/purchases/{id}/lines/{lineId}", headers={ "Authorization": "Bearer sl_live_exemplo_abc123xyz789", "X-Store-Slug": "loja-demo", }, json={ "quantity": 0, "unitCost": 0, "lots": None },)print(res.json())POST /purchases/:id/lines/:lineId/link
Seção intitulada “POST /purchases/:id/lines/:lineId/link”Vincular linha a variante do catálogo
Parâmetros de rota: id, lineId
Corpo (JSON)
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
variantId |
uuid | sim | ID da variante |
pack |
object | não | { factor, label }: quantas unidades de estoque vale cada unidade da nota (1 FARDO = 12). Omitido = usa o código de compra do produto ou a conversão do produto |
remember |
boolean | não | Lembra o código do fornecedor/GTIN desta linha para vincular sozinho nas próximas notas |
curl -X POST "https://api.nivesistemas.com.br/purchases/{id}/lines/{lineId}/link" \ -H "Authorization: Bearer sl_live_exemplo_abc123xyz789" \ -H "X-Store-Slug: loja-demo" \ -H "Content-Type: application/json" \ -d '{"variantId":"00000000-0000-0000-0000-000000000000","pack":null,"remember":true}'const res = await fetch("https://api.nivesistemas.com.br/purchases/{id}/lines/{lineId}/link", { method: "POST", headers: { Authorization: "Bearer sl_live_exemplo_abc123xyz789", "X-Store-Slug": "loja-demo", "Content-Type": "application/json", }, body: JSON.stringify({ "variantId": "00000000-0000-0000-0000-000000000000", "pack": null, "remember": true }),});const data = await res.json();import requests
res = requests.request( "POST", "https://api.nivesistemas.com.br/purchases/{id}/lines/{lineId}/link", headers={ "Authorization": "Bearer sl_live_exemplo_abc123xyz789", "X-Store-Slug": "loja-demo", }, json={ "variantId": "00000000-0000-0000-0000-000000000000", "pack": None, "remember": True },)print(res.json())DELETE /purchases/:id/lines/:lineId
Seção intitulada “DELETE /purchases/:id/lines/:lineId”Remover linha
Parâmetros de rota: id, lineId
Resposta: 204 No Content
curl -X DELETE "https://api.nivesistemas.com.br/purchases/{id}/lines/{lineId}" \ -H "Authorization: Bearer sl_live_exemplo_abc123xyz789" \ -H "X-Store-Slug: loja-demo"const res = await fetch("https://api.nivesistemas.com.br/purchases/{id}/lines/{lineId}", { method: "DELETE", headers: { Authorization: "Bearer sl_live_exemplo_abc123xyz789", "X-Store-Slug": "loja-demo", },});const data = await res.json();import requests
res = requests.request( "DELETE", "https://api.nivesistemas.com.br/purchases/{id}/lines/{lineId}", headers={ "Authorization": "Bearer sl_live_exemplo_abc123xyz789", "X-Store-Slug": "loja-demo", },)print(res.json())POST /purchases/:id/receive
Seção intitulada “POST /purchases/:id/receive”Receber itens vinculados no estoque (parcial ou total)
Parâmetros de rota: id
Corpo (JSON)
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
payable |
object | não | { create, paymentMethodId, installments[{dueDate, amount}], paidNow{financialAccountId, methodInstallmentCount} }. Omitido = conta automática para 30 dias. |
Resposta: Produtos com controle de lote/validade criam StockLot com os lotes da linha. O custo segue o método da loja (último preço ou média ponderada) já com frete/seguro/outras despesas rateados
curl -X POST "https://api.nivesistemas.com.br/purchases/{id}/receive" \ -H "Authorization: Bearer sl_live_exemplo_abc123xyz789" \ -H "X-Store-Slug: loja-demo" \ -H "Content-Type: application/json" \ -d '{"payable":null}'const res = await fetch("https://api.nivesistemas.com.br/purchases/{id}/receive", { method: "POST", headers: { Authorization: "Bearer sl_live_exemplo_abc123xyz789", "X-Store-Slug": "loja-demo", "Content-Type": "application/json", }, body: JSON.stringify({ "payable": null }),});const data = await res.json();import requests
res = requests.request( "POST", "https://api.nivesistemas.com.br/purchases/{id}/receive", headers={ "Authorization": "Bearer sl_live_exemplo_abc123xyz789", "X-Store-Slug": "loja-demo", }, json={ "payable": None },)print(res.json())GET /purchases/:id/payable-draft
Seção intitulada “GET /purchases/:id/payable-draft”Sugestão de conta a pagar do recebimento (duplicatas da NF-e)
Parâmetros de rota: id
curl -X GET "https://api.nivesistemas.com.br/purchases/{id}/payable-draft" \ -H "Authorization: Bearer sl_live_exemplo_abc123xyz789" \ -H "X-Store-Slug: loja-demo"const res = await fetch("https://api.nivesistemas.com.br/purchases/{id}/payable-draft", { method: "GET", headers: { Authorization: "Bearer sl_live_exemplo_abc123xyz789", "X-Store-Slug": "loja-demo", },});const data = await res.json();import requests
res = requests.request( "GET", "https://api.nivesistemas.com.br/purchases/{id}/payable-draft", headers={ "Authorization": "Bearer sl_live_exemplo_abc123xyz789", "X-Store-Slug": "loja-demo", },)print(res.json())POST /purchases/:id/cancel
Seção intitulada “POST /purchases/:id/cancel”Cancelar compra
Parâmetros de rota: id
curl -X POST "https://api.nivesistemas.com.br/purchases/{id}/cancel" \ -H "Authorization: Bearer sl_live_exemplo_abc123xyz789" \ -H "X-Store-Slug: loja-demo"const res = await fetch("https://api.nivesistemas.com.br/purchases/{id}/cancel", { method: "POST", headers: { Authorization: "Bearer sl_live_exemplo_abc123xyz789", "X-Store-Slug": "loja-demo", },});const data = await res.json();import requests
res = requests.request( "POST", "https://api.nivesistemas.com.br/purchases/{id}/cancel", headers={ "Authorization": "Bearer sl_live_exemplo_abc123xyz789", "X-Store-Slug": "loja-demo", },)print(res.json())POST /purchases/:id/lines/:lineId/unlink
Seção intitulada “POST /purchases/:id/lines/:lineId/unlink”Desvincular linha do catálogo
Parâmetros de rota: id, lineId
curl -X POST "https://api.nivesistemas.com.br/purchases/{id}/lines/{lineId}/unlink" \ -H "Authorization: Bearer sl_live_exemplo_abc123xyz789" \ -H "X-Store-Slug: loja-demo"const res = await fetch("https://api.nivesistemas.com.br/purchases/{id}/lines/{lineId}/unlink", { method: "POST", headers: { Authorization: "Bearer sl_live_exemplo_abc123xyz789", "X-Store-Slug": "loja-demo", },});const data = await res.json();import requests
res = requests.request( "POST", "https://api.nivesistemas.com.br/purchases/{id}/lines/{lineId}/unlink", headers={ "Authorization": "Bearer sl_live_exemplo_abc123xyz789", "X-Store-Slug": "loja-demo", },)print(res.json())POST /purchases/:id/lines/:lineId/correct-link
Seção intitulada “POST /purchases/:id/lines/:lineId/correct-link”Corrigir vínculo da linha
Parâmetros de rota: id, lineId
curl -X POST "https://api.nivesistemas.com.br/purchases/{id}/lines/{lineId}/correct-link" \ -H "Authorization: Bearer sl_live_exemplo_abc123xyz789" \ -H "X-Store-Slug: loja-demo"const res = await fetch("https://api.nivesistemas.com.br/purchases/{id}/lines/{lineId}/correct-link", { method: "POST", headers: { Authorization: "Bearer sl_live_exemplo_abc123xyz789", "X-Store-Slug": "loja-demo", },});const data = await res.json();import requests
res = requests.request( "POST", "https://api.nivesistemas.com.br/purchases/{id}/lines/{lineId}/correct-link", headers={ "Authorization": "Bearer sl_live_exemplo_abc123xyz789", "X-Store-Slug": "loja-demo", },)print(res.json())POST /purchases/:id/lines/:lineId/distribute
Seção intitulada “POST /purchases/:id/lines/:lineId/distribute”Distribuir quantidade da linha
Parâmetros de rota: id, lineId
curl -X POST "https://api.nivesistemas.com.br/purchases/{id}/lines/{lineId}/distribute" \ -H "Authorization: Bearer sl_live_exemplo_abc123xyz789" \ -H "X-Store-Slug: loja-demo"const res = await fetch("https://api.nivesistemas.com.br/purchases/{id}/lines/{lineId}/distribute", { method: "POST", headers: { Authorization: "Bearer sl_live_exemplo_abc123xyz789", "X-Store-Slug": "loja-demo", },});const data = await res.json();import requests
res = requests.request( "POST", "https://api.nivesistemas.com.br/purchases/{id}/lines/{lineId}/distribute", headers={ "Authorization": "Bearer sl_live_exemplo_abc123xyz789", "X-Store-Slug": "loja-demo", },)print(res.json())POST /purchases/:id/compare-xml
Seção intitulada “POST /purchases/:id/compare-xml”Comparar compra com XML
Parâmetros de rota: id
curl -X POST "https://api.nivesistemas.com.br/purchases/{id}/compare-xml" \ -H "Authorization: Bearer sl_live_exemplo_abc123xyz789" \ -H "X-Store-Slug: loja-demo"const res = await fetch("https://api.nivesistemas.com.br/purchases/{id}/compare-xml", { method: "POST", headers: { Authorization: "Bearer sl_live_exemplo_abc123xyz789", "X-Store-Slug": "loja-demo", },});const data = await res.json();import requests
res = requests.request( "POST", "https://api.nivesistemas.com.br/purchases/{id}/compare-xml", headers={ "Authorization": "Bearer sl_live_exemplo_abc123xyz789", "X-Store-Slug": "loja-demo", },)print(res.json())POST /purchases/:id/lines/link-batch
Seção intitulada “POST /purchases/:id/lines/link-batch”Vincular várias linhas do XML ao catálogo
Parâmetros de rota: id
Corpo (JSON)
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
links |
array | sim | [{ lineId, variantId, pack?: { factor, label }, remember? }] |
curl -X POST "https://api.nivesistemas.com.br/purchases/{id}/lines/link-batch" \ -H "Authorization: Bearer sl_live_exemplo_abc123xyz789" \ -H "X-Store-Slug: loja-demo" \ -H "Content-Type: application/json" \ -d '{"links":[]}'const res = await fetch("https://api.nivesistemas.com.br/purchases/{id}/lines/link-batch", { method: "POST", headers: { Authorization: "Bearer sl_live_exemplo_abc123xyz789", "X-Store-Slug": "loja-demo", "Content-Type": "application/json", }, body: JSON.stringify({ "links": [] }),});const data = await res.json();import requests
res = requests.request( "POST", "https://api.nivesistemas.com.br/purchases/{id}/lines/link-batch", headers={ "Authorization": "Bearer sl_live_exemplo_abc123xyz789", "X-Store-Slug": "loja-demo", }, json={ "links": [] },)print(res.json())POST /purchases/from-suggestion
Seção intitulada “POST /purchases/from-suggestion”Criar compra a partir da sugestão de compra
Corpo (JSON)
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
items |
array | sim | [{ variantId, quantity, unitCost }] (até 500) |
supplierId |
uuid | não | Fornecedor |
notes |
string | não | Observações |
Resposta: 201 Created
curl -X POST "https://api.nivesistemas.com.br/purchases/from-suggestion" \ -H "Authorization: Bearer sl_live_exemplo_abc123xyz789" \ -H "X-Store-Slug: loja-demo" \ -H "Content-Type: application/json" \ -d '{"items":[],"supplierId":"00000000-0000-0000-0000-000000000000","notes":""}'const res = await fetch("https://api.nivesistemas.com.br/purchases/from-suggestion", { method: "POST", headers: { Authorization: "Bearer sl_live_exemplo_abc123xyz789", "X-Store-Slug": "loja-demo", "Content-Type": "application/json", }, body: JSON.stringify({ "items": [], "supplierId": "00000000-0000-0000-0000-000000000000", "notes": "" }),});const data = await res.json();import requests
res = requests.request( "POST", "https://api.nivesistemas.com.br/purchases/from-suggestion", headers={ "Authorization": "Bearer sl_live_exemplo_abc123xyz789", "X-Store-Slug": "loja-demo", }, json={ "items": [], "supplierId": "00000000-0000-0000-0000-000000000000", "notes": "" },)print(res.json())GET /purchases/item-search
Seção intitulada “GET /purchases/item-search”Achar as compras que trouxeram um produto (código de barras, código ou descrição)
Query params
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
q |
string | sim | Texto com 2 ou mais caracteres (até 120). Só dígitos com 8+ caracteres é tratado como código de barras e compara o código inteiro |
allLocations |
boolean | não | Busca em todas as filiais (padrão: só a filial do usuário) |
Resposta: Lista de { purchaseId, items: [{ description, gtin, supplierCode, quantity }] }. Menos de 2 caracteres retorna lista vazia; até 2000 itens.
curl -X GET "https://api.nivesistemas.com.br/purchases/item-search" \ -H "Authorization: Bearer sl_live_exemplo_abc123xyz789" \ -H "X-Store-Slug: loja-demo"const res = await fetch("https://api.nivesistemas.com.br/purchases/item-search", { method: "GET", headers: { Authorization: "Bearer sl_live_exemplo_abc123xyz789", "X-Store-Slug": "loja-demo", },});const data = await res.json();import requests
res = requests.request( "GET", "https://api.nivesistemas.com.br/purchases/item-search", headers={ "Authorization": "Bearer sl_live_exemplo_abc123xyz789", "X-Store-Slug": "loja-demo", },)print(res.json())GET /purchases/ncm-divergences
Seção intitulada “GET /purchases/ncm-divergences”Produtos cujo NCM do cadastro difere do NCM da nota de entrada mais recente
Query params
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
allLocations |
boolean | não | Considera todas as filiais (padrão: só a filial do usuário) |
Resposta: { items } — cada item: productId, productDescription, currentNcm, xmlNcm, official (NCM existe na tabela oficial), conflictingNcms (preenchido se a nota trouxe NCMs diferentes para o mesmo produto) e a compra de origem. Compras canceladas não entram.
curl -X GET "https://api.nivesistemas.com.br/purchases/ncm-divergences" \ -H "Authorization: Bearer sl_live_exemplo_abc123xyz789" \ -H "X-Store-Slug: loja-demo"const res = await fetch("https://api.nivesistemas.com.br/purchases/ncm-divergences", { method: "GET", headers: { Authorization: "Bearer sl_live_exemplo_abc123xyz789", "X-Store-Slug": "loja-demo", },});const data = await res.json();import requests
res = requests.request( "GET", "https://api.nivesistemas.com.br/purchases/ncm-divergences", headers={ "Authorization": "Bearer sl_live_exemplo_abc123xyz789", "X-Store-Slug": "loja-demo", },)print(res.json())POST /purchases/ncm-divergences/apply
Seção intitulada “POST /purchases/ncm-divergences/apply”Copiar o NCM da nota de entrada para o cadastro dos produtos escolhidos (exige gerenciar produtos)
Corpo (JSON)
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
productIds |
uuid[] | sim | Produtos a corrigir (1 a 2000) |
Resposta: { updated, skipped }. Só aplica NCM oficial e sem conflito; os demais contam em skipped.
curl -X POST "https://api.nivesistemas.com.br/purchases/ncm-divergences/apply" \ -H "Authorization: Bearer sl_live_exemplo_abc123xyz789" \ -H "X-Store-Slug: loja-demo" \ -H "Content-Type: application/json" \ -d '{"productIds":null}'const res = await fetch("https://api.nivesistemas.com.br/purchases/ncm-divergences/apply", { method: "POST", headers: { Authorization: "Bearer sl_live_exemplo_abc123xyz789", "X-Store-Slug": "loja-demo", "Content-Type": "application/json", }, body: JSON.stringify({ "productIds": null }),});const data = await res.json();import requests
res = requests.request( "POST", "https://api.nivesistemas.com.br/purchases/ncm-divergences/apply", headers={ "Authorization": "Bearer sl_live_exemplo_abc123xyz789", "X-Store-Slug": "loja-demo", }, json={ "productIds": None },)print(res.json())POST /purchases/pricing-hints
Seção intitulada “POST /purchases/pricing-hints”Margens praticadas pela loja para sugerir preço de venda ao cadastrar item de compra
Corpo (JSON)
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
categoryId |
uuid | não | Categoria do produto |
brandId |
uuid | não | Marca do produto |
title |
string | não | Descrição (a partir de 4 caracteres procura produto já cadastrado que comece com ela) |
Resposta: { categoryMargin, brandMargin, storeMargin, categoryName, brandName, sampleSize, reference }. As margens são medianas em % (null sem amostra); reference traz { description, priceCash, managerialCost } do produto de mesma descrição, se houver.
curl -X POST "https://api.nivesistemas.com.br/purchases/pricing-hints" \ -H "Authorization: Bearer sl_live_exemplo_abc123xyz789" \ -H "X-Store-Slug: loja-demo" \ -H "Content-Type: application/json" \ -d '{"categoryId":"00000000-0000-0000-0000-000000000000","brandId":"00000000-0000-0000-0000-000000000000","title":""}'const res = await fetch("https://api.nivesistemas.com.br/purchases/pricing-hints", { method: "POST", headers: { Authorization: "Bearer sl_live_exemplo_abc123xyz789", "X-Store-Slug": "loja-demo", "Content-Type": "application/json", }, body: JSON.stringify({ "categoryId": "00000000-0000-0000-0000-000000000000", "brandId": "00000000-0000-0000-0000-000000000000", "title": "" }),});const data = await res.json();import requests
res = requests.request( "POST", "https://api.nivesistemas.com.br/purchases/pricing-hints", headers={ "Authorization": "Bearer sl_live_exemplo_abc123xyz789", "X-Store-Slug": "loja-demo", }, json={ "categoryId": "00000000-0000-0000-0000-000000000000", "brandId": "00000000-0000-0000-0000-000000000000", "title": "" },)print(res.json())PUT /purchases/:id/tags
Seção intitulada “PUT /purchases/:id/tags”Definir as tags da compra (substitui a lista atual)
Parâmetros de rota: id
Corpo (JSON)
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
tagIds |
uuid[] | sim | Tags da compra (até 200; no máximo 20 por compra; lista vazia remove todas) |
Resposta: O detalhe da compra. Tags novas também são aplicadas aos produtos dos itens já recebidos. 400 em compra cancelada ou tag inexistente.
curl -X PUT "https://api.nivesistemas.com.br/purchases/{id}/tags" \ -H "Authorization: Bearer sl_live_exemplo_abc123xyz789" \ -H "X-Store-Slug: loja-demo" \ -H "Content-Type: application/json" \ -d '{"tagIds":null}'const res = await fetch("https://api.nivesistemas.com.br/purchases/{id}/tags", { method: "PUT", headers: { Authorization: "Bearer sl_live_exemplo_abc123xyz789", "X-Store-Slug": "loja-demo", "Content-Type": "application/json", }, body: JSON.stringify({ "tagIds": null }),});const data = await res.json();import requests
res = requests.request( "PUT", "https://api.nivesistemas.com.br/purchases/{id}/tags", headers={ "Authorization": "Bearer sl_live_exemplo_abc123xyz789", "X-Store-Slug": "loja-demo", }, json={ "tagIds": None },)print(res.json())GET /purchases/:id/ncm-diff
Seção intitulada “GET /purchases/:id/ncm-diff”Produtos da compra cujo NCM do cadastro difere do NCM da NF-e
Parâmetros de rota: id
Resposta: { items } no mesmo formato de /purchases/ncm-divergences. 404 se a compra não existe.
curl -X GET "https://api.nivesistemas.com.br/purchases/{id}/ncm-diff" \ -H "Authorization: Bearer sl_live_exemplo_abc123xyz789" \ -H "X-Store-Slug: loja-demo"const res = await fetch("https://api.nivesistemas.com.br/purchases/{id}/ncm-diff", { method: "GET", headers: { Authorization: "Bearer sl_live_exemplo_abc123xyz789", "X-Store-Slug": "loja-demo", },});const data = await res.json();import requests
res = requests.request( "GET", "https://api.nivesistemas.com.br/purchases/{id}/ncm-diff", headers={ "Authorization": "Bearer sl_live_exemplo_abc123xyz789", "X-Store-Slug": "loja-demo", },)print(res.json())POST /purchases/:id/apply-ncm
Seção intitulada “POST /purchases/:id/apply-ncm”Copiar o NCM da NF-e desta compra para o cadastro dos produtos escolhidos (exige gerenciar produtos)
Parâmetros de rota: id
Corpo (JSON)
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
productIds |
uuid[] | sim | Produtos a corrigir (1 a 500) |
Resposta: { updated, skipped }. Só aplica NCM oficial e sem conflito.
curl -X POST "https://api.nivesistemas.com.br/purchases/{id}/apply-ncm" \ -H "Authorization: Bearer sl_live_exemplo_abc123xyz789" \ -H "X-Store-Slug: loja-demo" \ -H "Content-Type: application/json" \ -d '{"productIds":null}'const res = await fetch("https://api.nivesistemas.com.br/purchases/{id}/apply-ncm", { method: "POST", headers: { Authorization: "Bearer sl_live_exemplo_abc123xyz789", "X-Store-Slug": "loja-demo", "Content-Type": "application/json", }, body: JSON.stringify({ "productIds": null }),});const data = await res.json();import requests
res = requests.request( "POST", "https://api.nivesistemas.com.br/purchases/{id}/apply-ncm", headers={ "Authorization": "Bearer sl_live_exemplo_abc123xyz789", "X-Store-Slug": "loja-demo", }, json={ "productIds": None },)print(res.json())POST /purchases/:id/insights
Seção intitulada “POST /purchases/:id/insights”Conferência inteligente das linhas da compra: produtos de referência e alertas de custo/quantidade
Parâmetros de rota: id
Corpo (JSON)
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
groups |
array | sim | Até 500 grupos de linhas da mesma referência: [{ key, title, lines: [{ lineId, size, color }] }] (1 a 200 linhas por grupo; size e color são a grade lida da nota) |
Resposta: { matches, alerts }. matches: por grupo, o produto já cadastrado que corresponde (source: gtin, history ou description), preços e o mapeamento de cada linha para uma variante (ou a grade que seria criada). alerts: por linha, avisos como COST_UP, COST_DOWN, QTY_HIGH, GTIN_DUP e GTIN_IN_USE.
curl -X POST "https://api.nivesistemas.com.br/purchases/{id}/insights" \ -H "Authorization: Bearer sl_live_exemplo_abc123xyz789" \ -H "X-Store-Slug: loja-demo" \ -H "Content-Type: application/json" \ -d '{"groups":[]}'const res = await fetch("https://api.nivesistemas.com.br/purchases/{id}/insights", { method: "POST", headers: { Authorization: "Bearer sl_live_exemplo_abc123xyz789", "X-Store-Slug": "loja-demo", "Content-Type": "application/json", }, body: JSON.stringify({ "groups": [] }),});const data = await res.json();import requests
res = requests.request( "POST", "https://api.nivesistemas.com.br/purchases/{id}/insights", headers={ "Authorization": "Bearer sl_live_exemplo_abc123xyz789", "X-Store-Slug": "loja-demo", }, json={ "groups": [] },)print(res.json())
