{"openapi":"3.1.0","info":{"title":"Indica — API para lojas parceiras","version":"1.0.0-beta.2","summary":"Catálogo, cliques, pedidos pagos e comissão esperada para lojas e hubs.","contact":{"name":"Indica","url":"https://indicacompras.com.br"},"license":{"name":"Uso restrito a parceiros do Indica","url":"https://indicacompras.com.br"},"description":"O Indica é um assistente de compras: as pessoas perguntam o que querem\ncomprar e recebem as melhores ofertas de várias lojas. Esta API permite\nque uma loja — ou um hub com várias lojas — envie seus produtos para\naparecerem nas buscas do Indica. A v1 recebe catálogo e comissões,\ndevolve cliques e relatórios e recebe pedidos pagos, cancelamentos e estornos.\nCampanhas/cupons e distribuição na vitrine/WhatsApp seguem em preparação.\n\n**Fases 1 e 2 disponíveis:** conta, lojas, produtos, lotes e ciclo comercial.\nA fase 3 ainda responde `404` e não aparece na referência pública.\nComece pela homologação, com uma chave `ik_test_…`.\n\n## Primeiros passos\n\n1. **Peça sua chave de homologação** ao Indica (`ik_test_…`). Ela grava\n   numa área de testes que não aparece no site.\n2. **Confira a chave:** `GET /me`. Na página interativa\n   (`/desenvolvedores/api`), clique em *Authorize* e cole `ik_test_…`;\n   depois use *Try it out* em qualquer operação.\n3. **Cadastre a loja** (`PUT /stores/{store_id}`) com nome, CNPJ, site e\n   domínios.\n4. **Envie os produtos** (`PUT /products/{sku}` ou `POST /products/batch`)\n   e confira o estado de cada um em `GET /products/{sku}`.\n5. Tudo certo? Peça a chave de produção (`ik_live_…`) e repita os envios\n   com ela. O Indica aprova cada loja e os produtos entram nas buscas.\n\n```bash\ncurl https://api.indicacompras.com.br/v1/me \\\n  -H \"Authorization: Bearer ik_test_SUA_CHAVE\"\n```\n\nO contrato também está em\n[openapi.json](https://api.indicacompras.com.br/v1/openapi.json) e\n[openapi.yaml](https://api.indicacompras.com.br/v1/openapi.yaml), para\nimportar no Postman, no Insomnia ou num gerador de cliente.\nIntegrando com um agente de IA? Entregue a ele o\n[guia.md](https://api.indicacompras.com.br/v1/guia.md): tudo num arquivo\nsó, com instruções e a lista de pronto.\n\n## Hub de lojas ou loja direta\n\nO contrato é o mesmo para os dois; muda quantas lojas a conta tem.\n\n- **Hub (várias lojas, um acesso só):** uma chave para o hub inteiro. Cada\n  loja é cadastrada com um `store_id` escolhido por você (o código que o\n  hub já usa) e o **CNPJ** dela; cada produto diz de qual loja é, em\n  `store_id`. O Indica aprova ou suspende loja por loja.\n- **Loja direta:** a mesma coisa com uma loja só. A conta de loja direta\n  aceita uma loja por ambiente (`single_store` na segunda); para várias,\n  a conta vira hub — fale com o Indica.\n\n`GET /me` diz qual é o seu caso em `partner_type` (`hub` ou `store`).\n\nO `sku` é único por parceiro e ambiente, inclusive entre lojas do hub.\nUse um prefixo por loja (por exemplo `centro-TEN-1`). Trocar o `store_id`\nde um SKU já cadastrado, mesmo removido, responde `sku_store_conflict`.\nEnvios simultâneos não fazem o preço retroceder: prevalece o maior `updated_at`.\nA mesma `Idempotency-Key` com rota ou corpo diferente responde `422`.\n\n## Comissão esperada\n\nNo cadastro da empresa (PUT /stores/{store_id}), envie default_commission:\n`{\"type\":\"percentage\",\"rate\":6.5}` ou `{\"type\":\"fixed\",\"amount_cents\":900}`.\nNo produto, commission define uma exceção; null ou ausência herda a geral.\nPATCH /products/{sku} aceita commission e updated_at; commission=null volta\na herdar. PUT substitui o cadastro inteiro: omitir a regra remove a exceção.\nGET /products/{sku} informa regra efetiva, origem e expected_commission_cents.\nA estimativa é privada e por unidade ao preço atual, sem frete. Descontos,\nquantidade e valores líquidos são calculados em POST /conversions. O primeiro\nevento paid recebido guarda a regra vigente naquele recebimento, não uma\nreconstrução do contrato na data histórica da venda. O snapshot não muda\ncom alterações do catálogo. Comissão esperada não confirma pagamento ao Indica.\n\n## Como funciona\n\n1. Você cadastra suas **lojas** (`PUT /stores/{store_id}`), com nome,\n   CNPJ, site e domínios. O Indica aprova cada loja e o domínio dela antes\n   de publicar qualquer produto.\n2. Você envia os **produtos** (um a um ou em lote) e mantém preço e\n   estoque atualizados com `PATCH`. Nós indexamos do nosso lado: a busca\n   não chama a sua API.\n3. Quem clica num produto seu passa pelo nosso redirecionador e chega à\n   sua página com o parâmetro **`indica_click=<código>`** na URL. Guarde\n   esse código (cookie de 30 dias, último clique vence).\n4. Consulte `GET /clicks`. Quando o cliente pagar, envie `POST /conversions`\n   com status `paid`, sem dados pessoais. Envie novos eventos para estornos\n   ou cancelamentos. Consulte `GET /reports/commission` para conciliar.\n5. Em homologação, `POST /sandbox/clicks` cria um clique de teste para um\n   SKU seu. Nunca cria visitas ou pedidos na produção.\n\n## Regras que valem para todos os parceiros\n\n- **Comissão não altera o ranking.** Seus produtos competem com os de\n  todas as outras lojas por relevância, preço e qualidade. A taxa de\n  comissão nunca entra na ordem da busca.\n- **Preço, estoque, frete e cupom vêm de você.** O Indica não estima nem\n  completa esses dados. Frete não informado aparece como desconhecido,\n  nunca como grátis.\n- **Produto sem atualização há mais de 48 horas sai da busca** até o\n  próximo `PATCH` ou `PUT`. Preço velho é preço errado.\n- **Foto de capa conferida** antes de ir ao ar: abre por HTTPS num\n  domínio da loja, JPEG/PNG/WebP, pelo menos 500 px no menor lado.\n- **Preço fora da realidade não aparece.** Em cada busca, uma oferta\n  muito abaixo das outras do mesmo produto (golpe, réplica ou erro de\n  cadastro) fica de fora daquela busca — a mesma régua para todas as\n  lojas, parceiras ou não. O estado do produto não muda.\n- **Nenhum dado pessoal de comprador.** As vendas não aceitam nome, CPF,\n  e-mail, telefone ou endereço, nem qualquer campo fora do contrato.\n- Toda URL enviada precisa ser HTTPS, e as de produto e campanha precisam\n  ser de um domínio aprovado da loja.\n\n## Convenções\n\n- JSON em UTF-8. Dinheiro em **centavos inteiros de real** (`29990` =\n  R$ 299,90). Datas em ISO 8601 com fuso.\n- Autenticação por chave no cabeçalho `Authorization: Bearer <chave>`.\n  Chaves `ik_live_…` publicam no site; chaves `ik_test_…` gravam numa\n  área de homologação que não aparece para ninguém.\n- Erros seguem o RFC 9457 (`application/problem+json`), com a lista de\n  campos inválidos em `errors`.\n- Escritas aceitam o cabeçalho `Idempotency-Key`: repetir a mesma chave\n  em até 24 h devolve a resposta original, sem gravar de novo.\n- Freio por chave: 600 escritas e 1.200 leituras por minuto. Acima disso,\n  `429` com `Retry-After`.\n- Listagens paginam por cursor (`cursor` + `limit`, máximo 200).\n- Chamadas identificadas recebem **X-Request-Id**, gerado pelo Indica.\n  Informe esse ID ao suporte para localizar a operação. O painel interno\n  registra resultado, referências e campos enviados, sem corpo, query\n  string ou credenciais. Lote recebido na fila e lote processado são\n  entradas diferentes. O histórico começa após sua ativação; falha do\n  gravador não altera o resultado de uma operação já concluída.\n"},"servers":[{"url":"https://api.indicacompras.com.br/v1","description":"Produção e homologação (o ambiente é definido pela chave)."}],"security":[{"chave":[]}],"x-indica-pronto":["`GET /me` responde `200` com a chave `ik_test_…` e o `partner_type` esperado (`hub` ou `store`).","Cada loja cadastrada com `PUT /stores/{store_id}`: CNPJ válido, site e todos os domínios das páginas de produto (e de fotos, em `image_hosts`).","Um produto enviado com `PUT /products/{sku}` aparece em `GET /products/{sku}`, segundos depois (conferência da capa), com `state` `accepted` — ou `pending` com `store_not_active` ou `domain_not_approved` enquanto o Indica não aprova a loja e o domínio. Se vier `rejected` com motivo de foto (`image_*`), a capa foi corrigida e reenviada.","Carga inicial com `POST /products/batch`, acompanhada em `GET /jobs/{job_id}` até `done`, e cada item de `errors` corrigido e reenviado.","Mudança de preço ou estoque enviada com `PATCH /products/{sku}` e conferida em `GET /products/{sku}`.","Produto que saiu de linha tirado do ar com `DELETE /products/{sku}`.","Envio periódico agendado: todo produto ativo recebe `PUT` ou `PATCH` em menos de 48 horas.","Toda escrita manda `Idempotency-Key` e repete a mesma ao tentar de novo; `429` espera `Retry-After`; `422` corrige os campos de `errors` antes de repetir.","O site da loja lê `indica_click` da URL de chegada e guarda por 30 dias.","Com ik_test, crie um clique em `POST /sandbox/clicks`, envie paid e estorno em `POST /conversions` e confira `GET /reports/commission`.","Tudo acima conferido: peça a chave de produção (`ik_live_…`) e repita os envios com ela."],"tags":[{"name":"Conta","description":"Conferir a chave e o ambiente."},{"name":"Lojas","description":"As lojas do parceiro; um hub tem várias."},{"name":"Produtos","description":"Catálogo, preço, estoque e o estado de cada produto do lado do Indica."},{"name":"Vendas e comissão","description":"Vendas originadas pelo Indica e a apuração da comissão."}],"paths":{"/me":{"get":{"tags":["Conta"],"operationId":"obterConta","x-indica-fase":1,"summary":"Quem é esta chave","description":"Útil como primeiro teste da integração.","responses":{"200":{"description":"Parceiro, ambiente e escopos da chave.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Account"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/stores":{"get":{"tags":["Lojas"],"operationId":"listarLojas","x-indica-fase":1,"summary":"Lista as lojas deste parceiro","parameters":[{"$ref":"#/components/parameters/Cursor"},{"$ref":"#/components/parameters/Limit"}],"responses":{"200":{"description":"Página de lojas.","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Store"}},"next_cursor":{"type":["string","null"]}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/stores/{store_id}":{"parameters":[{"$ref":"#/components/parameters/StoreId"}],"put":{"tags":["Lojas"],"operationId":"salvarLoja","x-indica-fase":1,"summary":"Cria ou substitui uma loja","description":"Domínios novos ficam `pending_review` até aprovação do Indica. Os\nprodutos da loja são aceitos nesse meio-tempo, mas só aparecem no\nsite depois da aprovação.\n","parameters":[{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StoreInput"},"examples":{"lojaDeHub":{"$ref":"#/components/examples/LojaDeHub"},"lojaDireta":{"$ref":"#/components/examples/LojaDireta"}}}}},"responses":{"200":{"description":"Loja salva.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Store"},"examples":{"emAnalise":{"$ref":"#/components/examples/LojaEmAnalise"}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"422":{"$ref":"#/components/responses/ValidationError"},"429":{"$ref":"#/components/responses/TooManyRequests"}}},"get":{"tags":["Lojas"],"operationId":"obterLoja","x-indica-fase":1,"summary":"Consulta uma loja","responses":{"200":{"description":"A loja.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Store"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/products":{"get":{"tags":["Produtos"],"operationId":"listarProdutos","x-indica-fase":1,"summary":"Lista produtos e o estado de cada um do lado do Indica","description":"Para conciliação. Filtre por loja e estado.","parameters":[{"name":"store_id","in":"query","schema":{"$ref":"#/components/schemas/ExternalId"}},{"name":"state","in":"query","schema":{"$ref":"#/components/schemas/ProductState"}},{"$ref":"#/components/parameters/Cursor"},{"$ref":"#/components/parameters/Limit"}],"responses":{"200":{"description":"Página de produtos.","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ProductStatus"}},"next_cursor":{"type":["string","null"]}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/products/{sku}":{"parameters":[{"$ref":"#/components/parameters/Sku"}],"put":{"tags":["Produtos"],"operationId":"salvarProduto","x-indica-fase":1,"summary":"Cria ou substitui um produto","description":"Idempotente. Se `updated_at` for mais antigo que o já recebido para o\nmesmo SKU, a chamada é aceita e ignorada (`200` com `ignored_stale`),\npara que envios fora de ordem não voltem um preço antigo.\n\nA conferência da foto de capa (`image_urls[0]`) é assíncrona e leva\nsegundos: a resposta diz `pending`, e o resultado aparece em\n`GET /products/{sku}` — `accepted`, ou `rejected` com o motivo\n(`image_unreachable`, `image_type`, `image_too_small`). Foto\nrecusada é conferida de novo a cada hora (CDN que voltou passa\nsozinho); foto boa, a cada 7 dias. Corrigiu a foto no mesmo\nendereço? Envie o produto de novo (`PUT`): capa recusada é\nconferida outra vez em segundos. Capa aprovada não é refeita a cada\nenvio.\n","parameters":[{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductInput"},"examples":{"completo":{"$ref":"#/components/examples/ProdutoCompleto"},"minimo":{"$ref":"#/components/examples/ProdutoMinimo"}}}}},"responses":{"200":{"description":"Recebido.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductStatus"},"examples":{"pendente":{"$ref":"#/components/examples/StatusPendente"},"noAr":{"$ref":"#/components/examples/StatusNoAr"},"ignorado":{"$ref":"#/components/examples/StatusIgnorado"}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"422":{"$ref":"#/components/responses/ValidationError"},"429":{"$ref":"#/components/responses/TooManyRequests"}}},"patch":{"tags":["Produtos"],"operationId":"atualizarPrecoEstoque","x-indica-fase":1,"summary":"Atualiza preço, estoque, disponibilidade ou frete","description":"A chamada do dia a dia. Só os campos enviados mudam. Mesma regra de\n`updated_at` do `PUT`.\n","parameters":[{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductPatch"},"examples":{"novoPreco":{"$ref":"#/components/examples/PatchNovoPreco"},"esgotou":{"$ref":"#/components/examples/PatchEsgotou"},"fimDaPromocao":{"$ref":"#/components/examples/PatchFimDaPromocao"}}}}},"responses":{"200":{"description":"Atualizado.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductStatus"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"422":{"$ref":"#/components/responses/ValidationError"},"429":{"$ref":"#/components/responses/TooManyRequests"}}},"get":{"tags":["Produtos"],"operationId":"obterProduto","x-indica-fase":1,"summary":"Como o produto ficou do lado do Indica","responses":{"200":{"description":"Estado e, se recusado, os motivos.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductStatus"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/TooManyRequests"}}},"delete":{"tags":["Produtos"],"operationId":"removerProduto","x-indica-fase":1,"summary":"Tira o produto do ar","responses":{"204":{"description":"Removido (ou já não existia)."},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/products/batch":{"post":{"tags":["Produtos"],"operationId":"enviarLote","x-indica-fase":1,"summary":"Envia até 1.000 produtos de uma vez (carga inicial)","description":"Retorna 202 com state=queued somente após persistir o lote. Processamento em trechos de até 50 itens, retomado após falha ou reinício; acompanhe por GET /jobs/{job_id}. Cada trecho confirma produtos e progresso juntos. Em done, received = accepted + rejected + pending + removed. removed conta operações delete concluídas, inclusive SKU já ausente. pending é o estado na hora do processamento; consulte o produto para o estado atual.","parameters":[{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchInput"},"examples":{"cargaInicial":{"$ref":"#/components/examples/LoteCargaInicial"}}}}},"responses":{"202":{"description":"Lote aceito para processamento.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Job"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"413":{"description":"Corpo acima de 5 MB ou mais de 1.000 itens.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"$ref":"#/components/responses/ValidationError"},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/jobs/{job_id}":{"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string"}}],"get":{"tags":["Produtos"],"operationId":"obterLote","x-indica-fase":1,"summary":"Andamento e erros de um lote","responses":{"200":{"description":"O lote.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Job"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/clicks":{"get":{"tags":["Vendas e comissão"],"operationId":"listarCliques","x-indica-fase":2,"summary":"Consulta os cliques enviados às suas lojas","description":"Sem IP, navegador ou dados pessoais. Ordenação por momento, loja e ID.\nRetorna since/until normalizados; mantenha esses valores nas próximas páginas.\nJanela UTC [since, until), até 31 dias. Padrão de 30 dias até agora.\n","parameters":[{"name":"since","in":"query","schema":{"type":"string","format":"date-time"}},{"name":"until","in":"query","schema":{"type":"string","format":"date-time"}},{"name":"store_id","in":"query","schema":{"$ref":"#/components/schemas/ExternalId"}},{"$ref":"#/components/parameters/Cursor"},{"$ref":"#/components/parameters/Limit"}],"responses":{"200":{"description":"Página de cliques limitada ao parceiro e ambiente da chave.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClickPage"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"422":{"$ref":"#/components/responses/ValidationError"},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/sandbox/clicks":{"post":{"tags":["Vendas e comissão"],"operationId":"simularClique","x-indica-fase":2,"summary":"Gera clique de homologação para testar o ciclo comercial","description":"Apenas ik_test. SKU deve existir nesta loja. Não exige aprovação pública.","parameters":[{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["store_id","sku"],"properties":{"store_id":{"$ref":"#/components/schemas/ExternalId"},"sku":{"$ref":"#/components/schemas/ExternalId"}}},"example":{"store_id":"centro","sku":"TEN-123-42"}}}},"responses":{"200":{"description":"Clique de teste. Use click_id e occurred_at no evento paid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerClick"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"422":{"$ref":"#/components/responses/ValidationError"},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/conversions":{"post":{"tags":["Vendas e comissão"],"operationId":"informarVenda","x-indica-fase":2,"summary":"Informa pedido pago, cancelamento ou estorno acumulado","description":"Envie por HTTPS com Bearer; não há segredo ou assinatura HMAC adicional nesta versão.\nEsta é uma chamada servidor a servidor feita pela loja, não um webhook enviado pelo Indica.\nNão envie dados pessoais do comprador. Somente pedidos pagos originados no Indica.\n\nPrimeiro envie status paid, occurred_at igual a paid_at e refunded_cents=0\nem todos os itens. click_id deve ser do parceiro/ambiente/loja e ocorrer\naté 30 dias antes de paid_at, inclusive. Clique inválido responde 422\ninvalid_attribution e não grava pedido. A data de recebimento não limita\natribuição: uma venda paga dentro da janela pode ser notificada depois.\n\nUse event_id único por parceiro/ambiente para CADA evento, inclusive entre\nlojas do hub. Deduplicação permanente: mesma entrada normalizada retorna\nduplicate=true, mesmo depois de 24 h; outro corpo com event_id repetido é\n409 event_conflict. Idempotency-Key também é aceita (rota/corpo por 24 h).\nPedido é único por store_id/order_id. Repetir não soma faturamento.\n\nO primeiro paid recebido guarda commission, commission_source e\ncommission_snapshot_at vigentes naquele recebimento. Não reconstrói\ntermos históricos e não confirma comissão devida/paga ao Indica.\nComissão percentual usa o valor líquido real dos produtos, sem frete;\ncomissão fixa é por unidade e reduz proporcionalmente ao valor estornado.\nArredondamento por item ao centavo mais próximo, meio para cima.\nBase líquida zero gera comissão zero; regra ausente gera null se há saldo.\n\nPara refunded ou cancelled repita TODOS os itens originais e paid_at.\nrefunded_cents é o acumulado da LINHA (quantidade inteira), não por unidade\nnem o incremento deste evento. Cancelamento estorna todas as linhas.\nEstornos não diminuem e cancelled não volta a paid. Valores/quantidades,\nSKUs, click_id e paid_at originais são imutáveis. Até 200 SKUs únicos.\nSe o estorno chegar antes de paid: 409 payment_required; envie paid e\nreenvie o estorno. Evento anterior ao último é auditado com ignored_stale=true\nsem alterar saldo; eventos divergentes no mesmo instante respondem 409.\nA resposta de repetição é a original daquele evento; GET de pedido traz\no estado atual. Limite de cinco minutos no futuro nas datas de eventos.\n","parameters":[{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConversionEvent"},"example":{"event_id":"EV-88231-paid","order_id":"PED-88231","click_id":"ic_7Hq2LmZx91KdPqRt","store_id":"centro","status":"paid","currency":"BRL","paid_at":"2026-10-14T14:00:00Z","occurred_at":"2026-10-14T14:00:00Z","items":[{"sku":"TEN-123-42","quantity":2,"unit_price_cents":29990,"refunded_cents":0}]}}}},"responses":{"200":{"description":"Pedido e evento persistidos atomicamente.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConversionReceipt"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"409":{"description":"event_conflict, order_conflict, payment_required ou invalid_transition. Corrija a causa antes de repetir.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"$ref":"#/components/responses/ValidationError"},"429":{"$ref":"#/components/responses/TooManyRequests"}}},"get":{"tags":["Vendas e comissão"],"operationId":"listarVendas","x-indica-fase":2,"summary":"Lista pedidos pelo momento do pagamento e estado atual","description":"Intervalo UTC [since, until), até 31 dias, padrão de 30 dias até agora.\nFiltra paid_at, não a data do estorno. O saldo de um período anterior\npode mudar após um estorno. Mantenha since/until nas próximas páginas.\nExportação de fechamento e extrato de movimentos ainda não disponíveis.\n","parameters":[{"name":"since","in":"query","schema":{"type":"string","format":"date-time"}},{"name":"until","in":"query","schema":{"type":"string","format":"date-time"}},{"name":"store_id","in":"query","schema":{"$ref":"#/components/schemas/ExternalId"}},{"$ref":"#/components/parameters/Cursor"},{"$ref":"#/components/parameters/Limit"}],"responses":{"200":{"description":"Página de pedidos.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConversionPage"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"422":{"$ref":"#/components/responses/ValidationError"},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/conversions/{order_id}":{"get":{"tags":["Vendas e comissão"],"operationId":"consultarVenda","x-indica-fase":2,"summary":"Consulta o estado atual de um pedido da sua loja","parameters":[{"name":"order_id","in":"path","required":true,"schema":{"$ref":"#/components/schemas/ExternalId"}},{"name":"store_id","in":"query","required":true,"schema":{"$ref":"#/components/schemas/ExternalId"}}],"responses":{"200":{"description":"Pedido com snapshot de comissão.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrderView"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"description":"Pedido não encontrado neste parceiro/ambiente/loja."},"422":{"$ref":"#/components/responses/ValidationError"},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/reports/commission":{"get":{"tags":["Vendas e comissão"],"operationId":"relatorioDeComissao","x-indica-fase":2,"summary":"Resume cliques, pedidos e comissão esperada por loja","description":"Intervalo UTC [since, until), até 31 dias. Cliques por occurred_at;\npedidos por paid_at, com seu estado atual, inclusive estornos posteriores.\nNão é taxa de conversão por coorte nem fechamento financeiro imutável.\nexpected_commission_cents é null se qualquer pedido com saldo tiver regra\ndesconhecida. known_expected_commission_cents é só o subtotal conhecido.\nSaldo de comissão esperado, não pagamento recebido pelo Indica. Toda loja\ncom clique ou pedido aparece, inclusive lojas sem pedidos. Sem atividade\nno período retorna totals zerados e stores vazio (contagens reais).\n","parameters":[{"name":"since","in":"query","schema":{"type":"string","format":"date-time"}},{"name":"until","in":"query","schema":{"type":"string","format":"date-time"}},{"name":"store_id","in":"query","schema":{"$ref":"#/components/schemas/ExternalId"}}],"responses":{"200":{"description":"Totais e agrupamento por loja do mesmo snapshot de leitura.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommissionReport"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"422":{"$ref":"#/components/responses/ValidationError"},"429":{"$ref":"#/components/responses/TooManyRequests"}}}}},"components":{"examples":{"LojaDeHub":{"summary":"Uma das lojas de um hub","description":"O hub escolhe o `store_id` (o código que ele já usa) e repete esta chamada para cada loja.","value":{"name":"Loja Centro Calçados","cnpj":"11.222.333/0001-81","website_url":"https://centro.calcadosexemplo.com.br","domains":["centro.calcadosexemplo.com.br"],"image_hosts":["cdn.calcadosexemplo.com.br"],"logo_url":"https://cdn.calcadosexemplo.com.br/logos/centro.png","returns_days":7,"handling_days":1}},"LojaDireta":{"summary":"Loja que integra direto (uma loja só)","value":{"name":"Casa Exemplo","cnpj":"12.ABC.345/01DE-35","website_url":"https://www.casaexemplo.com.br","domains":["casaexemplo.com.br"]}},"LojaEmAnalise":{"summary":"Loja recém-cadastrada, aguardando aprovação do Indica","value":{"store_id":"centro","name":"Loja Centro Calçados","cnpj":"11222333000181","website_url":"https://centro.calcadosexemplo.com.br","domains":["centro.calcadosexemplo.com.br"],"image_hosts":["cdn.calcadosexemplo.com.br"],"status":"pending_review","domains_approved":[]}},"ProdutoCompleto":{"summary":"Produto com todos os campos que ajudam a vender","description":"Quanto mais dado verdadeiro, melhor o produto compete: GTIN ajuda a\ncomparar com outras lojas, frete e parcelamento entram no preço final\nmostrado, avaliação com quantidade pesa na qualidade.\n","value":{"store_id":"centro","title":"Tênis de Corrida Leve Masculino Preto 42","description":"Cabedal em tela respirável, entressola em EVA, solado de borracha.","brand":"RunFast","model":"RF-200","gtin":"7891234567895","category":"Calçados > Tênis > Corrida","attributes":{"cor":"preto","tamanho":"42","genero":"masculino"},"condition":"new","group_id":"RF-200","variant_attributes":{"cor":"preto","tamanho":"42"},"product_url":"https://centro.calcadosexemplo.com.br/p/rf-200-preto-42","image_urls":["https://cdn.calcadosexemplo.com.br/rf-200/preto-1.jpg","https://cdn.calcadosexemplo.com.br/rf-200/preto-2.jpg"],"price_cents":29990,"original_price_cents":39990,"available":true,"stock_quantity":12,"shipping":{"type":"fixed","cost_cents":1990,"delivery_days_min":2,"delivery_days_max":5},"installments":{"count":10,"value_cents":2999,"interest_free":true},"rating":{"average":4.7,"count":318},"updated_at":"2026-10-03T09:00:00-03:00"}},"ProdutoMinimo":{"summary":"Só o obrigatório","description":"Sem `shipping`, o frete aparece como \"a calcular\" — nunca como grátis.","value":{"store_id":"centro","title":"Meia Esportiva Cano Curto Kit 3 Pares","price_cents":3990,"available":true,"product_url":"https://centro.calcadosexemplo.com.br/p/meia-kit-3","image_urls":["https://cdn.calcadosexemplo.com.br/meia-kit-3.jpg"],"updated_at":"2026-10-03T09:00:00-03:00"}},"PatchNovoPreco":{"summary":"Mudou o preço","value":{"price_cents":27990,"updated_at":"2026-10-03T14:30:00-03:00"}},"PatchEsgotou":{"summary":"Esgotou","value":{"available":false,"stock_quantity":0,"updated_at":"2026-10-03T15:00:00-03:00"}},"PatchFimDaPromocao":{"summary":"Acabou a promoção (tira o preço \"de\")","value":{"price_cents":39990,"original_price_cents":null,"updated_at":"2026-10-04T00:00:00-03:00"}},"LoteCargaInicial":{"summary":"Carga inicial com inclusão e remoção","value":{"items":[{"op":"upsert","sku":"RF-200-PRETO-42","product":{"store_id":"centro","title":"Tênis de Corrida Leve Masculino Preto 42","price_cents":29990,"available":true,"product_url":"https://centro.calcadosexemplo.com.br/p/rf-200-preto-42","image_urls":["https://cdn.calcadosexemplo.com.br/rf-200/preto-1.jpg"],"updated_at":"2026-10-03T09:00:00-03:00"}},{"op":"delete","sku":"RF-100-AZUL-40"}]}},"StatusPendente":{"summary":"Recebido, esperando a aprovação da loja","value":{"sku":"RF-200-PRETO-42","store_id":"centro","state":"pending","reasons":[{"code":"store_not_active","message":"A loja ainda não foi aprovada pelo Indica (ou está suspensa)."}],"received_at":"2026-10-03T12:00:01.000Z","published_at":null}},"StatusNoAr":{"summary":"No ar, aparecendo nas buscas","value":{"sku":"RF-200-PRETO-42","store_id":"centro","state":"accepted","reasons":[],"received_at":"2026-10-03T12:00:01.000Z","published_at":"2026-10-03T12:00:01.000Z"}},"StatusIgnorado":{"summary":"Envio mais antigo que o último recebido (ignorado)","value":{"sku":"RF-200-PRETO-42","store_id":"centro","state":"accepted","reasons":[],"received_at":"2026-10-03T12:00:01.000Z","published_at":"2026-10-03T12:00:01.000Z","ignored_stale":true}},"ErroDeValidacao":{"summary":"Produto com campos inválidos (todos os erros de uma vez)","value":{"type":"https://api.indicacompras.com.br/v1/problemas/422","title":"Corpo inválido.","status":422,"errors":[{"field":"price_cents","code":"integer","message":"Precisa ser número inteiro."},{"field":"product_url","code":"domain_not_declared","message":"A página precisa ser de um domínio declarado da loja."},{"field":"comprador_cpf","code":"unknown_field","message":"Campo fora do contrato."}]}},"ErroSemChave":{"summary":"Chave ausente ou inválida","value":{"type":"https://api.indicacompras.com.br/v1/problemas/401","title":"Chave ausente, inválida ou revogada.","status":401,"detail":"Envie Authorization: Bearer ik_live_… (ou ik_test_…)."}},"ErroDeFreio":{"summary":"Muitas chamadas no último minuto","value":{"type":"https://api.indicacompras.com.br/v1/problemas/429","title":"Muitas chamadas para esta chave.","status":429,"detail":"Tente de novo depois de Retry-After segundos."}}},"securitySchemes":{"chave":{"type":"http","scheme":"bearer","description":"`ik_live_…` (produção) ou `ik_test_…` (homologação). Emitida pelo\nIndica; guardamos só o hash. Duas chaves podem valer ao mesmo tempo\ndurante a troca, para rotacionar sem parar a integração.\n"}},"parameters":{"StoreId":{"name":"store_id","in":"path","required":true,"schema":{"$ref":"#/components/schemas/ExternalId"}},"Sku":{"name":"sku","in":"path","required":true,"description":"SKU estável do seu lado. Cada variação (cor, tamanho) tem o seu.","schema":{"$ref":"#/components/schemas/ExternalId"}},"Cursor":{"name":"cursor","in":"query","schema":{"type":"string"}},"Limit":{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":200,"default":50}},"IdempotencyKey":{"name":"Idempotency-Key","in":"header","description":"Repetir a mesma chave em até 24 h devolve a resposta original.","schema":{"type":"string","maxLength":100}}},"responses":{"Unauthorized":{"description":"Chave ausente, inválida ou revogada.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"semChave":{"$ref":"#/components/examples/ErroSemChave"}}}}},"NotFound":{"description":"Não existe para este parceiro.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"ValidationError":{"description":"Corpo inválido. `errors` lista cada campo e o motivo. Além dos códigos\nde formato (`required`, `pattern`, `integer`, `https`, `unknown_field`…),\na loja usa `cnpj` + `invalid` (dígitos não conferem), `store_id` +\n`single_store` (conta de loja direta já tem uma loja) e `store_id` +\n`conflict` (outro id seu vira o mesmo endereço no Indica);\na validação de produto usa `store_not_found` (cadastre a loja antes),\n`domain_not_declared` (página fora dos `domains` da loja),\n`image_host_not_declared` (foto fora dos `domains`/`image_hosts`),\n`not_higher` (preço \"de\" não é maior que o preço) e `future`\n(`updated_at` mais de 24 h no futuro).\n","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"produtoInvalido":{"$ref":"#/components/examples/ErroDeValidacao"}}}}},"TooManyRequests":{"description":"Freio da chave: 600 escritas e 1.200 leituras por minuto. Tente de novo\ndepois de `Retry-After` segundos; o lote conta como uma escrita só.\n","headers":{"Retry-After":{"schema":{"type":"integer","minimum":1}}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"freio":{"$ref":"#/components/examples/ErroDeFreio"}}}}}},"schemas":{"ExternalId":{"type":"string","description":"Identificador do seu lado. Letras, números, `.`, `_` e `-`.","pattern":"^[A-Za-z0-9._-]{1,80}$"},"HttpsUrl":{"type":"string","format":"uri","pattern":"^https://","maxLength":2048},"Account":{"type":"object","required":["partner_id","name","partner_type","environment","scopes"],"properties":{"partner_id":{"type":"string"},"name":{"type":"string"},"partner_type":{"type":"string","enum":["hub","store"],"description":"`hub`: várias lojas com um acesso; `store`: loja direta, uma loja por ambiente."},"environment":{"type":"string","enum":["live","test"]},"scopes":{"type":"array","items":{"type":"string","enum":["catalog","clicks","promotions","conversions","reports"]}}}},"Commission":{"description":"Comissão declarada pela loja, estimada por unidade vendida em BRL. percentage aplica rate ao price_cents atual, sem frete, arredondando meio centavo para cima. fixed paga amount_cents por unidade. Zero é uma regra explícita; null/ausência no produto herda a geral da loja. Sem nenhuma regra a expectativa é desconhecida, não zero. Não confirma receita nem interfere no ranking.","oneOf":[{"type":"object","additionalProperties":false,"required":["type","rate"],"properties":{"type":{"const":"percentage"},"rate":{"type":"number","minimum":0,"maximum":100,"multipleOf":0.01}}},{"type":"object","additionalProperties":false,"required":["type","amount_cents"],"properties":{"type":{"const":"fixed"},"amount_cents":{"type":"integer","minimum":0,"maximum":9007199254740991}}},{"type":"null"}]},"StoreInput":{"type":"object","additionalProperties":false,"required":["name","cnpj","website_url","domains"],"properties":{"default_commission":{"$ref":"#/components/schemas/Commission"},"name":{"type":"string","minLength":2,"maxLength":80},"cnpj":{"type":"string","description":"CNPJ da empresa dona da loja, com ou sem pontuação. Aceita o\nalfanumérico (Receita, desde julho de 2026). Conferimos os dígitos\nverificadores; a resposta devolve só os caracteres\n(`11222333000181`). Identifica a loja para a comissão e evita a\nmesma empresa cadastrada duas vezes.\n","pattern":"^[A-Za-z0-9./-]{14,18}$","examples":["11.222.333/0001-81","12.ABC.345/01DE-35"]},"logo_url":{"$ref":"#/components/schemas/HttpsUrl"},"website_url":{"$ref":"#/components/schemas/HttpsUrl"},"domains":{"type":"array","description":"Domínios das páginas de produto e campanha desta loja (ex.\n`loja.com.br`). Entram na lista de domínios oficiais do nosso\nredirecionador só depois de aprovados.\n","minItems":1,"maxItems":5,"items":{"type":"string","pattern":"^[a-z0-9.-]+\\.[a-z]{2,}$"}},"image_hosts":{"type":"array","description":"Domínios de CDN das fotos, se diferentes dos da loja.","maxItems":5,"items":{"type":"string","pattern":"^[a-z0-9.-]+\\.[a-z]{2,}$"}},"returns_days":{"type":"integer","minimum":0,"maximum":365,"description":"Prazo de troca/devolução."},"handling_days":{"type":"integer","minimum":0,"maximum":60,"description":"Prazo para despachar."}}},"Store":{"allOf":[{"$ref":"#/components/schemas/StoreInput"},{"type":"object","required":["store_id","status"],"properties":{"store_id":{"$ref":"#/components/schemas/ExternalId"},"status":{"type":"string","enum":["pending_review","active","suspended"]},"domains_approved":{"type":"array","items":{"type":"string"}}}}]},"Shipping":{"description":"Frete do produto. **Ausente = desconhecido**: o Indica mostra \"frete a\ncalcular\", nunca \"grátis\". Só use `free` quando for grátis de fato\n(com o mínimo de pedido, se houver).\n","oneOf":[{"type":"object","additionalProperties":false,"required":["type"],"properties":{"type":{"const":"free"},"min_order_cents":{"type":"integer","minimum":0},"delivery_days_min":{"type":"integer","minimum":0},"delivery_days_max":{"type":"integer","minimum":0}}},{"type":"object","additionalProperties":false,"required":["type","cost_cents"],"properties":{"type":{"const":"fixed"},"cost_cents":{"type":"integer","minimum":0},"delivery_days_min":{"type":"integer","minimum":0},"delivery_days_max":{"type":"integer","minimum":0}}}]},"ProductInput":{"type":"object","additionalProperties":false,"required":["store_id","title","price_cents","available","product_url","image_urls","updated_at"],"properties":{"commission":{"$ref":"#/components/schemas/Commission"},"store_id":{"$ref":"#/components/schemas/ExternalId"},"title":{"type":"string","minLength":5,"maxLength":200},"description":{"type":"string","maxLength":5000},"brand":{"type":"string","maxLength":80},"model":{"type":"string","maxLength":80},"gtin":{"type":"string","description":"EAN/GTIN. A melhor prova para comparar o mesmo produto entre lojas.","pattern":"^(\\d{8}|\\d{12,14})$"},"category":{"type":"string","description":"Caminho da categoria na sua loja, ex. `Calçados > Tênis > Corrida`.","maxLength":200},"attributes":{"type":"object","description":"Ficha técnica (voltagem, capacidade, tamanho…). Só o que é verdade; nada estimado.","maxProperties":50,"additionalProperties":{"type":"string","maxLength":200}},"condition":{"type":"string","enum":["new","used","refurbished"],"default":"new","description":"Usado e recondicionado aparecem como alternativa rotulada, nunca como o produto novo pedido."},"group_id":{"$ref":"#/components/schemas/ExternalId","description":"Mesmo valor em todas as variações do mesmo produto (cores, tamanhos)."},"variant_attributes":{"type":"object","description":"O que distingue esta variação, ex. `{\"cor\":\"preto\",\"tamanho\":\"42\"}`.","maxProperties":5,"additionalProperties":{"type":"string","maxLength":40}},"product_url":{"$ref":"#/components/schemas/HttpsUrl","description":"Página do produto, num domínio aprovado da loja. Sem parâmetro de rastreio — o `indica_click` é acrescentado por nós."},"image_urls":{"type":"array","description":"1 a 10 fotos públicas, JPEG/PNG/WebP, mínimo 500 px no menor lado. A primeira é a capa, a foto que o site mostra; é ela que o Indica confere (abre por HTTPS no domínio declarado, tipo e tamanho).","minItems":1,"maxItems":10,"items":{"$ref":"#/components/schemas/HttpsUrl"}},"price_cents":{"type":"integer","minimum":1,"description":"Preço à vista que a pessoa paga hoje, sem cupom."},"original_price_cents":{"type":"integer","minimum":1,"description":"Preço \"de\". Só se foi praticado antes; maior que `price_cents`."},"available":{"type":"boolean"},"stock_quantity":{"type":"integer","minimum":0},"shipping":{"$ref":"#/components/schemas/Shipping"},"installments":{"type":"object","additionalProperties":false,"required":["count","value_cents","interest_free"],"properties":{"count":{"type":"integer","minimum":2,"maximum":24},"value_cents":{"type":"integer","minimum":1},"interest_free":{"type":"boolean"}}},"rating":{"type":"object","additionalProperties":false,"description":"Avaliação sem quantidade não vale.","required":["average","count"],"properties":{"average":{"type":"number","minimum":0,"maximum":5},"count":{"type":"integer","minimum":1}}},"updated_at":{"type":"string","format":"date-time","description":"Quando o dado mudou do seu lado. Envio mais antigo que o último recebido é ignorado."}}},"ProductPatch":{"type":"object","additionalProperties":false,"required":["updated_at"],"minProperties":2,"properties":{"commission":{"$ref":"#/components/schemas/Commission"},"price_cents":{"type":"integer","minimum":1},"original_price_cents":{"type":["integer","null"],"minimum":1,"description":"`null` remove o preço \"de\"."},"available":{"type":"boolean"},"stock_quantity":{"type":"integer","minimum":0},"shipping":{"$ref":"#/components/schemas/Shipping"},"updated_at":{"type":"string","format":"date-time"}}},"ProductState":{"type":"string","description":"`pending` em validação; `accepted` no ar; `rejected` recusado (veja\n`reasons`); `stale` sem atualização há mais de 48 h, fora da busca até\no próximo envio; `removed` apagado.\n","enum":["pending","accepted","rejected","stale","removed"]},"RejectionReason":{"type":"object","description":"`store_not_active` e `domain_not_approved` seguram o produto em\n`pending` até a aprovação do Indica. `image_unreachable` (não abriu,\nHTTP diferente de 200, redirecionou para fora dos domínios da loja),\n`image_type` (não é JPEG, PNG nem WebP) e `image_too_small` (menor\nlado abaixo de 500 px) recusam (`rejected`) até você corrigir a capa.\nPreço muito abaixo das outras ofertas do mesmo produto não muda o\nestado: a régua vale na busca, para todas as lojas (veja \"Regras\").\n","required":["code","message"],"properties":{"code":{"type":"string","enum":["store_not_active","domain_not_approved","image_unreachable","image_too_small","image_type"]},"field":{"type":"string"},"message":{"type":"string"}}},"ProductStatus":{"type":"object","required":["sku","store_id","state","received_at"],"properties":{"commission":{"$ref":"#/components/schemas/Commission"},"commission_source":{"type":["string","null"],"enum":["product","store",null],"description":"Origem da regra efetiva; produto prevalece sobre loja."},"expected_commission_cents":{"type":["integer","null"],"minimum":0,"maximum":9007199254740991,"description":"Estimativa por unidade ao preço atual, sem frete. Não é receita de pedido pago."},"sku":{"$ref":"#/components/schemas/ExternalId"},"store_id":{"$ref":"#/components/schemas/ExternalId"},"state":{"$ref":"#/components/schemas/ProductState"},"ignored_stale":{"type":"boolean","description":"`true` quando o envio tinha `updated_at` mais antigo que o último e foi ignorado."},"reasons":{"type":"array","items":{"$ref":"#/components/schemas/RejectionReason"}},"received_at":{"type":"string","format":"date-time"},"published_at":{"type":["string","null"],"format":"date-time"},"indica_url":{"$ref":"#/components/schemas/HttpsUrl","description":"Onde o produto aparece no Indica, quando aceito."}}},"BatchInput":{"type":"object","additionalProperties":false,"required":["items"],"properties":{"items":{"type":"array","minItems":1,"maxItems":1000,"items":{"oneOf":[{"type":"object","additionalProperties":false,"required":["op","sku","product"],"properties":{"op":{"const":"upsert"},"sku":{"$ref":"#/components/schemas/ExternalId"},"product":{"$ref":"#/components/schemas/ProductInput"}}},{"type":"object","additionalProperties":false,"required":["op","sku"],"properties":{"op":{"const":"delete"},"sku":{"$ref":"#/components/schemas/ExternalId"}}}]}}}},"Job":{"type":"object","required":["job_id","state","totals","created_at"],"properties":{"job_id":{"type":"string"},"state":{"type":"string","enum":["queued","running","done","failed"]},"totals":{"type":"object","required":["received","accepted","rejected","pending"],"properties":{"received":{"type":"integer","minimum":0},"accepted":{"type":"integer","minimum":0},"rejected":{"type":"integer","minimum":0},"pending":{"type":"integer","minimum":0},"removed":{"type":"integer","minimum":0,"description":"Operações delete concluídas; ausente em lotes anteriores a 14/10/2026 equivale a zero."}}},"errors":{"type":"array","items":{"type":"object","required":["index","sku","reasons"],"properties":{"index":{"type":"integer","minimum":0},"sku":{"type":"string"},"reasons":{"type":"array","items":{"$ref":"#/components/schemas/RejectionReason"}}}}},"created_at":{"type":"string","format":"date-time"},"finished_at":{"type":["string","null"],"format":"date-time"}}},"PartnerClick":{"type":"object","required":["click_id","store_id","sku","price_cents","occurred_at"],"properties":{"click_id":{"type":"string"},"store_id":{"$ref":"#/components/schemas/ExternalId"},"sku":{"$ref":"#/components/schemas/ExternalId"},"price_cents":{"type":["integer","null"],"minimum":0},"occurred_at":{"type":"string","format":"date-time"}}},"ClickPage":{"type":"object","required":["data","next_cursor","since","until"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/PartnerClick"}},"next_cursor":{"type":["string","null"]},"since":{"type":"string","format":"date-time"},"until":{"type":"string","format":"date-time"}}},"ConversionStatus":{"type":"string","enum":["paid","refunded","cancelled"]},"ConversionItem":{"type":"object","additionalProperties":false,"required":["sku","quantity","unit_price_cents","refunded_cents"],"properties":{"sku":{"$ref":"#/components/schemas/ExternalId"},"quantity":{"type":"integer","minimum":1,"maximum":10000},"unit_price_cents":{"type":"integer","minimum":0,"maximum":1000000000,"description":"Valor líquido pago por unidade, já com descontos, sem frete."},"refunded_cents":{"type":"integer","minimum":0,"maximum":1000000000000,"description":"Estorno acumulado da linha inteira; até quantity vezes unit_price_cents."}}},"ConversionEvent":{"type":"object","additionalProperties":false,"required":["event_id","order_id","store_id","click_id","status","currency","paid_at","occurred_at","items"],"properties":{"event_id":{"$ref":"#/components/schemas/ExternalId"},"order_id":{"$ref":"#/components/schemas/ExternalId"},"store_id":{"$ref":"#/components/schemas/ExternalId"},"click_id":{"type":"string","pattern":"^ic_[A-Za-z0-9_-]{16,64}$"},"status":{"$ref":"#/components/schemas/ConversionStatus"},"currency":{"type":"string","const":"BRL"},"paid_at":{"type":"string","format":"date-time","description":"Pagamento original; imutável."},"occurred_at":{"type":"string","format":"date-time","description":"Momento do evento. Em paid, igual a paid_at."},"items":{"type":"array","minItems":1,"maxItems":200,"description":"SKUs únicos; total até 1 trilhão de centavos. Repita todos os itens originais nos estornos.","items":{"$ref":"#/components/schemas/ConversionItem"}}}},"CommissionSnapshotItem":{"type":"object","required":["sku","quantity","unit_price_cents","refunded_cents","commission","commission_source","expected_commission_cents"],"properties":{"sku":{"type":"string"},"quantity":{"type":"integer"},"unit_price_cents":{"type":"integer","minimum":0},"refunded_cents":{"type":"integer","minimum":0},"commission":{"$ref":"#/components/schemas/Commission"},"commission_source":{"type":["string","null"],"enum":["product","store",null]},"expected_commission_cents":{"type":["integer","null"],"minimum":0}}},"OrderView":{"type":"object","required":["event_id","order_id","store_id","click_id","status","currency","paid_at","occurred_at","items","gross_cents","refunded_cents","net_cents","expected_commission_cents","known_expected_commission_cents","commission_snapshot_at","recorded_at","updated_at"],"properties":{"event_id":{"type":"string","description":"Último evento aplicado ao saldo."},"order_id":{"type":"string"},"store_id":{"type":"string"},"click_id":{"type":"string"},"status":{"$ref":"#/components/schemas/ConversionStatus"},"currency":{"type":"string","const":"BRL"},"paid_at":{"type":"string","format":"date-time"},"occurred_at":{"type":"string","format":"date-time"},"items":{"type":"array","items":{"$ref":"#/components/schemas/CommissionSnapshotItem"}},"gross_cents":{"type":"integer","minimum":0,"description":"Soma original dos produtos líquidos de desconto e sem frete."},"refunded_cents":{"type":"integer","minimum":0},"net_cents":{"type":"integer","minimum":0},"expected_commission_cents":{"type":["integer","null"],"minimum":0},"known_expected_commission_cents":{"type":"integer","minimum":0,"description":"Subtotal das linhas com regra conhecida."},"commission_snapshot_at":{"type":"string","format":"date-time","description":"Regra do catálogo no primeiro recebimento de paid; não reconstrói termos históricos."},"recorded_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"}}},"ConversionReceipt":{"allOf":[{"$ref":"#/components/schemas/OrderView"},{"type":"object","required":["duplicate","ignored_stale"],"properties":{"duplicate":{"type":"boolean"},"ignored_stale":{"type":"boolean"}}}]},"ConversionPage":{"type":"object","required":["data","next_cursor","since","until"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/OrderView"}},"next_cursor":{"type":["string","null"]},"since":{"type":"string","format":"date-time"},"until":{"type":"string","format":"date-time"}}},"CommercialTotals":{"type":"object","required":["clicks","orders","paid_orders","refunded_orders","cancelled_orders","gross_cents","refunded_cents","net_cents","unknown_commission_orders","known_expected_commission_cents","expected_commission_cents"],"properties":{"clicks":{"type":"integer","minimum":0},"orders":{"type":"integer","minimum":0},"paid_orders":{"type":"integer","minimum":0},"refunded_orders":{"type":"integer","minimum":0},"cancelled_orders":{"type":"integer","minimum":0},"gross_cents":{"type":"integer","minimum":0},"refunded_cents":{"type":"integer","minimum":0},"net_cents":{"type":"integer","minimum":0},"unknown_commission_orders":{"type":"integer","minimum":0},"known_expected_commission_cents":{"type":"integer","minimum":0},"expected_commission_cents":{"type":["integer","null"],"minimum":0}}},"CommissionReport":{"type":"object","required":["since","until","currency","environment","basis","commission_is","totals","stores"],"properties":{"since":{"type":"string","format":"date-time"},"until":{"type":"string","format":"date-time"},"currency":{"type":"string","const":"BRL"},"environment":{"type":"string","enum":["test","live"]},"basis":{"type":"string","const":"paid_at_current_state"},"commission_is":{"type":"string","const":"expected_not_settled"},"totals":{"$ref":"#/components/schemas/CommercialTotals"},"stores":{"type":"array","items":{"allOf":[{"$ref":"#/components/schemas/CommercialTotals"},{"type":"object","required":["store_id"],"properties":{"store_id":{"type":"string"}}}]}}}},"Problem":{"type":"object","description":"RFC 9457.","required":["type","title","status"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"request_id":{"type":"string"},"errors":{"type":"array","items":{"type":"object","required":["field","code","message"],"properties":{"field":{"type":"string","description":"Caminho JSON, ex. `items[3].unit_price_cents`."},"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}