# Visão geral > O que o Autodev Sync faz e como a API funciona. O Autodev Sync acessa o tribunal com o certificado A1 (ou a credencial) da sua Conta e devolve a cópia integral, os dados e os documentos do processo. Tudo por HTTP, em JSON, a partir de: ``` https://sync.lops.com.br/v1 ``` ## Como funciona 1. **Chave** — toda chamada leva a chave da Conta no cabeçalho `Authorization` ([Autenticação](https://docs.sync.lops.com.br/autenticacao/)). 2. **Conexão** — cadastre no cofre o certificado A1 ou a credencial de quem acessa o tribunal ([Cofre](https://docs.sync.lops.com.br/cofre/)). 3. **Execução** — peça a cópia integral, a consulta ou os documentos de um processo ([Execuções](https://docs.sync.lops.com.br/execucoes/)). 4. **Acompanhe** — consulte a execução até ela terminar e baixe os documentos ([Desfechos e pendências](https://docs.sync.lops.com.br/desfechos/)). 5. **Consumo** — veja o que foi cobrado no período e o extrato do mês ([Consumo](https://docs.sync.lops.com.br/consumo/)). Comunicações do Domicílio Judicial Eletrônico têm um pedido próprio, por certificado e sem processo ([Domicílio](https://docs.sync.lops.com.br/domicilio/)). ## Primeira chamada ```bash curl https://sync.lops.com.br/v1/tribunais \ -H "Authorization: Bearer $SYNC_CHAVE" ``` A resposta lista os tribunais e sistemas atendidos hoje, se o acesso é por certificado ou por credencial e se o tribunal pede segundo fator. ## Erros Toda recusa do Sync vem com um código estável em `erro` e um texto para pessoas em `mensagem`: ```json {"detail": {"erro": "cnj_invalido", "mensagem": "número do processo inválido (dígito verificador)"}} ``` Trate pelo `erro`; a `mensagem` pode mudar. Campo com formato errado no corpo volta `422` com a lista dos campos em `detail`. ## Para quem usa IA Cada página tem a versão em Markdown (menu **Markdown**, no topo) e pode ser aberta direto no ChatGPT ou no Claude. O site inteiro está em [`/llms.txt`](https://docs.sync.lops.com.br/llms.txt) (índice) e [`/llms-full.txt`](https://docs.sync.lops.com.br/llms-full.txt) (tudo num arquivo só). --- # Autenticação > Chave da Conta, idempotência e respostas de acesso. Toda chamada leva a **Chave** da Conta no cabeçalho `Authorization`: ``` Authorization: Bearer sync_xxxxxxxx_... ``` - A Chave é mostrada **uma vez**, na criação. Guarde-a como senha: quem tem a Chave age pela Conta. - A Chave vale como administrador da Conta: acessa o cofre, as execuções e o consumo. - Sem Chave ou com Chave inválida → `401`. - Recurso de outra Conta → `404`, como se não existisse. - Usuário do portal sem permissão para a rota → `403 papel_sem_acesso`. ## Idempotência Os pedidos de execução exigem o cabeçalho `Idempotency-Key`. Repetir o pedido com a mesma chave devolve a **mesma** execução, então é seguro reenviar depois de um timeout de rede: ``` Idempotency-Key: pedido-123 ``` Sem o cabeçalho → `422 idempotency_key_obrigatoria`. ## Exemplo ```bash curl https://sync.lops.com.br/v1/execucoes?limite=10 \ -H "Authorization: Bearer $SYNC_CHAVE" ``` | HTTP | Significa | |---|---| | 401 | Chave ausente ou inválida | | 403 | O papel do usuário não acessa esta rota (`papel_sem_acesso`) | | 404 | O recurso não existe nesta Conta | --- # Cofre > Certificado A1, segundo fator e credencial de acesso ao tribunal. O cofre guarda as **Conexões** da Conta: o certificado A1 ou a credencial (usuário e senha) de quem acessa o tribunal. O arquivo, a senha e o segredo do autenticador vão direto para o cofre e **não ficam no Sync**; a API devolve só os metadados (rótulo, titular, validade). ## Certificado A1 ```bash curl -X POST https://sync.lops.com.br/v1/cofre/certificados \ -H "Authorization: Bearer $SYNC_CHAVE" \ -F arquivo=@certificado.pfx -F senha='****' -F rotulo='A1 Dra. Fulana' ``` ```json {"id": "5b1e…", "tipo": "certificado", "rotulo": "A1 Dra. Fulana", "criada_em": "2026-09-26T12:00:00+00:00", "titular": "FULANA DE TAL", "valido_ate": "2027-03-01", "autenticacoes": [], "autenticacoes_recusadas": []} ``` - O `.pfx` é conferido no cadastro: senha, chave privada e validade. - Um certificado ativo por titular: para renovar, revogue o antigo (`DELETE`) e cadastre o novo. Se não revogar antes → `409 titular_ja_cadastrado`. ## Segundo fator (código de 6 dígitos) Tribunal que pede código de autenticação precisa da chave do autenticador (o texto base32 do QR code): ```bash curl -X PUT https://sync.lops.com.br/v1/cofre/certificados/$CERT/autenticacoes \ -H "Authorization: Bearer $SYNC_CHAVE" -H 'Content-Type: application/json' \ -d '{"tribunal": "8.05", "sistema": "PJE", "segredo": "JBSWY3DPEHPK3PXP"}' ``` ```json {"autenticacoes_atualizadas": ["0.00:DOMICILIO", "8.05:PJE", "8.19:PJE"]} ``` No PJe, **o mesmo código vale para todos os tribunais PJe e para o Domicílio Eletrônico**, porque o autenticador é da conta nacional. Por isso uma chave cadastrada atualiza todos eles de uma vez. Quando o tribunal recusa o código, o sistema aparece em `autenticacoes_recusadas` e novos pedidos para ele voltam `409 segundo_fator_invalido` até você cadastrar a chave nova. Para ver o código atual sem abrir o celular: `GET /v1/cofre/certificados/{id}/autenticacoes/{tribunal}/{sistema}/codigo` → `{"codigo": "123456", "expira_em_s": 17}`. ## Credencial (usuário e senha) Para sistemas que entram por usuário e senha (ex.: Projudi da Bahia): ```bash curl -X POST https://sync.lops.com.br/v1/cofre/credenciais \ -H "Authorization: Bearer $SYNC_CHAVE" -H 'Content-Type: application/json' \ -d '{"usuario": "...", "senha": "...", "rotulo": "Projudi BA"}' ``` ## Quais tribunais `GET /v1/tribunais` lista o tribunal (`8.05`), a sigla, o sistema, se o acesso é por `certificado` ou `credencial` e se pede segundo fator. ## Erros do cofre | HTTP | `erro` | O que fazer | |---|---|---| | 409 | `titular_ja_cadastrado` | Revogue o certificado antigo antes de cadastrar o novo | | 413 | `arquivo_grande_demais` | O `.pfx` passa de 1 MB | | 422 | `dados_invalidos` | O cofre recusou o arquivo ou a senha; a `mensagem` diz o motivo | | 404 | `nao_encontrado` | A Conexão não existe nesta Conta (ou foi revogada) | | 502 | `cofre_indisponivel` | O cofre não respondeu agora. Tente de novo em instantes | --- # Execuções > Pedir a cópia integral, a consulta ou os documentos de um processo. Uma **Execução** é um pedido ao tribunal para um Processo: a cópia integral, a consulta dos dados ou os documentos peça a peça. ## Pedir ```bash curl -X POST https://sync.lops.com.br/v1/processos/8187736-02.2026.8.05.0001/execucoes \ -H "Authorization: Bearer $SYNC_CHAVE" -H 'Idempotency-Key: pedido-123' \ -H 'Content-Type: application/json' \ -d '{"ato": "copia_integral", "certificado_id": "5b1e…"}' ``` ```json {"id": "c3f0…", "processo": "8187736-02.2026.8.05.0001", "tribunal": "8.05", "sistema": "PJE", "ato": "copia_integral", "estado": "na_fila", "desfecho": null, "pendencia": null, "documentos": []} ``` | Campo | Regra | |---|---| | `ato` | `copia_integral` (padrão), `consulta` (dados do processo) ou `documentos` (peça a peça) | | `certificado_id` / `credencial_id` | **Obrigatório.** O Sync nunca escolhe a Conexão por você | | `sistema` | Opcional, mesmo em tribunal com mais de um sistema (TJSP: e-SAJ e Eproc; TJPR: Projudi e Eproc). Sem ele, o Sync escolhe (ver abaixo). Informado, o Sync usa só esse | | `analise` | Opcional, só com `copia_integral`: `nano` (fase, partes, valores, prazos, próximos atos), `mini` (+ laudo: histórico, decisões, risco, pendências) ou `pro` (+ teses, pontos de defesa, jurisprudência citada). Vem como o documento `analise.json` | | `Idempotency-Key` | **Obrigatório.** Repetir o pedido com a mesma chave devolve a **mesma** execução | ### Tribunal com mais de um sistema Sem `sistema` no pedido, o Sync escolhe pelo número do processo o sistema onde ele mais provavelmente está, e é esse que a resposta mostra em `sistema`. Se lá o processo não for encontrado, o Sync tenta os outros sistemas do tribunal, em ordem, na **mesma** execução — você acompanha e paga uma execução só. Quando achar em outro sistema, o `sistema` da execução passa a ser aquele onde achou; se nenhum achar, a execução termina com `nao_encontrado` e mostra o primeiro. Com `sistema` informado não há troca: `nao_encontrado` é a resposta daquele sistema. ### Resposta `202` = entrou na fila. `200` com `"de_cache": true` = a sua Conta pediu o mesmo processo há pouco, e o Sync devolve essa execução em vez de ir ao tribunal de novo: - dados do processo: 6 h; - cópia e documentos: 24 h; - execução com pendência: 24 h. ### Recusas antes da fila | HTTP | `erro` | O que fazer | |---|---|---| | 422 | `idempotency_key_obrigatoria` | Envie o cabeçalho `Idempotency-Key` | | 422 | `cnj_invalido` | Número do processo com dígito verificador errado | | 422 | `tribunal_nao_suportado` | Tribunal/sistema ainda não coberto | | 422 | `conexao_obrigatoria` | Informe `certificado_id` ou `credencial_id` | | 422 | `analise_so_com_copia` | `analise` só vale com `ato: copia_integral` | | 404 | `nao_encontrado` | A Conexão informada não existe nesta Conta | | 409 | `certificado_vencido` | Cadastre o certificado novo | | 409 | `segundo_fator_invalido` | O tribunal recusou o código da última vez; cadastre a chave nova em `/autenticacoes` | | 409 | `limite_mensal_atingido` | A Conta chegou ao limite mensal de consumo do contrato | ## Acompanhar Para ver tudo o que a Conta pediu: `GET /v1/execucoes?limite=50&estado=concluida`, mais recentes primeiro; a próxima página vem com `antes=`. `GET /v1/execucoes/{id}` até o `estado` sair de `na_fila`/`em_andamento` (consulte de novo em 15–30 s). O que cada estado, desfecho e pendência significa está em [Desfechos e pendências](https://docs.sync.lops.com.br/desfechos/). ## Baixar os documentos `GET /v1/execucoes/{id}/documentos/{documento_id}` → `{"nome", "url", "expira_em_s": 7200}`. O link vale 2 horas; peça outro se expirar. ## Refazer Se uma entrega veio errada: `POST /v1/execucoes/{id}/refazer`. - **Limites:** uma vez por execução, até 30 dias depois do pedido. - **Cobrança:** a nova execução é cortesia, e o consumo da original é estornado com um ajuste negativo. | HTTP | `erro` | Significa | |---|---|---| | 409 | `execucao_em_andamento` | Só dá para refazer uma execução concluída | | 409 | `cortesia_nao_se_refaz` | Esta execução já é o refazer de outra | | 409 | `prazo_de_refazer_vencido` | Passaram-se mais de 30 dias do pedido | | 409 | `ja_refeita` | Esta execução já foi refeita uma vez | --- # Desfechos e pendências > Estados da execução, desfechos e pendências — e o que é cobrado. `GET /v1/execucoes/{id}` devolve o `estado` da execução. Quando ela termina, `desfecho` diz se deu certo e `pendencia` diz se algo ficou faltando. ## Estado | `estado` | Significa | |---|---| | `na_fila` / `em_andamento` | Ainda trabalhando. Consulte de novo em 15–30 s | | `concluida` | Terminou. Se `desfecho` é `null`, deu certo: `dados` traz capa, envolvidos, movimentações e a lista de peças (ou as comunicações do Domicílio) e os `documentos` estão na resposta | | `com_pendencia` | Terminou com os dados, mas algo ficou faltando (ver `pendencia`) | ## Desfecho Quando não deu certo, `desfecho` diz por quê. Nenhum destes é cobrado. | `desfecho` | Significa | Cobra? | |---|---|---| | `fora_do_ar` | O site do tribunal estava fora do ar | Não. Peça de novo mais tarde | | `segredo_justica` | Processo em segredo, e o titular não tem acesso | Não | | `sem_habilitacao` | O titular não está habilitado no processo | Não | | `nao_encontrado` | O tribunal não achou o processo | Não | | `segundo_fator_invalido` | O tribunal recusou o código de autenticação | Não | | `conta_bloqueada` | O tribunal bloqueou a conta do titular | Não | | `certificado_vencido` | Certificado fora da validade | Não | | `documentos_indisponiveis` | Os autos não têm documentos para baixar | Não | | `peca_fechada` | Peça do Domicílio ainda não liberada para download | Não | | `falha_interna` | Falha nossa | Não | ## Pendência | `pendencia` | Significa | |---|---| | `copia_indisponivel` | Os dados vieram, a cópia não | | `entrega_invalida` | O arquivo não passou na conferência (vazio, corrompido, de outro processo ou com peças faltando). O motivo vem em `conferencia` | | `analise_indisponivel` | A cópia veio, a análise pedida não | Nenhuma pendência é cobrada. Entrega com problema pode ser refeita uma vez, em até 30 dias: `POST /v1/execucoes/{id}/refazer` ([Execuções](https://docs.sync.lops.com.br/execucoes/)). --- # Consumo > Eventos cobrados no período e o extrato do mês. ## Consumo do período `GET /v1/consumo?de=2026-09-01&ate=2026-09-30` → um evento por execução cobrável, com o `valor` da faixa na hora em que concluiu, os `ajustes` (estornos), o `liquido` e o `valor_provisorio`. ```bash curl 'https://sync.lops.com.br/v1/consumo?de=2026-09-01&ate=2026-09-30' \ -H "Authorization: Bearer $SYNC_CHAVE" ``` - Sem `de`/`ate`, vale do dia 1 do mês até hoje. - `"provisorio": true` até o extrato do mês ser aprovado: o extrato recalcula tudo no dia 1 e é ele que vale. - Execução refeita ganha um ajuste negativo (`quantidade: -1`); o evento original nunca muda. ## Extrato do mês `GET /v1/extratos/2026-09` → o extrato do mês (`linhas`, `subtotal`, `complemento_minimo`, `creditos_usados`, `ativacao`, `total`), com `"provisorio": true` até ser aprovado. | HTTP | `erro` | Significa | |---|---|---| | 404 | `sem_extrato` | O mês ainda não foi calculado | | 422 | `mes_invalido` | Mês fora do formato `AAAA-MM` | --- # Domicílio > Comunicações do Domicílio Judicial Eletrônico, por certificado. As comunicações do Domicílio Judicial Eletrônico são pedidas por certificado, sem processo: ```bash curl -X POST https://sync.lops.com.br/v1/cofre/certificados/$CERT/execucoes \ -H "Authorization: Bearer $SYNC_CHAVE" -H 'Idempotency-Key: dje-2026-09-26' \ -H 'Content-Type: application/json' \ -d '{"ato": "listar_comunicacoes", "cnpj": "02812468000106", "desde": "2026-09-19"}' ``` | `ato` | Uso | |---|---| | `listar_comunicacoes` | Lista as comunicações. **Não** abre nenhuma e **não** registra ciência. `cnpj` do perfil é obrigatório | | `baixar_peca` | Baixa a peça de uma comunicação (`id_comunicacao`) | | `verificar_domicilio` | Confere que o acesso funciona | Filtros opcionais de `listar_comunicacoes`: `desde` e `ate` (datas `AAAA-MM-DD`) e `ciente` (`A`, `N` ou `L`). A execução segue o mesmo ciclo das demais: acompanhe por `GET /v1/execucoes/{id}` e, quando concluir, as comunicações vêm em `dados` ([Desfechos e pendências](https://docs.sync.lops.com.br/desfechos/)). | HTTP | `erro` | O que fazer | |---|---|---| | 422 | `idempotency_key_obrigatoria` | Envie o cabeçalho `Idempotency-Key` | | 422 | `cnpj_obrigatorio` | Informe o CNPJ do perfil | | 422 | `id_comunicacao_obrigatorio` | Informe `id_comunicacao` para baixar a peça | | 404 | `nao_encontrado` | O certificado não existe nesta Conta | --- # Listar tribunais `GET /v1/tribunais` Tribunais e sistemas atendidos hoje, com o tipo de acesso (`certificado` ou `credencial`) e se o tribunal pede segundo fator. ## Respostas | HTTP | Significa | |---|---| | 200 | OK | | 422 | Corpo ou parâmetros com formato inválido (`detail` lista os campos) | ### Exemplo de resposta ```json [ { "tribunal": "8.05", "sigla": "TJBA", "nome": "Tribunal de Justiça da Bahia", "sistema": "PJE", "acesso": "certificado", "segundo_fator": true }, { "tribunal": "8.05", "sigla": "TJBA", "nome": "Tribunal de Justiça da Bahia", "sistema": "PROJUDI", "acesso": "credencial", "segundo_fator": false } ] ``` ## Erros Recusas vêm como `{"detail": {"erro": "", "mensagem": "…"}}`. | HTTP | `erro` | Significa | |---|---|---| | 401 | — | Chave ausente ou inválida | ## Exemplos de requisição ### Bash ```bash curl 'https://sync.lops.com.br/v1/tribunais' \ -H "Authorization: Bearer $SYNC_CHAVE" ``` ### JavaScript ```javascript const resposta = await fetch("https://sync.lops.com.br/v1/tribunais", { method: "GET", headers: { Authorization: `Bearer ${process.env.SYNC_CHAVE}`, }, }); console.log(resposta.status, await resposta.json()); ``` ### Python ```python import os import requests resposta = requests.get( "https://sync.lops.com.br/v1/tribunais", headers={"Authorization": f"Bearer {os.environ['SYNC_CHAVE']}"}, ) print(resposta.status_code, resposta.json()) ``` ### PHP ```php 'GET', CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => [ 'Authorization: Bearer ' . getenv('SYNC_CHAVE'), ], ]); $corpo = curl_exec($ch); $status = curl_getinfo($ch, CURLINFO_HTTP_CODE); var_dump($status, json_decode($corpo, true)); ``` --- # Cadastrar certificado `POST /v1/cofre/certificados` Envia o certificado A1 (`.pfx`) e a senha para o cofre. O arquivo e a senha não ficam no Sync: a resposta traz só os metadados. Um certificado ativo por titular — para renovar, revogue o antigo antes. ## Corpo (`multipart/form-data`) | Campo | Tipo | Obrigatório | Descrição | |---|---|---|---| | `arquivo` | arquivo | sim | Arquivo `.pfx` do certificado A1 (até 1 MB) | | `rotulo` | texto | não | Nome para reconhecer o certificado na Conta (padrão `Certificado A1`) | | `senha` | texto | sim | Senha do certificado | ## Respostas | HTTP | Significa | |---|---| | 201 | Criado | | 422 | Corpo ou parâmetros com formato inválido (`detail` lista os campos) | ### Exemplo de resposta ```json { "id": "5b1e7c2a-3f4d-4c8e-9a1b-2d6f0e8c7a15", "tipo": "certificado", "rotulo": "A1 Dra. Fulana", "criada_em": "2026-09-26T12:00:00+00:00", "titular": "FULANA DE TAL", "valido_ate": "2027-03-01", "autenticacoes": [], "autenticacoes_recusadas": [] } ``` ## Erros Recusas vêm como `{"detail": {"erro": "", "mensagem": "…"}}`. | HTTP | `erro` | Significa | |---|---|---| | 401 | — | Chave ausente ou inválida | | 409 | `titular_ja_cadastrado` | Já há certificado ativo deste titular. Revogue o antigo antes | | 413 | `arquivo_grande_demais` | O arquivo passa de 1 MB | | 422 | `dados_invalidos` | O cofre recusou o arquivo ou a senha; a `mensagem` diz o motivo | | 502 | `cofre_indisponivel` | O cofre não respondeu agora. Tente de novo em instantes | ## Exemplos de requisição ### Bash ```bash curl -X POST 'https://sync.lops.com.br/v1/cofre/certificados' \ -H "Authorization: Bearer $SYNC_CHAVE" \ -F arquivo=@certificado.pfx \ -F senha='****' \ -F rotulo='A1 Dra. Fulana' ``` ### JavaScript ```javascript import { readFileSync } from "node:fs"; const form = new FormData(); form.append("arquivo", new Blob([readFileSync("certificado.pfx")]), "certificado.pfx"); form.append("senha", "****"); form.append("rotulo", "A1 Dra. Fulana"); const resposta = await fetch("https://sync.lops.com.br/v1/cofre/certificados", { method: "POST", headers: { Authorization: `Bearer ${process.env.SYNC_CHAVE}`, }, body: form, }); console.log(resposta.status, await resposta.json()); ``` ### Python ```python import os import requests resposta = requests.post( "https://sync.lops.com.br/v1/cofre/certificados", headers={"Authorization": f"Bearer {os.environ['SYNC_CHAVE']}"}, files={"arquivo": open("certificado.pfx", "rb")}, data={ "senha": "****", "rotulo": "A1 Dra. Fulana", }, ) print(resposta.status_code, resposta.json()) ``` ### PHP ```php 'POST', CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => [ 'Authorization: Bearer ' . getenv('SYNC_CHAVE'), ], CURLOPT_POSTFIELDS => [ 'arquivo' => new CURLFile('certificado.pfx'), 'senha' => '****', 'rotulo' => 'A1 Dra. Fulana', ], ]); $corpo = curl_exec($ch); $status = curl_getinfo($ch, CURLINFO_HTTP_CODE); var_dump($status, json_decode($corpo, true)); ``` --- # Listar certificados `GET /v1/cofre/certificados` Certificados ativos da Conta, com os sistemas que já têm segundo fator cadastrado (`autenticacoes`) e os que o tribunal recusou (`autenticacoes_recusadas`). ## Respostas | HTTP | Significa | |---|---| | 200 | OK | | 422 | Corpo ou parâmetros com formato inválido (`detail` lista os campos) | ### Exemplo de resposta ```json [ { "id": "5b1e7c2a-3f4d-4c8e-9a1b-2d6f0e8c7a15", "tipo": "certificado", "rotulo": "A1 Dra. Fulana", "criada_em": "2026-09-26T12:00:00+00:00", "titular": "FULANA DE TAL", "valido_ate": "2027-03-01", "autenticacoes": [ "8.05:PJE" ], "autenticacoes_recusadas": [] } ] ``` ## Erros Recusas vêm como `{"detail": {"erro": "", "mensagem": "…"}}`. | HTTP | `erro` | Significa | |---|---|---| | 401 | — | Chave ausente ou inválida | ## Exemplos de requisição ### Bash ```bash curl 'https://sync.lops.com.br/v1/cofre/certificados' \ -H "Authorization: Bearer $SYNC_CHAVE" ``` ### JavaScript ```javascript const resposta = await fetch("https://sync.lops.com.br/v1/cofre/certificados", { method: "GET", headers: { Authorization: `Bearer ${process.env.SYNC_CHAVE}`, }, }); console.log(resposta.status, await resposta.json()); ``` ### Python ```python import os import requests resposta = requests.get( "https://sync.lops.com.br/v1/cofre/certificados", headers={"Authorization": f"Bearer {os.environ['SYNC_CHAVE']}"}, ) print(resposta.status_code, resposta.json()) ``` ### PHP ```php 'GET', CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => [ 'Authorization: Bearer ' . getenv('SYNC_CHAVE'), ], ]); $corpo = curl_exec($ch); $status = curl_getinfo($ch, CURLINFO_HTTP_CODE); var_dump($status, json_decode($corpo, true)); ``` --- # Revogar certificado `DELETE /v1/cofre/certificados/{certificado_id}` Revoga o certificado e apaga o arquivo do cofre. Execuções já pedidas não mudam. ## Parâmetros | Nome | Onde | Tipo | Obrigatório | Descrição | |---|---|---|---|---| | `certificado_id` | caminho | uuid | sim | Id do certificado | ## Respostas | HTTP | Significa | |---|---| | 204 | Sem conteúdo | | 422 | Corpo ou parâmetros com formato inválido (`detail` lista os campos) | ## Erros Recusas vêm como `{"detail": {"erro": "", "mensagem": "…"}}`. | HTTP | `erro` | Significa | |---|---|---| | 401 | — | Chave ausente ou inválida | | 404 | `nao_encontrado` | A Conexão não existe nesta Conta (ou foi revogada) | | 502 | `cofre_indisponivel` | O cofre não respondeu agora. Tente de novo em instantes | ## Exemplos de requisição ### Bash ```bash curl -X DELETE 'https://sync.lops.com.br/v1/cofre/certificados/5b1e7c2a-3f4d-4c8e-9a1b-2d6f0e8c7a15' \ -H "Authorization: Bearer $SYNC_CHAVE" ``` ### JavaScript ```javascript const resposta = await fetch("https://sync.lops.com.br/v1/cofre/certificados/5b1e7c2a-3f4d-4c8e-9a1b-2d6f0e8c7a15", { method: "DELETE", headers: { Authorization: `Bearer ${process.env.SYNC_CHAVE}`, }, }); console.log(resposta.status); // 204 ``` ### Python ```python import os import requests resposta = requests.delete( "https://sync.lops.com.br/v1/cofre/certificados/5b1e7c2a-3f4d-4c8e-9a1b-2d6f0e8c7a15", headers={"Authorization": f"Bearer {os.environ['SYNC_CHAVE']}"}, ) print(resposta.status_code) # 204 ``` ### PHP ```php 'DELETE', CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => [ 'Authorization: Bearer ' . getenv('SYNC_CHAVE'), ], ]); $corpo = curl_exec($ch); $status = curl_getinfo($ch, CURLINFO_HTTP_CODE); var_dump($status, json_decode($corpo, true)); ``` --- # Gravar segundo fator `PUT /v1/cofre/certificados/{certificado_id}/autenticacoes` Cadastra a chave do autenticador (o texto base32 do QR code) de um tribunal e sistema. No PJe o mesmo código vale para todos os tribunais PJe e para o Domicílio, então uma chave atualiza todos de uma vez — a resposta lista quais. ## Parâmetros | Nome | Onde | Tipo | Obrigatório | Descrição | |---|---|---|---|---| | `certificado_id` | caminho | uuid | sim | Id do certificado | ## Corpo (`application/json`) | Campo | Tipo | Obrigatório | Descrição | |---|---|---|---| | `segredo` | texto | sim | Chave base32 do autenticador | | `sistema` | texto | sim | Sistema do tribunal (ex.: `PJE`) | | `tribunal` | texto | sim | Código do tribunal, como em `/v1/tribunais` (ex.: `8.05`) | ## Respostas | HTTP | Significa | |---|---| | 200 | OK | | 422 | Corpo ou parâmetros com formato inválido (`detail` lista os campos) | ### Exemplo de resposta ```json { "autenticacoes_atualizadas": [ "0.00:DOMICILIO", "8.05:PJE", "8.19:PJE" ] } ``` ## Erros Recusas vêm como `{"detail": {"erro": "", "mensagem": "…"}}`. | HTTP | `erro` | Significa | |---|---|---| | 401 | — | Chave ausente ou inválida | | 404 | `nao_encontrado` | A Conexão não existe nesta Conta (ou foi revogada) | | 422 | `dados_invalidos` | Chave fora do formato base32 ou sistema sem segundo fator | | 502 | `cofre_indisponivel` | O cofre não respondeu agora. Tente de novo em instantes | ## Exemplos de requisição ### Bash ```bash curl -X PUT 'https://sync.lops.com.br/v1/cofre/certificados/5b1e7c2a-3f4d-4c8e-9a1b-2d6f0e8c7a15/autenticacoes' \ -H "Authorization: Bearer $SYNC_CHAVE" \ -H 'Content-Type: application/json' \ -d '{"tribunal":"8.05","sistema":"PJE","segredo":"JBSWY3DPEHPK3PXP"}' ``` ### JavaScript ```javascript const resposta = await fetch("https://sync.lops.com.br/v1/cofre/certificados/5b1e7c2a-3f4d-4c8e-9a1b-2d6f0e8c7a15/autenticacoes", { method: "PUT", headers: { Authorization: `Bearer ${process.env.SYNC_CHAVE}`, "Content-Type": "application/json", }, body: JSON.stringify({ "tribunal": "8.05", "sistema": "PJE", "segredo": "JBSWY3DPEHPK3PXP" }), }); console.log(resposta.status, await resposta.json()); ``` ### Python ```python import os import requests resposta = requests.put( "https://sync.lops.com.br/v1/cofre/certificados/5b1e7c2a-3f4d-4c8e-9a1b-2d6f0e8c7a15/autenticacoes", headers={"Authorization": f"Bearer {os.environ['SYNC_CHAVE']}"}, json={ "tribunal": "8.05", "sistema": "PJE", "segredo": "JBSWY3DPEHPK3PXP", }, ) print(resposta.status_code, resposta.json()) ``` ### PHP ```php 'PUT', CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => [ 'Authorization: Bearer ' . getenv('SYNC_CHAVE'), 'Content-Type: application/json', ], CURLOPT_POSTFIELDS => json_encode([ 'tribunal' => '8.05', 'sistema' => 'PJE', 'segredo' => 'JBSWY3DPEHPK3PXP', ]), ]); $corpo = curl_exec($ch); $status = curl_getinfo($ch, CURLINFO_HTTP_CODE); var_dump($status, json_decode($corpo, true)); ``` --- # Remover segundo fator `DELETE /v1/cofre/certificados/{certificado_id}/autenticacoes/{tribunal}/{sistema}` Apaga a chave do autenticador de um tribunal e sistema. ## Parâmetros | Nome | Onde | Tipo | Obrigatório | Descrição | |---|---|---|---|---| | `certificado_id` | caminho | uuid | sim | Id do certificado | | `tribunal` | caminho | texto | sim | Código do tribunal | | `sistema` | caminho | texto | sim | Sistema do tribunal | ## Respostas | HTTP | Significa | |---|---| | 204 | Sem conteúdo | | 422 | Corpo ou parâmetros com formato inválido (`detail` lista os campos) | ## Erros Recusas vêm como `{"detail": {"erro": "", "mensagem": "…"}}`. | HTTP | `erro` | Significa | |---|---|---| | 401 | — | Chave ausente ou inválida | | 404 | `nao_encontrado` | A Conexão não existe nesta Conta (ou foi revogada) | | 502 | `cofre_indisponivel` | O cofre não respondeu agora. Tente de novo em instantes | ## Exemplos de requisição ### Bash ```bash curl -X DELETE 'https://sync.lops.com.br/v1/cofre/certificados/5b1e7c2a-3f4d-4c8e-9a1b-2d6f0e8c7a15/autenticacoes/8.05/PJE' \ -H "Authorization: Bearer $SYNC_CHAVE" ``` ### JavaScript ```javascript const resposta = await fetch("https://sync.lops.com.br/v1/cofre/certificados/5b1e7c2a-3f4d-4c8e-9a1b-2d6f0e8c7a15/autenticacoes/8.05/PJE", { method: "DELETE", headers: { Authorization: `Bearer ${process.env.SYNC_CHAVE}`, }, }); console.log(resposta.status); // 204 ``` ### Python ```python import os import requests resposta = requests.delete( "https://sync.lops.com.br/v1/cofre/certificados/5b1e7c2a-3f4d-4c8e-9a1b-2d6f0e8c7a15/autenticacoes/8.05/PJE", headers={"Authorization": f"Bearer {os.environ['SYNC_CHAVE']}"}, ) print(resposta.status_code) # 204 ``` ### PHP ```php 'DELETE', CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => [ 'Authorization: Bearer ' . getenv('SYNC_CHAVE'), ], ]); $corpo = curl_exec($ch); $status = curl_getinfo($ch, CURLINFO_HTTP_CODE); var_dump($status, json_decode($corpo, true)); ``` --- # Ver código do segundo fator `GET /v1/cofre/certificados/{certificado_id}/autenticacoes/{tribunal}/{sistema}/codigo` O código de 6 dígitos atual do autenticador, para quem precisa entrar no tribunal sem o celular. Nunca devolve a chave; cada consulta fica na auditoria da Conta. ## Parâmetros | Nome | Onde | Tipo | Obrigatório | Descrição | |---|---|---|---|---| | `certificado_id` | caminho | uuid | sim | Id do certificado | | `tribunal` | caminho | texto | sim | Código do tribunal | | `sistema` | caminho | texto | sim | Sistema do tribunal | ## Respostas | HTTP | Significa | |---|---| | 200 | OK | | 422 | Corpo ou parâmetros com formato inválido (`detail` lista os campos) | ### Exemplo de resposta ```json { "codigo": "123456", "expira_em_s": 17 } ``` ## Erros Recusas vêm como `{"detail": {"erro": "", "mensagem": "…"}}`. | HTTP | `erro` | Significa | |---|---|---| | 401 | — | Chave ausente ou inválida | | 404 | `nao_encontrado` | A Conexão não existe nesta Conta (ou foi revogada) | | 502 | `cofre_indisponivel` | O cofre não respondeu agora. Tente de novo em instantes | ## Exemplos de requisição ### Bash ```bash curl 'https://sync.lops.com.br/v1/cofre/certificados/5b1e7c2a-3f4d-4c8e-9a1b-2d6f0e8c7a15/autenticacoes/8.05/PJE/codigo' \ -H "Authorization: Bearer $SYNC_CHAVE" ``` ### JavaScript ```javascript const resposta = await fetch("https://sync.lops.com.br/v1/cofre/certificados/5b1e7c2a-3f4d-4c8e-9a1b-2d6f0e8c7a15/autenticacoes/8.05/PJE/codigo", { method: "GET", headers: { Authorization: `Bearer ${process.env.SYNC_CHAVE}`, }, }); console.log(resposta.status, await resposta.json()); ``` ### Python ```python import os import requests resposta = requests.get( "https://sync.lops.com.br/v1/cofre/certificados/5b1e7c2a-3f4d-4c8e-9a1b-2d6f0e8c7a15/autenticacoes/8.05/PJE/codigo", headers={"Authorization": f"Bearer {os.environ['SYNC_CHAVE']}"}, ) print(resposta.status_code, resposta.json()) ``` ### PHP ```php 'GET', CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => [ 'Authorization: Bearer ' . getenv('SYNC_CHAVE'), ], ]); $corpo = curl_exec($ch); $status = curl_getinfo($ch, CURLINFO_HTTP_CODE); var_dump($status, json_decode($corpo, true)); ``` --- # Cadastrar credencial `POST /v1/cofre/credenciais` Guarda usuário e senha para sistemas que entram sem certificado (ex.: Projudi da Bahia). ## Corpo (`application/json`) | Campo | Tipo | Obrigatório | Descrição | |---|---|---|---| | `rotulo` | texto | não | Nome para reconhecer a credencial (padrão `Credencial`) | | `senha` | texto | sim | Senha no sistema do tribunal | | `usuario` | texto | sim | Usuário no sistema do tribunal | ## Respostas | HTTP | Significa | |---|---| | 201 | Criado | | 422 | Corpo ou parâmetros com formato inválido (`detail` lista os campos) | ### Exemplo de resposta ```json { "id": "5b1e7c2a-3f4d-4c8e-9a1b-2d6f0e8c7a15", "tipo": "credencial", "rotulo": "Projudi BA", "criada_em": "2026-09-26T12:00:00+00:00" } ``` ## Erros Recusas vêm como `{"detail": {"erro": "", "mensagem": "…"}}`. | HTTP | `erro` | Significa | |---|---|---| | 401 | — | Chave ausente ou inválida | | 422 | `dados_invalidos` | O cofre recusou os dados; a `mensagem` diz o motivo | | 502 | `cofre_indisponivel` | O cofre não respondeu agora. Tente de novo em instantes | ## Exemplos de requisição ### Bash ```bash curl -X POST 'https://sync.lops.com.br/v1/cofre/credenciais' \ -H "Authorization: Bearer $SYNC_CHAVE" \ -H 'Content-Type: application/json' \ -d '{"usuario":"12345678900","senha":"****","rotulo":"Projudi BA"}' ``` ### JavaScript ```javascript const resposta = await fetch("https://sync.lops.com.br/v1/cofre/credenciais", { method: "POST", headers: { Authorization: `Bearer ${process.env.SYNC_CHAVE}`, "Content-Type": "application/json", }, body: JSON.stringify({ "usuario": "12345678900", "senha": "****", "rotulo": "Projudi BA" }), }); console.log(resposta.status, await resposta.json()); ``` ### Python ```python import os import requests resposta = requests.post( "https://sync.lops.com.br/v1/cofre/credenciais", headers={"Authorization": f"Bearer {os.environ['SYNC_CHAVE']}"}, json={ "usuario": "12345678900", "senha": "****", "rotulo": "Projudi BA", }, ) print(resposta.status_code, resposta.json()) ``` ### PHP ```php 'POST', CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => [ 'Authorization: Bearer ' . getenv('SYNC_CHAVE'), 'Content-Type: application/json', ], CURLOPT_POSTFIELDS => json_encode([ 'usuario' => '12345678900', 'senha' => '****', 'rotulo' => 'Projudi BA', ]), ]); $corpo = curl_exec($ch); $status = curl_getinfo($ch, CURLINFO_HTTP_CODE); var_dump($status, json_decode($corpo, true)); ``` --- # Listar credenciais `GET /v1/cofre/credenciais` Credenciais ativas da Conta. A senha nunca volta. ## Respostas | HTTP | Significa | |---|---| | 200 | OK | | 422 | Corpo ou parâmetros com formato inválido (`detail` lista os campos) | ### Exemplo de resposta ```json [ { "id": "5b1e7c2a-3f4d-4c8e-9a1b-2d6f0e8c7a15", "tipo": "credencial", "rotulo": "Projudi BA", "criada_em": "2026-09-26T12:00:00+00:00" } ] ``` ## Erros Recusas vêm como `{"detail": {"erro": "", "mensagem": "…"}}`. | HTTP | `erro` | Significa | |---|---|---| | 401 | — | Chave ausente ou inválida | ## Exemplos de requisição ### Bash ```bash curl 'https://sync.lops.com.br/v1/cofre/credenciais' \ -H "Authorization: Bearer $SYNC_CHAVE" ``` ### JavaScript ```javascript const resposta = await fetch("https://sync.lops.com.br/v1/cofre/credenciais", { method: "GET", headers: { Authorization: `Bearer ${process.env.SYNC_CHAVE}`, }, }); console.log(resposta.status, await resposta.json()); ``` ### Python ```python import os import requests resposta = requests.get( "https://sync.lops.com.br/v1/cofre/credenciais", headers={"Authorization": f"Bearer {os.environ['SYNC_CHAVE']}"}, ) print(resposta.status_code, resposta.json()) ``` ### PHP ```php 'GET', CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => [ 'Authorization: Bearer ' . getenv('SYNC_CHAVE'), ], ]); $corpo = curl_exec($ch); $status = curl_getinfo($ch, CURLINFO_HTTP_CODE); var_dump($status, json_decode($corpo, true)); ``` --- # Revogar credencial `DELETE /v1/cofre/credenciais/{credencial_id}` Revoga a credencial e apaga usuário e senha do cofre. ## Parâmetros | Nome | Onde | Tipo | Obrigatório | Descrição | |---|---|---|---|---| | `credencial_id` | caminho | uuid | sim | Id da credencial | ## Respostas | HTTP | Significa | |---|---| | 204 | Sem conteúdo | | 422 | Corpo ou parâmetros com formato inválido (`detail` lista os campos) | ## Erros Recusas vêm como `{"detail": {"erro": "", "mensagem": "…"}}`. | HTTP | `erro` | Significa | |---|---|---| | 401 | — | Chave ausente ou inválida | | 404 | `nao_encontrado` | A Conexão não existe nesta Conta (ou foi revogada) | | 502 | `cofre_indisponivel` | O cofre não respondeu agora. Tente de novo em instantes | ## Exemplos de requisição ### Bash ```bash curl -X DELETE 'https://sync.lops.com.br/v1/cofre/credenciais/5b1e7c2a-3f4d-4c8e-9a1b-2d6f0e8c7a15' \ -H "Authorization: Bearer $SYNC_CHAVE" ``` ### JavaScript ```javascript const resposta = await fetch("https://sync.lops.com.br/v1/cofre/credenciais/5b1e7c2a-3f4d-4c8e-9a1b-2d6f0e8c7a15", { method: "DELETE", headers: { Authorization: `Bearer ${process.env.SYNC_CHAVE}`, }, }); console.log(resposta.status); // 204 ``` ### Python ```python import os import requests resposta = requests.delete( "https://sync.lops.com.br/v1/cofre/credenciais/5b1e7c2a-3f4d-4c8e-9a1b-2d6f0e8c7a15", headers={"Authorization": f"Bearer {os.environ['SYNC_CHAVE']}"}, ) print(resposta.status_code) # 204 ``` ### PHP ```php 'DELETE', CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => [ 'Authorization: Bearer ' . getenv('SYNC_CHAVE'), ], ]); $corpo = curl_exec($ch); $status = curl_getinfo($ch, CURLINFO_HTTP_CODE); var_dump($status, json_decode($corpo, true)); ``` --- # Pedir execução `POST /v1/processos/{cnj}/execucoes` Pede a cópia integral, a consulta dos dados ou os documentos de um processo. `202` = entrou na fila; `200` com `de_cache: true` = a Conta pediu o mesmo há pouco e recebe aquela execução (dados 6 h, cópia e documentos 24 h). Repetir com a mesma `Idempotency-Key` devolve a mesma execução. ## Parâmetros | Nome | Onde | Tipo | Obrigatório | Descrição | |---|---|---|---|---| | `cnj` | caminho | texto | sim | Número do processo no padrão CNJ (`NNNNNNN-DD.AAAA.J.TR.OOOO`) | | `Idempotency-Key` | cabeçalho | texto | sim | Chave única do pedido. **Obrigatória** | ## Corpo (`application/json`) | Campo | Tipo | Obrigatório | Descrição | |---|---|---|---| | `analise` | `nano` \| `mini` \| `pro` | não | Opcional, só com `copia_integral`: `nano`, `mini` ou `pro`. Vem como o documento `analise.json` | | `ato` | `consulta` \| `copia_integral` \| `documentos` | não | `copia_integral` (padrão), `consulta` (dados do processo) ou `documentos` (peça a peça) (padrão `copia_integral`) | | `certificado_id` | uuid | não | Certificado usado no tribunal. Obrigatório (ou `credencial_id`): o Sync nunca escolhe a Conexão | | `credencial_id` | uuid | não | Credencial, para tribunais com acesso por usuário e senha | | `sistema` | texto | não | Opcional. Sem ele, em tribunal com mais de um sistema, o Sync escolhe e tenta os outros na mesma execução | ## Respostas | HTTP | Significa | |---|---| | 202 | Aceito: entrou na fila | | 422 | Corpo ou parâmetros com formato inválido (`detail` lista os campos) | ### Exemplo de resposta ```json { "id": "c3f0a9d2-7b1e-4f6a-8c2d-5e9b1a0f3d47", "processo": "8187736-02.2026.8.05.0001", "tribunal": "8.05", "sistema": "PJE", "ato": "copia_integral", "estado": "na_fila", "desfecho": null, "pendencia": null, "criada_em": "2026-09-26T12:00:00+00:00", "concluida_em": null, "documentos": [] } ``` ## Erros Recusas vêm como `{"detail": {"erro": "", "mensagem": "…"}}`. | HTTP | `erro` | Significa | |---|---|---| | 401 | — | Chave ausente ou inválida | | 422 | `idempotency_key_obrigatoria` | Envie o cabeçalho Idempotency-Key | | 422 | `cnj_invalido` | Número do processo com dígito verificador errado | | 422 | `tribunal_nao_suportado` | Tribunal/sistema ainda não coberto | | 422 | `conexao_obrigatoria` | Informe `certificado_id` ou `credencial_id` | | 422 | `analise_so_com_copia` | `analise` só vale com `ato: copia_integral` | | 404 | `nao_encontrado` | A Conexão não existe nesta Conta (ou foi revogada) | | 409 | `certificado_vencido` | Cadastre o certificado novo | | 409 | `segundo_fator_invalido` | O tribunal recusou o código da última vez; cadastre a chave nova | | 409 | `limite_mensal_atingido` | A Conta chegou ao limite mensal de consumo do contrato | ## Exemplos de requisição ### Bash ```bash curl -X POST 'https://sync.lops.com.br/v1/processos/8187736-02.2026.8.05.0001/execucoes' \ -H "Authorization: Bearer $SYNC_CHAVE" \ -H 'Idempotency-Key: pedido-123' \ -H 'Content-Type: application/json' \ -d '{"ato":"copia_integral","certificado_id":"5b1e7c2a-3f4d-4c8e-9a1b-2d6f0e8c7a15"}' ``` ### JavaScript ```javascript const resposta = await fetch("https://sync.lops.com.br/v1/processos/8187736-02.2026.8.05.0001/execucoes", { method: "POST", headers: { Authorization: `Bearer ${process.env.SYNC_CHAVE}`, "Idempotency-Key": "pedido-123", "Content-Type": "application/json", }, body: JSON.stringify({ "ato": "copia_integral", "certificado_id": "5b1e7c2a-3f4d-4c8e-9a1b-2d6f0e8c7a15" }), }); console.log(resposta.status, await resposta.json()); ``` ### Python ```python import os import requests resposta = requests.post( "https://sync.lops.com.br/v1/processos/8187736-02.2026.8.05.0001/execucoes", headers={"Authorization": f"Bearer {os.environ['SYNC_CHAVE']}", "Idempotency-Key": "pedido-123"}, json={ "ato": "copia_integral", "certificado_id": "5b1e7c2a-3f4d-4c8e-9a1b-2d6f0e8c7a15", }, ) print(resposta.status_code, resposta.json()) ``` ### PHP ```php 'POST', CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => [ 'Authorization: Bearer ' . getenv('SYNC_CHAVE'), 'Idempotency-Key: pedido-123', 'Content-Type: application/json', ], CURLOPT_POSTFIELDS => json_encode([ 'ato' => 'copia_integral', 'certificado_id' => '5b1e7c2a-3f4d-4c8e-9a1b-2d6f0e8c7a15', ]), ]); $corpo = curl_exec($ch); $status = curl_getinfo($ch, CURLINFO_HTTP_CODE); var_dump($status, json_decode($corpo, true)); ``` --- # Listar execuções `GET /v1/execucoes` Execuções da Conta, mais recentes primeiro, sem os documentos (o detalhe traz). Próxima página: `antes` = `criada_em` da última linha. ## Parâmetros | Nome | Onde | Tipo | Obrigatório | Descrição | |---|---|---|---|---| | `limite` | consulta | inteiro | não | Linhas por página, de 1 a 200 (padrão 50) (mínimo 1; máximo 200; padrão `50`) | | `antes` | consulta | data e hora (ISO 8601) | não | Só execuções criadas antes deste instante (paginação) | | `estado` | consulta | `na_fila` \| `em_andamento` \| `concluida` \| `com_pendencia` | não | `na_fila`, `em_andamento`, `concluida` ou `com_pendencia` | ## Respostas | HTTP | Significa | |---|---| | 200 | OK | | 422 | Corpo ou parâmetros com formato inválido (`detail` lista os campos) | ### Exemplo de resposta ```json [ { "id": "c3f0a9d2-7b1e-4f6a-8c2d-5e9b1a0f3d47", "processo": "8187736-02.2026.8.05.0001", "tribunal": "8.05", "sistema": "PJE", "ato": "copia_integral", "estado": "concluida", "desfecho": null, "pendencia": null, "criada_em": "2026-09-26T12:00:00+00:00", "concluida_em": "2026-09-26T12:03:41+00:00" } ] ``` ## Erros Recusas vêm como `{"detail": {"erro": "", "mensagem": "…"}}`. | HTTP | `erro` | Significa | |---|---|---| | 401 | — | Chave ausente ou inválida | ## Exemplos de requisição ### Bash ```bash curl 'https://sync.lops.com.br/v1/execucoes?limite=50&estado=concluida' \ -H "Authorization: Bearer $SYNC_CHAVE" ``` ### JavaScript ```javascript const resposta = await fetch("https://sync.lops.com.br/v1/execucoes?limite=50&estado=concluida", { method: "GET", headers: { Authorization: `Bearer ${process.env.SYNC_CHAVE}`, }, }); console.log(resposta.status, await resposta.json()); ``` ### Python ```python import os import requests resposta = requests.get( "https://sync.lops.com.br/v1/execucoes?limite=50&estado=concluida", headers={"Authorization": f"Bearer {os.environ['SYNC_CHAVE']}"}, ) print(resposta.status_code, resposta.json()) ``` ### PHP ```php 'GET', CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => [ 'Authorization: Bearer ' . getenv('SYNC_CHAVE'), ], ]); $corpo = curl_exec($ch); $status = curl_getinfo($ch, CURLINFO_HTTP_CODE); var_dump($status, json_decode($corpo, true)); ``` --- # Ver execução `GET /v1/execucoes/{execucao_id}` Estado, desfecho, pendência, dados e documentos da execução. Consulte a cada 15–30 s até o `estado` sair de `na_fila`/`em_andamento`. ## Parâmetros | Nome | Onde | Tipo | Obrigatório | Descrição | |---|---|---|---|---| | `execucao_id` | caminho | uuid | sim | Id da execução | ## Respostas | HTTP | Significa | |---|---| | 200 | OK | | 422 | Corpo ou parâmetros com formato inválido (`detail` lista os campos) | ### Exemplo de resposta ```json { "id": "c3f0a9d2-7b1e-4f6a-8c2d-5e9b1a0f3d47", "processo": "8187736-02.2026.8.05.0001", "tribunal": "8.05", "sistema": "PJE", "ato": "copia_integral", "estado": "concluida", "desfecho": null, "pendencia": null, "criada_em": "2026-09-26T12:00:00+00:00", "concluida_em": "2026-09-26T12:03:41+00:00", "documentos": [ { "id": "9a7c1e44-2b3d-4f5e-8a6b-0c1d2e3f4a5b", "nome": "copia-integral.pdf", "tamanho_bytes": 4812345 } ], "dados": { "capa": { "classe": "Procedimento Comum Cível" }, "envolvidos": [], "movimentacoes": [] } } ``` ## Erros Recusas vêm como `{"detail": {"erro": "", "mensagem": "…"}}`. | HTTP | `erro` | Significa | |---|---|---| | 401 | — | Chave ausente ou inválida | | 404 | `nao_encontrado` | A execução não existe nesta Conta | ## Exemplos de requisição ### Bash ```bash curl 'https://sync.lops.com.br/v1/execucoes/c3f0a9d2-7b1e-4f6a-8c2d-5e9b1a0f3d47' \ -H "Authorization: Bearer $SYNC_CHAVE" ``` ### JavaScript ```javascript const resposta = await fetch("https://sync.lops.com.br/v1/execucoes/c3f0a9d2-7b1e-4f6a-8c2d-5e9b1a0f3d47", { method: "GET", headers: { Authorization: `Bearer ${process.env.SYNC_CHAVE}`, }, }); console.log(resposta.status, await resposta.json()); ``` ### Python ```python import os import requests resposta = requests.get( "https://sync.lops.com.br/v1/execucoes/c3f0a9d2-7b1e-4f6a-8c2d-5e9b1a0f3d47", headers={"Authorization": f"Bearer {os.environ['SYNC_CHAVE']}"}, ) print(resposta.status_code, resposta.json()) ``` ### PHP ```php 'GET', CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => [ 'Authorization: Bearer ' . getenv('SYNC_CHAVE'), ], ]); $corpo = curl_exec($ch); $status = curl_getinfo($ch, CURLINFO_HTTP_CODE); var_dump($status, json_decode($corpo, true)); ``` --- # Refazer execução `POST /v1/execucoes/{execucao_id}/refazer` Refaz uma execução que entregou errado: uma vez por execução, até 30 dias depois do pedido. A nova é cortesia e o consumo da original é estornado com um ajuste negativo. ## Parâmetros | Nome | Onde | Tipo | Obrigatório | Descrição | |---|---|---|---|---| | `execucao_id` | caminho | uuid | sim | Id da execução a refazer | ## Respostas | HTTP | Significa | |---|---| | 202 | Aceito: entrou na fila | | 422 | Corpo ou parâmetros com formato inválido (`detail` lista os campos) | ### Exemplo de resposta ```json { "id": "e81b2f60-4c3d-4a9e-b1f7-6d5c4b3a2918", "processo": "8187736-02.2026.8.05.0001", "tribunal": "8.05", "sistema": "PJE", "ato": "copia_integral", "estado": "na_fila", "desfecho": null, "pendencia": null, "criada_em": "2026-09-26T12:00:00+00:00", "concluida_em": null, "documentos": [], "refazer_de": "c3f0a9d2-7b1e-4f6a-8c2d-5e9b1a0f3d47" } ``` ## Erros Recusas vêm como `{"detail": {"erro": "", "mensagem": "…"}}`. | HTTP | `erro` | Significa | |---|---|---| | 401 | — | Chave ausente ou inválida | | 404 | `nao_encontrado` | A execução não existe nesta Conta | | 409 | `execucao_em_andamento` | Só dá para refazer uma execução concluída | | 409 | `cortesia_nao_se_refaz` | Esta execução já é o refazer de outra | | 409 | `prazo_de_refazer_vencido` | Passaram-se mais de 30 dias do pedido | | 409 | `ja_refeita` | Esta execução já foi refeita uma vez | ## Exemplos de requisição ### Bash ```bash curl -X POST 'https://sync.lops.com.br/v1/execucoes/c3f0a9d2-7b1e-4f6a-8c2d-5e9b1a0f3d47/refazer' \ -H "Authorization: Bearer $SYNC_CHAVE" ``` ### JavaScript ```javascript const resposta = await fetch("https://sync.lops.com.br/v1/execucoes/c3f0a9d2-7b1e-4f6a-8c2d-5e9b1a0f3d47/refazer", { method: "POST", headers: { Authorization: `Bearer ${process.env.SYNC_CHAVE}`, }, }); console.log(resposta.status, await resposta.json()); ``` ### Python ```python import os import requests resposta = requests.post( "https://sync.lops.com.br/v1/execucoes/c3f0a9d2-7b1e-4f6a-8c2d-5e9b1a0f3d47/refazer", headers={"Authorization": f"Bearer {os.environ['SYNC_CHAVE']}"}, ) print(resposta.status_code, resposta.json()) ``` ### PHP ```php 'POST', CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => [ 'Authorization: Bearer ' . getenv('SYNC_CHAVE'), ], ]); $corpo = curl_exec($ch); $status = curl_getinfo($ch, CURLINFO_HTTP_CODE); var_dump($status, json_decode($corpo, true)); ``` --- # Baixar documento `GET /v1/execucoes/{execucao_id}/documentos/{documento_id}` Link temporário para baixar um documento da execução. O link vale 2 horas; peça outro se expirar. ## Parâmetros | Nome | Onde | Tipo | Obrigatório | Descrição | |---|---|---|---|---| | `execucao_id` | caminho | uuid | sim | Id da execução | | `documento_id` | caminho | uuid | sim | Id do documento, como em `documentos` da execução | ## Respostas | HTTP | Significa | |---|---| | 200 | OK | | 422 | Corpo ou parâmetros com formato inválido (`detail` lista os campos) | ### Exemplo de resposta ```json { "nome": "copia-integral.pdf", "url": "https://…", "expira_em_s": 7200 } ``` ## Erros Recusas vêm como `{"detail": {"erro": "", "mensagem": "…"}}`. | HTTP | `erro` | Significa | |---|---|---| | 401 | — | Chave ausente ou inválida | | 404 | `nao_encontrado` | A execução ou o documento não existe nesta Conta | ## Exemplos de requisição ### Bash ```bash curl 'https://sync.lops.com.br/v1/execucoes/c3f0a9d2-7b1e-4f6a-8c2d-5e9b1a0f3d47/documentos/9a7c1e44-2b3d-4f5e-8a6b-0c1d2e3f4a5b' \ -H "Authorization: Bearer $SYNC_CHAVE" ``` ### JavaScript ```javascript const resposta = await fetch("https://sync.lops.com.br/v1/execucoes/c3f0a9d2-7b1e-4f6a-8c2d-5e9b1a0f3d47/documentos/9a7c1e44-2b3d-4f5e-8a6b-0c1d2e3f4a5b", { method: "GET", headers: { Authorization: `Bearer ${process.env.SYNC_CHAVE}`, }, }); console.log(resposta.status, await resposta.json()); ``` ### Python ```python import os import requests resposta = requests.get( "https://sync.lops.com.br/v1/execucoes/c3f0a9d2-7b1e-4f6a-8c2d-5e9b1a0f3d47/documentos/9a7c1e44-2b3d-4f5e-8a6b-0c1d2e3f4a5b", headers={"Authorization": f"Bearer {os.environ['SYNC_CHAVE']}"}, ) print(resposta.status_code, resposta.json()) ``` ### PHP ```php 'GET', CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => [ 'Authorization: Bearer ' . getenv('SYNC_CHAVE'), ], ]); $corpo = curl_exec($ch); $status = curl_getinfo($ch, CURLINFO_HTTP_CODE); var_dump($status, json_decode($corpo, true)); ``` --- # Pedir execução no Domicílio `POST /v1/cofre/certificados/{certificado_id}/execucoes` Execução no Domicílio Judicial Eletrônico, por certificado e sem processo. `listar_comunicacoes` não abre nenhuma comunicação e não registra ciência. ## Parâmetros | Nome | Onde | Tipo | Obrigatório | Descrição | |---|---|---|---|---| | `certificado_id` | caminho | uuid | sim | Id do certificado | | `Idempotency-Key` | cabeçalho | texto | sim | Chave única do pedido. **Obrigatória** | ## Corpo (`application/json`) | Campo | Tipo | Obrigatório | Descrição | |---|---|---|---| | `ate` | data (AAAA-MM-DD) | não | Comunicações até esta data | | `ato` | `listar_comunicacoes` \| `baixar_peca` \| `verificar_domicilio` | não | `listar_comunicacoes` (padrão), `baixar_peca` ou `verificar_domicilio` (padrão `listar_comunicacoes`) | | `ciente` | `A` \| `N` \| `L` | não | Filtro de ciência: `A`, `N` ou `L` | | `cnpj` | texto | não | CNPJ do perfil. Obrigatório em `listar_comunicacoes` | | `desde` | data (AAAA-MM-DD) | não | Comunicações a partir desta data | | `id_comunicacao` | texto | não | Comunicação da peça. Obrigatório em `baixar_peca` | ## Respostas | HTTP | Significa | |---|---| | 202 | Aceito: entrou na fila | | 422 | Corpo ou parâmetros com formato inválido (`detail` lista os campos) | ### Exemplo de resposta ```json { "id": "c3f0a9d2-7b1e-4f6a-8c2d-5e9b1a0f3d47", "processo": null, "tribunal": "0.00", "sistema": "DOMICILIO", "ato": "listar_comunicacoes", "estado": "na_fila", "desfecho": null, "pendencia": null, "criada_em": "2026-09-26T12:00:00+00:00", "concluida_em": null, "documentos": [] } ``` ## Erros Recusas vêm como `{"detail": {"erro": "", "mensagem": "…"}}`. | HTTP | `erro` | Significa | |---|---|---| | 401 | — | Chave ausente ou inválida | | 422 | `idempotency_key_obrigatoria` | Envie o cabeçalho Idempotency-Key | | 422 | `cnpj_obrigatorio` | Informe o CNPJ do perfil | | 422 | `id_comunicacao_obrigatorio` | Informe `id_comunicacao` para baixar a peça | | 404 | `nao_encontrado` | A Conexão não existe nesta Conta (ou foi revogada) | | 409 | `limite_mensal_atingido` | A Conta chegou ao limite mensal de consumo do contrato | ## Exemplos de requisição ### Bash ```bash curl -X POST 'https://sync.lops.com.br/v1/cofre/certificados/5b1e7c2a-3f4d-4c8e-9a1b-2d6f0e8c7a15/execucoes' \ -H "Authorization: Bearer $SYNC_CHAVE" \ -H 'Idempotency-Key: pedido-123' \ -H 'Content-Type: application/json' \ -d '{"ato":"listar_comunicacoes","cnpj":"02812468000106","desde":"2026-09-19"}' ``` ### JavaScript ```javascript const resposta = await fetch("https://sync.lops.com.br/v1/cofre/certificados/5b1e7c2a-3f4d-4c8e-9a1b-2d6f0e8c7a15/execucoes", { method: "POST", headers: { Authorization: `Bearer ${process.env.SYNC_CHAVE}`, "Idempotency-Key": "pedido-123", "Content-Type": "application/json", }, body: JSON.stringify({ "ato": "listar_comunicacoes", "cnpj": "02812468000106", "desde": "2026-09-19" }), }); console.log(resposta.status, await resposta.json()); ``` ### Python ```python import os import requests resposta = requests.post( "https://sync.lops.com.br/v1/cofre/certificados/5b1e7c2a-3f4d-4c8e-9a1b-2d6f0e8c7a15/execucoes", headers={"Authorization": f"Bearer {os.environ['SYNC_CHAVE']}", "Idempotency-Key": "pedido-123"}, json={ "ato": "listar_comunicacoes", "cnpj": "02812468000106", "desde": "2026-09-19", }, ) print(resposta.status_code, resposta.json()) ``` ### PHP ```php 'POST', CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => [ 'Authorization: Bearer ' . getenv('SYNC_CHAVE'), 'Idempotency-Key: pedido-123', 'Content-Type: application/json', ], CURLOPT_POSTFIELDS => json_encode([ 'ato' => 'listar_comunicacoes', 'cnpj' => '02812468000106', 'desde' => '2026-09-19', ]), ]); $corpo = curl_exec($ch); $status = curl_getinfo($ch, CURLINFO_HTTP_CODE); var_dump($status, json_decode($corpo, true)); ``` --- # Ver consumo `GET /v1/consumo` Um evento por execução cobrável no período, com o valor da faixa, os ajustes (estornos), o líquido e o valor provisório. `provisorio: true` até o extrato do mês ser aprovado: é o extrato que vale. ## Parâmetros | Nome | Onde | Tipo | Obrigatório | Descrição | |---|---|---|---|---| | `de` | consulta | data (AAAA-MM-DD) | não | Início do período (padrão: dia 1 do mês) | | `ate` | consulta | data (AAAA-MM-DD) | não | Fim do período (padrão: hoje) | ## Respostas | HTTP | Significa | |---|---| | 200 | OK | | 422 | Corpo ou parâmetros com formato inválido (`detail` lista os campos) | ### Exemplo de resposta ```json { "de": "2026-09-01", "ate": "2026-09-30", "provisorio": true, "valor_provisorio": "12.50", "total": 1, "por_ato": { "copia_integral": 1 }, "eventos": [ { "execucao_id": "c3f0a9d2-7b1e-4f6a-8c2d-5e9b1a0f3d47", "ato": "copia_integral", "tribunal": "8.05", "sistema": "PJE", "paginas": 212, "cortesia": false, "valor": "12.50", "em": "2026-09-26T12:03:41+00:00" } ], "ajustes": [], "liquido": 1 } ``` ## Erros Recusas vêm como `{"detail": {"erro": "", "mensagem": "…"}}`. | HTTP | `erro` | Significa | |---|---|---| | 401 | — | Chave ausente ou inválida | ## Exemplos de requisição ### Bash ```bash curl 'https://sync.lops.com.br/v1/consumo?de=2026-09-01&ate=2026-09-30' \ -H "Authorization: Bearer $SYNC_CHAVE" ``` ### JavaScript ```javascript const resposta = await fetch("https://sync.lops.com.br/v1/consumo?de=2026-09-01&ate=2026-09-30", { method: "GET", headers: { Authorization: `Bearer ${process.env.SYNC_CHAVE}`, }, }); console.log(resposta.status, await resposta.json()); ``` ### Python ```python import os import requests resposta = requests.get( "https://sync.lops.com.br/v1/consumo?de=2026-09-01&ate=2026-09-30", headers={"Authorization": f"Bearer {os.environ['SYNC_CHAVE']}"}, ) print(resposta.status_code, resposta.json()) ``` ### PHP ```php 'GET', CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => [ 'Authorization: Bearer ' . getenv('SYNC_CHAVE'), ], ]); $corpo = curl_exec($ch); $status = curl_getinfo($ch, CURLINFO_HTTP_CODE); var_dump($status, json_decode($corpo, true)); ``` --- # Ver extrato do mês `GET /v1/extratos/{mes}` Extrato da Conta no mês. Provisório até ser aprovado: enquanto isso, é recalculado. ## Parâmetros | Nome | Onde | Tipo | Obrigatório | Descrição | |---|---|---|---|---| | `mes` | caminho | texto | sim | Mês no formato `AAAA-MM` | ## Respostas | HTTP | Significa | |---|---| | 200 | OK | | 422 | Corpo ou parâmetros com formato inválido (`detail` lista os campos) | ### Exemplo de resposta ```json { "mes": "2026-09", "estado": "aprovado", "provisorio": false, "linhas": [], "subtotal": "0.00", "complemento_minimo": "0.00", "creditos_usados": "0.00", "ativacao": "0.00", "total": "0.00" } ``` ## Erros Recusas vêm como `{"detail": {"erro": "", "mensagem": "…"}}`. | HTTP | `erro` | Significa | |---|---|---| | 401 | — | Chave ausente ou inválida | | 404 | `sem_extrato` | O mês ainda não foi calculado | | 422 | `mes_invalido` | Mês fora do formato `AAAA-MM` | ## Exemplos de requisição ### Bash ```bash curl 'https://sync.lops.com.br/v1/extratos/2026-09' \ -H "Authorization: Bearer $SYNC_CHAVE" ``` ### JavaScript ```javascript const resposta = await fetch("https://sync.lops.com.br/v1/extratos/2026-09", { method: "GET", headers: { Authorization: `Bearer ${process.env.SYNC_CHAVE}`, }, }); console.log(resposta.status, await resposta.json()); ``` ### Python ```python import os import requests resposta = requests.get( "https://sync.lops.com.br/v1/extratos/2026-09", headers={"Authorization": f"Bearer {os.environ['SYNC_CHAVE']}"}, ) print(resposta.status_code, resposta.json()) ``` ### PHP ```php 'GET', CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => [ 'Authorization: Bearer ' . getenv('SYNC_CHAVE'), ], ]); $corpo = curl_exec($ch); $status = curl_getinfo($ch, CURLINFO_HTTP_CODE); var_dump($status, json_decode($corpo, true)); ``` --- # Entrar `POST /v1/sessao` Login de pessoa no portal com e-mail, senha e código do autenticador; a sessão volta em cookie. Integrações usam a Chave, não esta rota. ## Corpo (`application/json`) | Campo | Tipo | Obrigatório | Descrição | |---|---|---|---| | `codigo` | texto | não | Código de 6 dígitos do autenticador | | `email` | texto | sim | E-mail do usuário | | `senha` | texto | sim | Senha | ## Respostas | HTTP | Significa | |---|---| | 200 | OK | | 422 | Corpo ou parâmetros com formato inválido (`detail` lista os campos) | ### Exemplo de resposta ```json { "id": "7d6c5b4a-3928-4f1e-9d0c-b1a2f3e4d5c6", "conta_id": "0f1e2d3c-4b5a-6978-8a9b-0c1d2e3f4a5b", "email": "fulano@escritorio.com.br", "nome": "Fulano de Tal", "papel": "operador" } ``` ## Erros Recusas vêm como `{"detail": {"erro": "", "mensagem": "…"}}`. | HTTP | `erro` | Significa | |---|---|---| | 401 | — | Chave ausente ou inválida | | 401 | `credenciais_invalidas` | E-mail ou senha incorretos | | 401 | `segundo_fator_obrigatorio` | Informe o código do autenticador | | 409 | `cadastrar_segundo_fator` | Primeiro acesso: cadastre o autenticador com o endereço devolvido | | 429 | `login_bloqueado` | Muitas tentativas; tente de novo em alguns minutos | ## Exemplos de requisição ### Bash ```bash curl -X POST 'https://sync.lops.com.br/v1/sessao' \ -H "Authorization: Bearer $SYNC_CHAVE" \ -H 'Content-Type: application/json' \ -d '{"email":"fulana@escritorio.com.br","senha":"****","codigo":"123456"}' ``` ### JavaScript ```javascript const resposta = await fetch("https://sync.lops.com.br/v1/sessao", { method: "POST", headers: { Authorization: `Bearer ${process.env.SYNC_CHAVE}`, "Content-Type": "application/json", }, body: JSON.stringify({ "email": "fulana@escritorio.com.br", "senha": "****", "codigo": "123456" }), }); console.log(resposta.status, await resposta.json()); ``` ### Python ```python import os import requests resposta = requests.post( "https://sync.lops.com.br/v1/sessao", headers={"Authorization": f"Bearer {os.environ['SYNC_CHAVE']}"}, json={ "email": "fulana@escritorio.com.br", "senha": "****", "codigo": "123456", }, ) print(resposta.status_code, resposta.json()) ``` ### PHP ```php 'POST', CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => [ 'Authorization: Bearer ' . getenv('SYNC_CHAVE'), 'Content-Type: application/json', ], CURLOPT_POSTFIELDS => json_encode([ 'email' => 'fulana@escritorio.com.br', 'senha' => '****', 'codigo' => '123456', ]), ]); $corpo = curl_exec($ch); $status = curl_getinfo($ch, CURLINFO_HTTP_CODE); var_dump($status, json_decode($corpo, true)); ``` --- # Ver sessão `GET /v1/sessao` Quem está chamando: a Conta, o papel e, para pessoas, o usuário. Com a Chave, `via` é `chave`. ## Respostas | HTTP | Significa | |---|---| | 200 | OK | | 422 | Corpo ou parâmetros com formato inválido (`detail` lista os campos) | ### Exemplo de resposta ```json { "conta_id": "0f1e2d3c-4b5a-6978-8a9b-0c1d2e3f4a5b", "papel": "administrador", "via": "chave" } ``` ## Erros Recusas vêm como `{"detail": {"erro": "", "mensagem": "…"}}`. | HTTP | `erro` | Significa | |---|---|---| | 401 | — | Chave ausente ou inválida | ## Exemplos de requisição ### Bash ```bash curl 'https://sync.lops.com.br/v1/sessao' \ -H "Authorization: Bearer $SYNC_CHAVE" ``` ### JavaScript ```javascript const resposta = await fetch("https://sync.lops.com.br/v1/sessao", { method: "GET", headers: { Authorization: `Bearer ${process.env.SYNC_CHAVE}`, }, }); console.log(resposta.status, await resposta.json()); ``` ### Python ```python import os import requests resposta = requests.get( "https://sync.lops.com.br/v1/sessao", headers={"Authorization": f"Bearer {os.environ['SYNC_CHAVE']}"}, ) print(resposta.status_code, resposta.json()) ``` ### PHP ```php 'GET', CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => [ 'Authorization: Bearer ' . getenv('SYNC_CHAVE'), ], ]); $corpo = curl_exec($ch); $status = curl_getinfo($ch, CURLINFO_HTTP_CODE); var_dump($status, json_decode($corpo, true)); ``` --- # Sair `DELETE /v1/sessao` Encerra a sessão do portal e apaga o cookie. ## Respostas | HTTP | Significa | |---|---| | 204 | Sem conteúdo | ## Erros Recusas vêm como `{"detail": {"erro": "", "mensagem": "…"}}`. | HTTP | `erro` | Significa | |---|---|---| | 401 | — | Chave ausente ou inválida | ## Exemplos de requisição ### Bash ```bash curl -X DELETE 'https://sync.lops.com.br/v1/sessao' \ -H "Authorization: Bearer $SYNC_CHAVE" ``` ### JavaScript ```javascript const resposta = await fetch("https://sync.lops.com.br/v1/sessao", { method: "DELETE", headers: { Authorization: `Bearer ${process.env.SYNC_CHAVE}`, }, }); console.log(resposta.status); // 204 ``` ### Python ```python import os import requests resposta = requests.delete( "https://sync.lops.com.br/v1/sessao", headers={"Authorization": f"Bearer {os.environ['SYNC_CHAVE']}"}, ) print(resposta.status_code) # 204 ``` ### PHP ```php 'DELETE', CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => [ 'Authorization: Bearer ' . getenv('SYNC_CHAVE'), ], ]); $corpo = curl_exec($ch); $status = curl_getinfo($ch, CURLINFO_HTTP_CODE); var_dump($status, json_decode($corpo, true)); ``` --- # Trocar senha `PUT /v1/sessao/senha` Troca a senha do usuário da sessão. A nova precisa de pelo menos 12 caracteres. ## Corpo (`application/json`) | Campo | Tipo | Obrigatório | Descrição | |---|---|---|---| | `atual` | texto | sim | Senha atual | | `nova` | texto | sim | Senha nova, com pelo menos 12 caracteres (pelo menos 12 caracteres) | ## Respostas | HTTP | Significa | |---|---| | 204 | Sem conteúdo | | 422 | Corpo ou parâmetros com formato inválido (`detail` lista os campos) | ## Erros Recusas vêm como `{"detail": {"erro": "", "mensagem": "…"}}`. | HTTP | `erro` | Significa | |---|---|---| | 401 | — | Chave ausente ou inválida | | 401 | `credenciais_invalidas` | Senha atual incorreta | ## Exemplos de requisição ### Bash ```bash curl -X PUT 'https://sync.lops.com.br/v1/sessao/senha' \ -H "Authorization: Bearer $SYNC_CHAVE" \ -H 'Content-Type: application/json' \ -d '{"atual":"****","nova":"uma frase longa e só sua"}' ``` ### JavaScript ```javascript const resposta = await fetch("https://sync.lops.com.br/v1/sessao/senha", { method: "PUT", headers: { Authorization: `Bearer ${process.env.SYNC_CHAVE}`, "Content-Type": "application/json", }, body: JSON.stringify({ "atual": "****", "nova": "uma frase longa e só sua" }), }); console.log(resposta.status); // 204 ``` ### Python ```python import os import requests resposta = requests.put( "https://sync.lops.com.br/v1/sessao/senha", headers={"Authorization": f"Bearer {os.environ['SYNC_CHAVE']}"}, json={ "atual": "****", "nova": "uma frase longa e só sua", }, ) print(resposta.status_code) # 204 ``` ### PHP ```php 'PUT', CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => [ 'Authorization: Bearer ' . getenv('SYNC_CHAVE'), 'Content-Type: application/json', ], CURLOPT_POSTFIELDS => json_encode([ 'atual' => '****', 'nova' => 'uma frase longa e só sua', ]), ]); $corpo = curl_exec($ch); $status = curl_getinfo($ch, CURLINFO_HTTP_CODE); var_dump($status, json_decode($corpo, true)); ``` --- # Listar usuários `GET /v1/usuarios` Usuários da Conta, com papel (`administrador`, `operador` ou `financeiro`) e se estão ativos. Só administrador. ## Respostas | HTTP | Significa | |---|---| | 200 | OK | | 422 | Corpo ou parâmetros com formato inválido (`detail` lista os campos) | ### Exemplo de resposta ```json [ { "id": "7d6c5b4a-3928-4f1e-9d0c-b1a2f3e4d5c6", "conta_id": "0f1e2d3c-4b5a-6978-8a9b-0c1d2e3f4a5b", "email": "fulano@escritorio.com.br", "nome": "Fulano de Tal", "papel": "operador", "ativo": true } ] ``` ## Erros Recusas vêm como `{"detail": {"erro": "", "mensagem": "…"}}`. | HTTP | `erro` | Significa | |---|---|---| | 401 | — | Chave ausente ou inválida | ## Exemplos de requisição ### Bash ```bash curl 'https://sync.lops.com.br/v1/usuarios' \ -H "Authorization: Bearer $SYNC_CHAVE" ``` ### JavaScript ```javascript const resposta = await fetch("https://sync.lops.com.br/v1/usuarios", { method: "GET", headers: { Authorization: `Bearer ${process.env.SYNC_CHAVE}`, }, }); console.log(resposta.status, await resposta.json()); ``` ### Python ```python import os import requests resposta = requests.get( "https://sync.lops.com.br/v1/usuarios", headers={"Authorization": f"Bearer {os.environ['SYNC_CHAVE']}"}, ) print(resposta.status_code, resposta.json()) ``` ### PHP ```php 'GET', CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => [ 'Authorization: Bearer ' . getenv('SYNC_CHAVE'), ], ]); $corpo = curl_exec($ch); $status = curl_getinfo($ch, CURLINFO_HTTP_CODE); var_dump($status, json_decode($corpo, true)); ``` --- # Criar usuário `POST /v1/usuarios` Convida uma pessoa para o portal da Conta com um papel: `administrador`, `operador` ou `financeiro`. A senha provisória aparece uma vez na resposta; o autenticador é cadastrado no primeiro login. Só administrador. ## Corpo (`application/json`) | Campo | Tipo | Obrigatório | Descrição | |---|---|---|---| | `email` | texto | sim | E-mail do usuário | | `nome` | texto | sim | Nome completo (pelo menos 2 caracteres) | | `papel` | `administrador` \| `operador` \| `financeiro` | sim | `administrador`, `operador` ou `financeiro` | | `so_sso` | booleano | não | Se `true`, a pessoa só entra pelo login único da empresa (padrão `false`) | ## Respostas | HTTP | Significa | |---|---| | 201 | Criado | | 422 | Corpo ou parâmetros com formato inválido (`detail` lista os campos) | ### Exemplo de resposta ```json { "id": "7d6c5b4a-3928-4f1e-9d0c-b1a2f3e4d5c6", "conta_id": "0f1e2d3c-4b5a-6978-8a9b-0c1d2e3f4a5b", "email": "fulano@escritorio.com.br", "nome": "Fulano de Tal", "papel": "operador", "senha_provisoria": "q3X9-p0aZ7mK" } ``` ## Erros Recusas vêm como `{"detail": {"erro": "", "mensagem": "…"}}`. | HTTP | `erro` | Significa | |---|---|---| | 401 | — | Chave ausente ou inválida | | 409 | `email_ja_cadastrado` | Este e-mail já tem usuário | ## Exemplos de requisição ### Bash ```bash curl -X POST 'https://sync.lops.com.br/v1/usuarios' \ -H "Authorization: Bearer $SYNC_CHAVE" \ -H 'Content-Type: application/json' \ -d '{"email":"fulano@escritorio.com.br","nome":"Fulano de Tal","papel":"operador"}' ``` ### JavaScript ```javascript const resposta = await fetch("https://sync.lops.com.br/v1/usuarios", { method: "POST", headers: { Authorization: `Bearer ${process.env.SYNC_CHAVE}`, "Content-Type": "application/json", }, body: JSON.stringify({ "email": "fulano@escritorio.com.br", "nome": "Fulano de Tal", "papel": "operador" }), }); console.log(resposta.status, await resposta.json()); ``` ### Python ```python import os import requests resposta = requests.post( "https://sync.lops.com.br/v1/usuarios", headers={"Authorization": f"Bearer {os.environ['SYNC_CHAVE']}"}, json={ "email": "fulano@escritorio.com.br", "nome": "Fulano de Tal", "papel": "operador", }, ) print(resposta.status_code, resposta.json()) ``` ### PHP ```php 'POST', CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => [ 'Authorization: Bearer ' . getenv('SYNC_CHAVE'), 'Content-Type: application/json', ], CURLOPT_POSTFIELDS => json_encode([ 'email' => 'fulano@escritorio.com.br', 'nome' => 'Fulano de Tal', 'papel' => 'operador', ]), ]); $corpo = curl_exec($ch); $status = curl_getinfo($ch, CURLINFO_HTTP_CODE); var_dump($status, json_decode($corpo, true)); ``` --- # Mudar usuário `PATCH /v1/usuarios/{usuario_id}` Muda o papel ou desativa um usuário. Só administrador. ## Parâmetros | Nome | Onde | Tipo | Obrigatório | Descrição | |---|---|---|---|---| | `usuario_id` | caminho | uuid | sim | Id do usuário | ## Corpo (`application/json`) | Campo | Tipo | Obrigatório | Descrição | |---|---|---|---| | `ativo` | booleano | não | `false` desativa o acesso | | `papel` | `administrador` \| `operador` \| `financeiro` | não | `administrador`, `operador` ou `financeiro` | ## Respostas | HTTP | Significa | |---|---| | 200 | OK | | 422 | Corpo ou parâmetros com formato inválido (`detail` lista os campos) | ## Erros Recusas vêm como `{"detail": {"erro": "", "mensagem": "…"}}`. | HTTP | `erro` | Significa | |---|---|---| | 401 | — | Chave ausente ou inválida | | 404 | `nao_encontrado` | Usuário não encontrado nesta Conta | ## Exemplos de requisição ### Bash ```bash curl -X PATCH 'https://sync.lops.com.br/v1/usuarios/7d6c5b4a-3928-4f1e-9d0c-b1a2f3e4d5c6' \ -H "Authorization: Bearer $SYNC_CHAVE" \ -H 'Content-Type: application/json' \ -d '{"ativo":false}' ``` ### JavaScript ```javascript const resposta = await fetch("https://sync.lops.com.br/v1/usuarios/7d6c5b4a-3928-4f1e-9d0c-b1a2f3e4d5c6", { method: "PATCH", headers: { Authorization: `Bearer ${process.env.SYNC_CHAVE}`, "Content-Type": "application/json", }, body: JSON.stringify({ "ativo": false }), }); console.log(resposta.status, await resposta.json()); ``` ### Python ```python import os import requests resposta = requests.patch( "https://sync.lops.com.br/v1/usuarios/7d6c5b4a-3928-4f1e-9d0c-b1a2f3e4d5c6", headers={"Authorization": f"Bearer {os.environ['SYNC_CHAVE']}"}, json={ "ativo": False, }, ) print(resposta.status_code, resposta.json()) ``` ### PHP ```php 'PATCH', CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => [ 'Authorization: Bearer ' . getenv('SYNC_CHAVE'), 'Content-Type: application/json', ], CURLOPT_POSTFIELDS => json_encode([ 'ativo' => false, ]), ]); $corpo = curl_exec($ch); $status = curl_getinfo($ch, CURLINFO_HTTP_CODE); var_dump($status, json_decode($corpo, true)); ``` --- # Configurar login único `PUT /v1/sso` Liga o login único (OIDC) da empresa para a Conta. Quem entra por ele usa o segundo fator da própria empresa. Só administrador. ## Corpo (`application/json`) | Campo | Tipo | Obrigatório | Descrição | |---|---|---|---| | `client_id` | texto | sim | Identificador do cliente no emissor | | `client_secret` | texto | sim | Segredo do cliente no emissor | | `emissor` | texto | sim | Endereço `https://` do emissor OIDC | ## Respostas | HTTP | Significa | |---|---| | 204 | Sem conteúdo | | 422 | Corpo ou parâmetros com formato inválido (`detail` lista os campos) | ## Erros Recusas vêm como `{"detail": {"erro": "", "mensagem": "…"}}`. | HTTP | `erro` | Significa | |---|---|---| | 401 | — | Chave ausente ou inválida | ## Exemplos de requisição ### Bash ```bash curl -X PUT 'https://sync.lops.com.br/v1/sso' \ -H "Authorization: Bearer $SYNC_CHAVE" \ -H 'Content-Type: application/json' \ -d '{"emissor":"https://login.escritorio.com.br","client_id":"sync","client_secret":"****"}' ``` ### JavaScript ```javascript const resposta = await fetch("https://sync.lops.com.br/v1/sso", { method: "PUT", headers: { Authorization: `Bearer ${process.env.SYNC_CHAVE}`, "Content-Type": "application/json", }, body: JSON.stringify({ "emissor": "https://login.escritorio.com.br", "client_id": "sync", "client_secret": "****" }), }); console.log(resposta.status); // 204 ``` ### Python ```python import os import requests resposta = requests.put( "https://sync.lops.com.br/v1/sso", headers={"Authorization": f"Bearer {os.environ['SYNC_CHAVE']}"}, json={ "emissor": "https://login.escritorio.com.br", "client_id": "sync", "client_secret": "****", }, ) print(resposta.status_code) # 204 ``` ### PHP ```php 'PUT', CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => [ 'Authorization: Bearer ' . getenv('SYNC_CHAVE'), 'Content-Type: application/json', ], CURLOPT_POSTFIELDS => json_encode([ 'emissor' => 'https://login.escritorio.com.br', 'client_id' => 'sync', 'client_secret' => '****', ]), ]); $corpo = curl_exec($ch); $status = curl_getinfo($ch, CURLINFO_HTTP_CODE); var_dump($status, json_decode($corpo, true)); ```