Pular para o conteúdo

Compras

Base: https://api.nivesistemas.com.br · 35 endpoints

Listar compras

Janela do terminal
curl -X GET "https://api.nivesistemas.com.br/purchases" \
-H "Authorization: Bearer sl_live_exemplo_abc123xyz789" \
-H "X-Store-Slug: loja-demo"

Detalhe da compra

Parâmetros de rota: id

Janela do terminal
curl -X GET "https://api.nivesistemas.com.br/purchases/{id}" \
-H "Authorization: Bearer sl_live_exemplo_abc123xyz789" \
-H "X-Store-Slug: loja-demo"

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)
Janela do terminal
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}'

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

Janela do terminal
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":""}'

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

Janela do terminal
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":""}'

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

Janela do terminal
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}'

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)

Janela do terminal
curl -X GET "https://api.nivesistemas.com.br/purchases/inbound-nfe" \
-H "Authorization: Bearer sl_live_exemplo_abc123xyz789" \
-H "X-Store-Slug: loja-demo"

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)

Janela do terminal
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"

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)

Janela do terminal
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"

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)

Janela do terminal
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}'

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

Janela do terminal
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}'

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

Janela do terminal
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}'

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

Janela do terminal
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":""}'

Excluir compra em rascunho

Parâmetros de rota: id

Resposta: 204 No Content

Janela do terminal
curl -X DELETE "https://api.nivesistemas.com.br/purchases/{id}" \
-H "Authorization: Bearer sl_live_exemplo_abc123xyz789" \
-H "X-Store-Slug: loja-demo"

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
Janela do terminal
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}'

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
Janela do terminal
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}'

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
Janela do terminal
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}'

Remover linha

Parâmetros de rota: id, lineId

Resposta: 204 No Content

Janela do terminal
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"

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

Janela do terminal
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}'

Sugestão de conta a pagar do recebimento (duplicatas da NF-e)

Parâmetros de rota: id

Janela do terminal
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"

Cancelar compra

Parâmetros de rota: id

Janela do terminal
curl -X POST "https://api.nivesistemas.com.br/purchases/{id}/cancel" \
-H "Authorization: Bearer sl_live_exemplo_abc123xyz789" \
-H "X-Store-Slug: loja-demo"

Desvincular linha do catálogo

Parâmetros de rota: id, lineId

Janela do terminal
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"

Corrigir vínculo da linha

Parâmetros de rota: id, lineId

Janela do terminal
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"

Distribuir quantidade da linha

Parâmetros de rota: id, lineId

Janela do terminal
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"

Comparar compra com XML

Parâmetros de rota: id

Janela do terminal
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"

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? }]
Janela do terminal
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":[]}'

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

Janela do terminal
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":""}'

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.

Janela do terminal
curl -X GET "https://api.nivesistemas.com.br/purchases/item-search" \
-H "Authorization: Bearer sl_live_exemplo_abc123xyz789" \
-H "X-Store-Slug: loja-demo"

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.

Janela do terminal
curl -X GET "https://api.nivesistemas.com.br/purchases/ncm-divergences" \
-H "Authorization: Bearer sl_live_exemplo_abc123xyz789" \
-H "X-Store-Slug: loja-demo"

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.

Janela do terminal
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}'

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.

Janela do terminal
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":""}'

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.

Janela do terminal
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}'

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.

Janela do terminal
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"

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.

Janela do terminal
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}'

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.

Janela do terminal
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":[]}'