Rode o Prazo Certo do seu próprio código
As duas faixas medidas estão disponíveis por HTTP e cada uma devolve um objeto JSON. A divisão do trabalho: a página conta o prazo - o ato e seus dias, a forma da intimação, o termo inicial, os dias úteis, os feriados nacionais, a Sexta-feira Santa, os dias do tribunal, o recesso e o prazo em dobro, cada premissa com seu artigo - e recusa a data final quando falta uma premissa; depois entrega tudo à execução como fatos. A execução escreve a análise ou o roteiro; a página então segura a resposta aos seus próprios fatos (prazoreply.js). Apoio informativo: nenhuma das faixas substitui um(a) advogado(a).
URL base e o formato da resposta
Todo endpoint fica sob https://api.skillsafe.ai/v1/app-api, e toda resposta tem um formato:
{ "ok": true, "data": { ... } }
{ "ok": false, "error": { "code": "...", "message": "..." } }
O token é criado para este app (a chamada de convidado leva {"slug":"prazo-certo"}), então nenhum cabeçalho de slug é preciso depois. Mande-o como Authorization: Bearer YOUR_TOKEN. O corpo da execução é o objeto de entrada, puro.
| Status | Código | Significado |
|---|---|---|
| 400 | validation_error | O corpo não é um objeto JSON, ou falta uma chave obrigatória (task, caso, prazo, facts). A página sempre manda os cinco campos task, caso, prazo, carry, facts; carry é uma string vazia na faixa analise. |
| 401 | unauthorized | Sem token, ou um token vencido. Crie um token de convidado ou entre de novo. |
| 402 | insufficient_credits | O saldo está abaixo de min_credits. Estime com /estimate antes. |
| 403 | forbidden | Um token de convidado tentou executar: as duas faixas são medidas e precisam de entrada pessoal. |
| 404 | not_found | Id de job desconhecido. |
| 429 | rate_limited | Espere e tente de novo. |
| 5xx | server_error | Passageiro. Tente de novo com a mesma Idempotency-Key, para nunca cobrar duas vezes. |
O campo task vem primeiro
Duas faixas, escolhidas por task, na ordem em que o trabalho acontece - o caso inteiro, depois a peça:
analise- as 12 etapas do guia: enquadramento, base legal, competência, partes, cronologia, mérito, os quatro riscos, a data final da página reproduzida (ou "não calculado"), cenários, custos sem valores, estratégia, urgência, recomendação e três próximos passos.minuta- o roteiro da peça do ato contado: endereçamento, qualificação só com marcadores, seções (fatos, fundamentos e pedidos numa petição; tempestividade, preparo e razões num recurso), pedidos, provas e o checklist de protocolo.
Uma task ausente ou desconhecida é respondida como analise. As duas faixas mandam os mesmos cinco campos. Os facts são as verificações da página, uma por linha, e uma linha que começa com "deve:" é uma regra que a resposta precisa cumprir. O botão de passagem da página leva a análise para carry na faixa minuta.
A entrada
| Campo | Obrigatório | O quê |
|---|---|---|
task | sim | analise ou minuta. Se faltar ou for outro valor, faça analise e escreva "task": "analise". |
caso | sim | o caso como a página o leu: título, perfil, área (com o módulo do guia), UF, município, foro, rito, autos, urgência, as partes por papel com a qualidade, o relato e os fatos datados (data | fato | documento) e as referências do guia para a área; "não informado" quer dizer não informado. |
prazo | sim | a contagem da página: o ato, os dias e o fundamento, para quem corre, a intimação, a DATA FINAL DA PÁGINA (ou "não calculada" e o que falta), a data alternativa quando há dias de tribunal não conferidos, cada premissa com seu artigo e os dias não contados. |
carry | mande (vazio na analise) | só na tarefa minuta: a análise trazida, ou uma frase dizendo que nada foi trazido. |
facts | sim | as verificações da página, uma por linha como área | id | status | evidência, e as qualidades sinalizadas. Uma linha que começa com "deve:" se aplica à sua resposta. |
retry_note | não | opcional; se vier, a sua resposta anterior não pôde ser usada - siga a nota. |
As regras que o modelo aplica
Da skill de origem, @sickn33/advogado-especialista - o único padrão que a execução aplica:
- Apoio informativo: a resposta não representa o usuário nem comprova habilitação profissional, e nunca substitui um(a) advogado(a) presencial - recomende-o sempre que necessário, e a Defensoria Pública a quem não pode pagar.
- Antes de orientar um caso concreto, identifique estado e município, foro, data dos fatos, rito, documentos e urgência. Sempre sinalize quando a análise depende de documentos não fornecidos.
- Não calcular prazo final sem termo inicial, forma de intimação, suspensões e calendário aplicável. Os prazos do guia são durações abstratas para conferir, não datas finais.
- Nunca inventar leis, artigos, súmulas, decisões ou números de processo. Nunca garantir resultado de julgamento - o Direito não é exato. Sempre expor divergências jurisprudenciais quando existirem.
- Sempre informar prazos de prescrição e decadência quando relevantes, e sempre alertar sobre custos e riscos processuais com transparência.
- Nunca minimizar violência doméstica nem culpabilizar a vítima. Com risco à integridade, o fluxo de urgência do guia vem antes de tudo: perigo imediato, 190 (PM); o 180 é canal de orientação e denúncia e não substitui a resposta emergencial; violência recorrente, Delegacia/DEAM e pedido urgente de medida protetiva, sem prometer proteção efetiva em 48 horas; orientação, CRAM ou Defensoria Pública.
- Minimizar dados pessoais e anonimizar documentos; o chat não garante sigilo profissional. Nunca aconselhar destruição de provas, obstrução da justiça ou fraude.
- O perfil define o registro: leigo, linguagem acessível e passo a passo, explicando siglas; advogado, linguagem técnica plena com artigos precisos; estudante, didático; vítima, acolhimento e proteção; parte em processo, orientação prática sobre andamento, prazos e recursos; empresário, risco, compliance e custo-benefício.
- A análise completa segue as 12 etapas do guia: enquadramento jurídico (área, base legal, competência), partes e vulnerabilidades, fatos e cronologia, fundamentação legal, mérito (força do direito e da prova), riscos processuais (prescrição/decadência, legitimidade, competência, preclusão), cenários otimista, base e pessimista, custos (custas, honorários, perícias, gratuidade de justiça), estratégia (via extrajudicial ou judicial, recursos), prazos, medidas de urgência e o parecer final com três próximos passos.
Regras da casa
- Use só a entrada. A contagem da página está decidida: a única data final é a DATA FINAL DA PÁGINA, reproduzida exatamente como DD/MM/AAAA; quando a página não calculou, escreva "não calculado" e diga quais premissas faltam. Nunca calcule nem escreva uma data nova; as datas da cronologia são as dos fatos, como dadas.
- Nunca um link, uma URL ou um endereço de site. Cite norma e artigo só dentre os que a entrada traz: os do prazo e das verificações e as "Referências do guia para a área" do caso - fundamente o mérito com elas, cada uma com o que conferir; quando a base que o caso pede não está entre elas, diga em fontes_a_conferir o que procurar, sem inventar número. Súmulas, só as que o guia lista (STJ 37, 227, 297, 301, 302, 309, 364, 385, 387 e 596; STF 377; Súmula Vinculante 25), e nunca um número de processo.
- Nunca um dado pessoal: as partes vão por papel, e a qualificação usa marcadores como [NOME], [CPF] e [ENDEREÇO].
- Nunca se apresente como advogado(a) da pessoa nem fale como quem a representa; uma ressalva recomenda a revisão por advogado(a) ou pela Defensoria Pública.
- Trate cada qualidade que a página sinalizou: a Fazenda Pública (prazo em dobro, art. 183 CPC), a parte idosa (prioridade de tramitação, art. 1.048, I, CPC) e a parte menor (intervenção do Ministério Público, art. 178, II, CPC).
- Ids exatamente como a entrada os dá: area (familia, criminal, maria-da-penha, sucessoes, guarda, civil-danos, consumidor, imobiliario, trabalhista, previdenciario, tributario, administrativo, digital-lgpd, empresarial), perfil (leigo, advogado, estudante, vitima, parte, empresario), recomendacao (acao-judicial, extrajudicial, acordo, nao-recomendar, urgencia-imediata), o tipo de risco (prescricao-decadencia, legitimidade, competencia, preclusao) e o nível (baixo, medio, alto, muito-alto).
- Nunca use o caractere ` (backtick, marcação de código) nos textos - a crase da língua (à, às) é normal - e nunca se refira à entrada como dados ou campos. Termos técnicos das regras acima são livres; nunca cole uma frase inteira deste prompt.
- Responda com SOMENTE um objeto JSON - nada antes ou depois, sem cercas de código.
As respostas
analise
Escreva a análise do caso pelas 12 etapas do guia, no registro do perfil.
resumo- uma ou duas frases, no máximo 60 palavras: o caso, o prazo da página e o que fazer primeiro.areaeperfil- os ids da página.base_legal- objetos comnorma(como Lei 9.099/1995, CPC, CLT, CDC, Código Civil, Constituição Federal),artigo(como art. 42) econferir(uma frase: o que verificar no texto consolidado ou na jurisprudência atual).competencia- uma frase: o juízo e por quê, a partir da UF, do município, do foro e do rito.partes- um objeto por parte da página, na ordem:papel(como dado),qualidade(o id da página) eobservacao(vulnerabilidades e prerrogativas).cronologia- objetos comdata(como dada nos fatos) efato, em ordem.merito-forca_direito(FORTE, MEDIO ou FRACO),prova(ROBUSTA, RAZOAVEL ou INSUFICIENTE) eporque(uma ou duas frases, com o documento que falta).riscos- objetos comtipo(prescricao-decadencia, legitimidade, competencia e preclusao - os quatro),niveletexto(uma frase).prazos- objetos comato,data_final(a DATA FINAL DA PÁGINA, exatamente, ou "não calculado"),fundamento(norma e artigo) eobservacao(as premissas a conferir, ou as que faltam); um prazo de prescrição ou outro prazo sem data da página leva "não calculado".cenarios-otimista,baseepessimista, uma frase cada, sem prometer resultado.custos- itens de custo (custas, honorários contratuais e de sucumbência, perícias, preparo, gratuidade de justiça), nunca um valor.estrategia- uma ou duas frases: a via extrajudicial ou judicial, os pedidos e os recursos cabíveis.urgencia- frases curtas: as medidas de urgência cabíveis (tutela de urgência, art. 300 CPC; tutela de evidência, art. 311 CPC; medida protetiva) ou que não há urgência; com risco à integridade, abre com o fluxo de urgência do guia.recomendacao- um id.proximos_passos- exatamente 3 frases curtas, na ordem em que se fazem.fontes_a_conferir- frases curtas: o texto consolidado, o calendário do tribunal, os documentos dos autos a conferir - sem links.ressalvas- no máximo 5 frases curtas: o que depende de documento não fornecido, as premissas em aberto e a revisão por advogado(a) ou Defensoria Pública.
{
"task": "analise",
"resumo": "uma ou duas frases",
"area": "consumidor",
"perfil": "leigo",
"base_legal": [ { "norma": "CDC (Lei 8.078/1990)", "artigo": "art. 14", "conferir": "uma frase" } ],
"competencia": "uma frase",
"partes": [ { "papel": "autor", "qualidade": "consumidor", "observacao": "uma frase" } ],
"cronologia": [ { "data": "05/05/2026", "fato": "uma frase" } ],
"merito": { "forca_direito": "MEDIO", "prova": "RAZOAVEL", "porque": "uma frase" },
"riscos": [ { "tipo": "prescricao-decadencia", "nivel": "baixo", "texto": "uma frase" } ],
"prazos": [ { "ato": "Recurso inominado", "data_final": "não calculado", "fundamento": "art. 42 da Lei 9.099/1995", "observacao": "uma frase" } ],
"cenarios": { "otimista": "uma frase", "base": "uma frase", "pessimista": "uma frase" },
"custos": [ "um item" ],
"estrategia": "uma frase",
"urgencia": [ "uma frase" ],
"recomendacao": "acao-judicial",
"proximos_passos": [ "um", "dois", "três" ],
"fontes_a_conferir": [ "uma frase" ],
"ressalvas": [ "uma frase" ]
}
A página segura a resposta aos seus próprios fatos (check() em prazoreply.js; qualquer aviso marca a resposta): a tarefa pedida; nenhum link; nenhum CPF, CNPJ, RG, e-mail, telefone ou CEP; nenhuma alegação de ser advogado(a) da pessoa; nenhuma data que não venha da página ou dos fatos; súmulas só as do guia; cada qualidade sinalizada (Fazenda Pública, idoso, menor) tratada; uma ressalva que recomende advogado(a) ou Defensoria; a área e o perfil da página; resumo de até 60 palavras; base legal com norma e artigo; as partes por papel; a cronologia com as datas dos fatos; mérito e prova nas escalas do guia; os quatro riscos; a data final da página reproduzida exatamente, ou "não calculado" com o que falta; os três cenários; custos sem valores; uma recomendação do conjunto; exatamente três próximos passos; com risco à integridade, 190 e 180 e recomendação urgencia-imediata.
minuta
Escreva o roteiro da peça do ato cujo prazo a página contou, a partir da análise trazida.
peca- o nome do ato da página (como Contestação, Recurso inominado, Recurso ordinário).prazo- a DATA FINAL DA PÁGINA, exatamente, com o dia da semana se quiser, ou "não calculado" e o que falta.enderecamento- uma frase: o juízo ou o tribunal a que a peça se dirige, a partir do foro e do rito.qualificacao- as partes por papel com marcadores, como "[NOME], [qualificação], inscrito(a) no CPF sob o nº [CPF], residente em [ENDEREÇO]"; nunca um dado.secoes- objetos comtituloepontos(frases curtas, os argumentos a desenvolver). Petição (contestação, reconvenção, impugnação, embargos à execução): fatos, fundamentos e pedidos, com as preliminares quando houver. Recurso: tempestividade (repete a data da página ou "não calculado"), preparo e razões. Embargos de declaração: tempestividade e razões.pedidos- frases curtas, na ordem da peça.provas- os documentos e as provas a juntar ou requerer, a partir dos fatos.checklist_protocolo- frases curtas: o que conferir antes de protocolar (a data no sistema do tribunal, a assinatura, o preparo, os anexos, a procuração).ressalvas- no máximo 5 frases curtas: as premissas em aberto e a revisão por advogado(a) ou Defensoria Pública.
{
"task": "minuta",
"peca": "Recurso inominado",
"prazo": "não calculado - falta a data da consulta da intimação",
"enderecamento": "uma frase",
"qualificacao": "[NOME], inscrito(a) no CPF sob o nº [CPF] ...",
"secoes": [ { "titulo": "Tempestividade", "pontos": [ "uma frase" ] } ],
"pedidos": [ "uma frase" ],
"provas": [ "uma frase" ],
"checklist_protocolo": [ "uma frase" ],
"ressalvas": [ "uma frase" ]
}
A página exige: a tarefa pedida; as mesmas regras de texto, datas e dados; a peça com o nome do ato contado; o prazo igual à data final da página (ou "não calculado") e nenhuma outra data nele; o endereçamento; a qualificação com [NOME] e outros marcadores; as seções da peça - fatos, fundamentos e pedidos numa petição, tempestividade, preparo e razões num recurso, tempestividade e razões em embargos -, a tempestividade repetindo a data; pedidos, provas e o checklist de protocolo.
Exemplos completos
Três execuções dos exemplos grátis da página (casos inventados e anonimizados): a análise da contestação da Fazenda Pública no DJe às vésperas do recesso, o roteiro da mesma peça levando essa análise, e a análise do recurso no Juizado cuja data final a página recusou. Cada entrada é exatamente o que a página manda; cada resposta é a resposta salva que o exemplo reproduz, sem edição - mas os campos longos são encurtados só nesta exibição, e cada corte é listado embaixo do exemplo. A última linha é a verificação da própria página sobre a resposta inteira.
analise - Contestação da Fazenda no DJe, com recesso
A página leu assim: data calculada, premissas conferidas; Contestação; data final 02/03/2026.
Entrada (caso tem 1598 caracteres; os primeiros 1397 são mostrados; prazo tem 1410 caracteres; os primeiros 1398 são mostrados; facts tem 2403 caracteres; os primeiros 1396 são mostrados):
{
"task": "analise",
"caso": "Caso: Contestação do Município em ação por queda em calçada\nPerfil: advogado - Advogado(a) (registro: linguagem técnica plena, artigos citados com precisão, estratégia processual)\nÁrea: civil-danos - Danos morais / responsabilidade civil (módulo 6 do guia)\nUF: SP - São Paulo; município: [MUNICÍPIO]; foro/vara: Vara da Fazenda Pública\nRito: cpc - Procedimento comum (CPC); autos: eletrônicos\nUrgência: nenhuma\n\nPartes (papel | descrição | qualidade):\n- autora | pedestre que caiu em buraco não sinalizado na calçada | pessoa-fisica\n- réu | Município de [MUNICÍPIO] | fazenda-publica\n\nRelato:\nAtuo pela Procuradoria do Município. A autora pede indenização por danos morais e materiais depois de cair em um buraco sem sinalização na calçada em frente a uma escola municipal. A intimação para contestar foi disponibilizada no DJe e precisamos do prazo e de um roteiro de defesa: há dúvida sobre quem responde pela calçada (o Município ou o proprietário do imóvel em frente) e sobre a extensão do dano.\n\nFatos (data | fato | documento):\n- 02/10/2025 | queda da autora na calçada em frente à escola municipal | boletim de ocorrência e fotos\n- 03/10/2025 | atendimento no pronto-socorro, fratura no punho | prontuário e atestado\n- 24/11/2025 | ajuizamento da ação de indenização | petição inicial\n- 15/12/2025 | disponibilização no DJe da intimação para contestar | DJe\n\nReferências do guia para a área\n\n[... mais 201 caracteres cortados desta exibição ...]",
"prazo": "Ato: Contestação - 15 dias úteis (art. 335 CPC)\nPrazo corre para: réu\nIntimação: Diário de Justiça Eletrônico (DJe) - 15/12/2025\nDATA FINAL DA PÁGINA: 02/03/2026 (segunda) - premissas conferidas\n\nPremissas:\n- Contestação: 15 dias úteis (art. 335 CPC)\n- Contagem em dias úteis (art. 219 CPC)\n- Prazo em dobro: 30 dias úteis (Fazenda Pública) (art. 183 CPC)\n- Intimação: Diário de Justiça Eletrônico (DJe) - data da disponibilização no DJe 15/12/2025; publicação 16/12/2025 (art. 224, § 2º, CPC)\n- Exclui-se o dia do começo: a contagem começa em 17/12/2025 (art. 224, § 3º, CPC)\n- Recesso forense de 20/12 a 20/01 suspende a contagem (32 dias no período) (art. 220 CPC)\n- Nenhum feriado nacional fora do recesso no período (25/12/2025 e 01/01/2026 caem no recesso) (Lei 662/1949 e alterações, Lei 6.802/1980, Lei 14.759/2023)\n- Carnaval (segunda e terça): sem expediente (conferido) (calendário do tribunal)\n- Quarta-feira de Cinzas: com expediente (conferido) (calendário do tribunal)\n- Feriados locais e suspensões: nenhum (declarado) (informado por você)\n- Vencimento: 02/03/2026 (segunda) (art. 224 CPC - inclui-se o dia do vencimento)\n\nDias não contados no período (além de sábados e domingos): 20/12/2025 a 20/01/2026 recesso forense - suspensão (art. 220 CPC) (32 dias); 16/02/2026 Carnaval (segunda e terça) - sem expediente no tribunal; 17/02/2026 Carnaval (segunda e terça) - sem expediente\n\n[... mais 12 caracteres cortados desta exibição ...]",
"carry": "",
"facts": "Verificações da página (0 urgente, 0 falta, 0 conferir, 15 ok, 0 n/a); veredito: data calculada, premissas conferidas:\n- Urgência | urgencia | pass | nenhuma urgência declarada\n- Competência | competencia | pass | São Paulo, [MUNICÍPIO], Vara da Fazenda Pública - Procedimento comum (CPC)\n- Termo inicial | ato | pass | Contestação: 15 dias úteis (art. 335 CPC); contagem em dias úteis (art. 219 CPC)\n- Termo inicial | forma | pass | Publicação no primeiro dia útil seguinte à disponibilização (art. 224, § 2º, CPC); a contagem começa no primeiro dia útil seguinte à publicação (art. 224, § 3º, CPC).\n- Termo inicial | data | pass | data da disponibilização no DJe: 15/12/2025 (segunda)\n- Termo inicial | inicio | pass | a contagem começa em 17/12/2025 (quarta), 30 dias úteis; vencimento 02/03/2026 (segunda)\n- Calendário | nacionais | pass | nenhum feriado nacional fora do recesso no período (Lei 662/1949 e alterações, Lei 6.802/1980, Lei 14.759/2023); dentro do recesso: 25/12/2025 Natal, 01/01/2026 Confraternização Universal\n- Calendário | recesso | pass | recesso forense de 20/12 a 20/01 suspende a contagem (art. 220 CPC): 32 dias suspensos no período\n- Calendário | tribunal | pass | nenhum dia de tribunal pendente no período (conferidos: Carnaval (segunda e terça) sem expediente, Quarta-feira de Cinzas com expediente)\n- Calendário | locais | pass | declarado: nenhum feriado local,\n\n[... mais 1007 caracteres cortados desta exibição ...]"
}
Resposta (textos longos encurtados para exibição - veja os cortes abaixo):
{
"task": "analise",
"resumo": "Contestação do Município, com prazo em dobro da Fazenda Pública, em ação por queda em calçada: a página conta 30 dias úteis a partir de 17/12/2025, com o recesso e o Carnaval, e o prazo vence em 02/03/2026. Antes, levantar a quem cabe a [... mais 27 caracteres cortados desta exibição]",
"area": "civil-danos",
"perfil": "advogado",
"base_legal": [
{
"norma": "Constituição Federal",
"artigo": "art. 37, § 6º",
"conferir": "Se a omissão na conservação da calçada atrai a responsabilidade objetiva ou exige falha do serviço - há divergência na jurisprudência atual."
},
{
"norma": "Código Civil",
"artigo": "arts. 186 e 927",
"conferir": "Os pressupostos de conduta, dano e nexo causal que a defesa vai contestar."
},
{
"norma": "CPC",
"artigo": "arts. 183 e 335",
"conferir": "Contestação em 15 dias úteis, contados em dobro para a Fazenda Pública."
},
{
"norma": "CPC",
"artigo": "arts. 220 e 224",
"conferir": "Suspensão no recesso de 20/12 a 20/01 e a regra de exclusão do dia do começo."
}
],
"competencia": "Vara da Fazenda Pública da comarca de [MUNICÍPIO], SP, no procedimento comum do CPC, por ser ação de indenização contra o Município; conferir nos autos o valor da causa e a distribuição.",
"partes": [
{
"papel": "autora",
"qualidade": "pessoa-fisica",
"observacao": "Pedestre; tem o ônus de provar a queda, o local, a lesão e o nexo com o buraco."
},
{
"papel": "réu",
"qualidade": "fazenda-publica",
"observacao": "Município: prazo em dobro para contestar (art. 183 CPC); a responsabilidade por omissão na conservação da calçada está em discussão."
}
],
"cronologia": [
{
"data": "02/10/2025",
"fato": "Queda da autora na calçada em frente à escola municipal (boletim de ocorrência e fotos)."
},
{
"data": "03/10/2025",
"fato": "Atendimento no pronto-socorro, com fratura no punho (prontuário e atestado)."
},
{
"data": "24/11/2025",
"fato": "Ajuizamento da ação de indenização."
},
{
"data": "15/12/2025",
"fato": "Disponibilização no DJe da intimação para contestar."
}
],
"merito": {
"forca_direito": "MEDIO",
"prova": "RAZOAVEL",
"porque": "A autora tem boletim, fotos e prontuário, mas a defesa ainda não tem o cadastro do imóvel em frente, a lei municipal sobre calçadas nem o histórico de reclamações do local - documentos que decidem a tese de ilegitimidade e a de culpa da [... mais 8 caracteres cortados desta exibição]"
},
"riscos": [
{
"tipo": "prescricao-decadencia",
"nivel": "baixo",
"texto": "Queda em 02/10/2025 e ação em 24/11/2025: a prescrição contra a Fazenda é de 5 anos (Decreto 20.910/1932), sem tese útil para a defesa."
},
{
"tipo": "legitimidade",
"nivel": "medio",
"texto": "Se a lei municipal atribuir ao proprietário do imóvel a conservação da calçada, cabe a preliminar de ilegitimidade - conferir a lei local e a jurisprudência do tribunal estadual."
},
{
"tipo": "competencia",
"nivel": "baixo",
"texto": "A Vara da Fazenda Pública é o juízo próprio; conferir só o valor da causa e a distribuição."
},
{
"tipo": "preclusao",
"nivel": "alto",
"texto": "Perder 02/03/2026 faz precluir a contestação e todas as defesas que nela deveriam vir, inclusive a reconvenção."
}
],
"prazos": [
{
"ato": "Contestação (Fazenda Pública, em dobro)",
"data_final": "02/03/2026",
"fundamento": "arts. 183 e 335 CPC",
"observacao": "30 dias úteis contados de 17/12/2025, com o recesso de 20/12/2025 a 20/01/2026 suspenso e o Carnaval sem expediente conferido; conferir a data no sistema do tribunal."
},
{
"ato": "Prescrição contra a Fazenda Pública",
"data_final": "não calculado",
"fundamento": "Decreto 20.910/1932",
"observacao": "5 anos contados do fato; a ação veio no mesmo ano, então não há tese de prescrição."
}
],
"cenarios": {
"otimista": "Afastada a responsabilidade do Município pela calçada, ou reconhecida a culpa exclusiva da vítima, os pedidos são julgados improcedentes.",
"base": "Responsabilidade reconhecida, com o valor reduzido ao dano efetivamente provado.",
"pessimista": "Responsabilidade objetiva reconhecida e os danos morais e materiais concedidos como pedidos, com sucumbência."
},
"custos": [
"Honorários de sucumbência, se os pedidos forem julgados procedentes",
"Perícia médica sobre a lesão, se requerida ou determinada",
"Custas de eventual apelação, conforme a lei estadual"
],
"estrategia": "Contestar até 02/03/2026 com a preliminar de ilegitimidade, se a lei municipal atribuir a calçada ao proprietário, e no mérito discutir o nexo causal, a culpa da vítima e a extensão do dano; avaliar acordo se a prova do dano for forte.",
"urgencia": [
"Não há medida de urgência a pedir pela defesa; o ponto urgente é o prazo de 02/03/2026."
],
"recomendacao": "acao-judicial",
"proximos_passos": [
"Pedir à secretaria de obras o cadastro do imóvel em frente à escola, a lei municipal sobre calçadas e o histórico de reclamações do local.",
"Redigir a contestação com a preliminar de ilegitimidade, o mérito sobre nexo e culpa e a impugnação dos danos.",
"Protocolar até 02/03/2026, conferindo a data no sistema do tribunal."
],
"fontes_a_conferir": [
"Texto consolidado do CPC, arts. 183, 220, 224 e 335",
"Calendário do tribunal para o Carnaval e a Quarta-feira de Cinzas de 2026",
"Legislação municipal sobre conservação de calçadas",
"Jurisprudência atual do STJ e do tribunal estadual sobre omissão do Município na conservação de vias"
],
"ressalvas": [
"A análise depende da petição inicial, do prontuário e da lei municipal, que não foram fornecidos.",
"Há divergência sobre responsabilidade objetiva ou subjetiva por omissão do poder público - conferir a jurisprudência atual.",
"Apoio informativo: a contestação deve ser revisada e assinada pela advogada ou pelo advogado da Procuradoria."
]
}
Cortado só desta exibição (a resposta salva e a verificação usam o texto inteiro): resumo (263 caracteres, 236 mostrados); merito.porque (244 caracteres, 236 mostrados).
O que o passo 5 imprime para ela: Contestação (Fazenda Pública, em dobro): 02/03/2026 | Prescrição contra a Fazenda Pública: não calculado
A verificação da página: mantida - nada a sinalizar
minuta - Contestação da Fazenda no DJe, com recesso
A página leu assim: data calculada, premissas conferidas; Contestação; data final 02/03/2026. A entrada leva a análise salva (R.laneForm preenche carry com a resposta da análise), como o botão de passagem da página.
Entrada (caso tem 1598 caracteres; os primeiros 1397 são mostrados; prazo tem 1410 caracteres; os primeiros 1398 são mostrados; carry tem 2076 caracteres; os primeiros 1389 são mostrados; facts tem 2134 caracteres; os primeiros 1396 são mostrados):
{
"task": "minuta",
"caso": "Caso: Contestação do Município em ação por queda em calçada\nPerfil: advogado - Advogado(a) (registro: linguagem técnica plena, artigos citados com precisão, estratégia processual)\nÁrea: civil-danos - Danos morais / responsabilidade civil (módulo 6 do guia)\nUF: SP - São Paulo; município: [MUNICÍPIO]; foro/vara: Vara da Fazenda Pública\nRito: cpc - Procedimento comum (CPC); autos: eletrônicos\nUrgência: nenhuma\n\nPartes (papel | descrição | qualidade):\n- autora | pedestre que caiu em buraco não sinalizado na calçada | pessoa-fisica\n- réu | Município de [MUNICÍPIO] | fazenda-publica\n\nRelato:\nAtuo pela Procuradoria do Município. A autora pede indenização por danos morais e materiais depois de cair em um buraco sem sinalização na calçada em frente a uma escola municipal. A intimação para contestar foi disponibilizada no DJe e precisamos do prazo e de um roteiro de defesa: há dúvida sobre quem responde pela calçada (o Município ou o proprietário do imóvel em frente) e sobre a extensão do dano.\n\nFatos (data | fato | documento):\n- 02/10/2025 | queda da autora na calçada em frente à escola municipal | boletim de ocorrência e fotos\n- 03/10/2025 | atendimento no pronto-socorro, fratura no punho | prontuário e atestado\n- 24/11/2025 | ajuizamento da ação de indenização | petição inicial\n- 15/12/2025 | disponibilização no DJe da intimação para contestar | DJe\n\nReferências do guia para a área\n\n[... mais 201 caracteres cortados desta exibição ...]",
"prazo": "Ato: Contestação - 15 dias úteis (art. 335 CPC)\nPrazo corre para: réu\nIntimação: Diário de Justiça Eletrônico (DJe) - 15/12/2025\nDATA FINAL DA PÁGINA: 02/03/2026 (segunda) - premissas conferidas\n\nPremissas:\n- Contestação: 15 dias úteis (art. 335 CPC)\n- Contagem em dias úteis (art. 219 CPC)\n- Prazo em dobro: 30 dias úteis (Fazenda Pública) (art. 183 CPC)\n- Intimação: Diário de Justiça Eletrônico (DJe) - data da disponibilização no DJe 15/12/2025; publicação 16/12/2025 (art. 224, § 2º, CPC)\n- Exclui-se o dia do começo: a contagem começa em 17/12/2025 (art. 224, § 3º, CPC)\n- Recesso forense de 20/12 a 20/01 suspende a contagem (32 dias no período) (art. 220 CPC)\n- Nenhum feriado nacional fora do recesso no período (25/12/2025 e 01/01/2026 caem no recesso) (Lei 662/1949 e alterações, Lei 6.802/1980, Lei 14.759/2023)\n- Carnaval (segunda e terça): sem expediente (conferido) (calendário do tribunal)\n- Quarta-feira de Cinzas: com expediente (conferido) (calendário do tribunal)\n- Feriados locais e suspensões: nenhum (declarado) (informado por você)\n- Vencimento: 02/03/2026 (segunda) (art. 224 CPC - inclui-se o dia do vencimento)\n\nDias não contados no período (além de sábados e domingos): 20/12/2025 a 20/01/2026 recesso forense - suspensão (art. 220 CPC) (32 dias); 16/02/2026 Carnaval (segunda e terça) - sem expediente no tribunal; 17/02/2026 Carnaval (segunda e terça) - sem expediente\n\n[... mais 12 caracteres cortados desta exibição ...]",
"carry": "Resumo: Contestação do Município, com prazo em dobro da Fazenda Pública, em ação por queda em calçada: a página conta 30 dias úteis a partir de 17/12/2025, com o recesso e o Carnaval, e o prazo vence em 02/03/2026. Antes, levantar a quem cabe a calçada e a prova do dano.\nÁrea: civil-danos; recomendação: acao-judicial; mérito: força MEDIO, prova RAZOAVEL - A autora tem boletim, fotos e prontuário, mas a defesa ainda não tem o cadastro do imóvel em frente, a lei municipal sobre calçadas nem o histórico de reclamações do local - documentos que decidem a tese de ilegitimidade e a de culpa da vítima.\nBase legal: Constituição Federal art. 37, § 6º; Código Civil arts. 186 e 927; CPC arts. 183 e 335; CPC arts. 220 e 224\nPrazos: Contestação (Fazenda Pública, em dobro) - 02/03/2026 (arts. 183 e 335 CPC); Prescrição contra a Fazenda Pública - não calculado (Decreto 20.910/1932)\nRiscos: prescricao-decadencia baixo - Queda em 02/10/2025 e ação em 24/11/2025: a prescrição contra a Fazenda é de 5 anos (Decreto 20.910/1932), sem tese útil para a defesa; legitimidade medio - Se a lei municipal atribuir ao proprietário do imóvel a conservação da calçada, cabe a preliminar de ilegitimidade - conferir a lei local e a jurisprudência do tribunal estadual; competencia baixo - A Vara da Fazenda Pública é o juízo próprio; conferir só o valor da causa e a distribuição; preclusao alto - Perder\n\n[... mais 687 caracteres cortados desta exibição ...]",
"facts": "Verificações da página (0 urgente, 0 falta, 0 conferir, 15 ok, 0 n/a); veredito: data calculada, premissas conferidas:\n- Urgência | urgencia | pass | nenhuma urgência declarada\n- Competência | competencia | pass | São Paulo, [MUNICÍPIO], Vara da Fazenda Pública - Procedimento comum (CPC)\n- Termo inicial | ato | pass | Contestação: 15 dias úteis (art. 335 CPC); contagem em dias úteis (art. 219 CPC)\n- Termo inicial | forma | pass | Publicação no primeiro dia útil seguinte à disponibilização (art. 224, § 2º, CPC); a contagem começa no primeiro dia útil seguinte à publicação (art. 224, § 3º, CPC).\n- Termo inicial | data | pass | data da disponibilização no DJe: 15/12/2025 (segunda)\n- Termo inicial | inicio | pass | a contagem começa em 17/12/2025 (quarta), 30 dias úteis; vencimento 02/03/2026 (segunda)\n- Calendário | nacionais | pass | nenhum feriado nacional fora do recesso no período (Lei 662/1949 e alterações, Lei 6.802/1980, Lei 14.759/2023); dentro do recesso: 25/12/2025 Natal, 01/01/2026 Confraternização Universal\n- Calendário | recesso | pass | recesso forense de 20/12 a 20/01 suspende a contagem (art. 220 CPC): 32 dias suspensos no período\n- Calendário | tribunal | pass | nenhum dia de tribunal pendente no período (conferidos: Carnaval (segunda e terça) sem expediente, Quarta-feira de Cinzas com expediente)\n- Calendário | locais | pass | declarado: nenhum feriado local,\n\n[... mais 738 caracteres cortados desta exibição ...]"
}
Resposta (textos longos encurtados para exibição - veja os cortes abaixo):
{
"task": "minuta",
"peca": "Contestação",
"prazo": "02/03/2026 (segunda-feira) - 30 dias úteis, em dobro para a Fazenda Pública",
"enderecamento": "Ao Juízo da Vara da Fazenda Pública da comarca de [MUNICÍPIO] - SP.",
"qualificacao": "MUNICÍPIO DE [MUNICÍPIO], pessoa jurídica de direito público interno, inscrito no CNPJ sob o nº [CNPJ], representado por sua Procuradoria, nos autos da ação de indenização movida por [NOME], [qualificação], inscrita no CPF sob o nº [CPF], [... mais 25 caracteres cortados desta exibição]",
"secoes": [
{
"titulo": "Tempestividade",
"pontos": [
"Contestação apresentada até 02/03/2026: 15 dias úteis em dobro (arts. 183 e 335 CPC), contados de 17/12/2025, com o recesso de 20/12/2025 a 20/01/2026 suspenso (art. 220 CPC)."
]
},
{
"titulo": "Síntese dos fatos",
"pontos": [
"A autora alega queda em buraco na calçada em frente à escola municipal em 02/10/2025.",
"Pede danos morais e materiais pela fratura no punho atendida em 03/10/2025."
]
},
{
"titulo": "Preliminar: ilegitimidade passiva",
"pontos": [
"Se a lei municipal atribui ao proprietário do imóvel lindeiro a conservação da calçada, o Município não responde pela manutenção daquele trecho.",
"Juntar a lei municipal e o cadastro do imóvel em frente à escola."
]
},
{
"titulo": "Fundamentos: nexo causal e culpa da vítima",
"pontos": [
"A responsabilidade por omissão exige demonstrar a falha do serviço - expor a divergência sobre o art. 37, § 6º, da Constituição Federal.",
"Discutir a visibilidade do buraco e a conduta da autora como causa do dano.",
"Impugnar o boletim de ocorrência como prova unilateral do local."
]
},
{
"titulo": "Fundamentos: extensão do dano",
"pontos": [
"Impugnar os valores sem comprovante de despesa.",
"Pedir que o dano moral, se reconhecido, seja fixado com base em julgados comparáveis do tribunal."
]
},
{
"titulo": "Pedidos",
"pontos": [
"Preliminar de ilegitimidade; no mérito, improcedência; subsidiariamente, redução da indenização."
]
}
],
"pedidos": [
"Acolher a preliminar de ilegitimidade passiva, se a lei municipal atribuir a calçada ao proprietário",
"No mérito, julgar improcedentes os pedidos",
"Subsidiariamente, reduzir a indenização à extensão do dano provado",
"Condenar a autora nos ônus da sucumbência",
"Deferir a produção das provas indicadas"
],
"provas": [
"Cadastro imobiliário do imóvel em frente à escola",
"Lei municipal sobre conservação de calçadas",
"Registros de reclamações e de manutenção do local",
"Perícia médica sobre a extensão da lesão, se necessária",
"Testemunhas da escola sobre a sinalização do local"
],
"checklist_protocolo": [
"Conferir no sistema do tribunal que o prazo vence em 02/03/2026",
"Conferir a assinatura digital do procurador ou da procuradora",
"Juntar a representação da Procuradoria",
"Juntar os documentos da secretaria de obras",
"Decidir se há reconvenção, que vai na própria contestação"
],
"ressalvas": [
"Roteiro de apoio: a contestação deve ser redigida e assinada pela advogada ou pelo advogado da Procuradoria.",
"A preliminar depende da lei municipal sobre calçadas, que não foi fornecida."
]
}
Cortado só desta exibição (a resposta salva e a verificação usam o texto inteiro): qualificacao (263 caracteres, 238 mostrados).
O que o passo 5 imprime para ela: Contestação: 02/03/2026 (segunda-feira) - 30 dias úteis, em dobro para a Fazenda Pública
A verificação da página: mantida - nada a sinalizar
analise - Recurso no Juizado sem a data da intimação
A página leu assim: sem data final - faltam premissas; Recurso inominado; falta a data da consulta da intimação no portal.
Entrada (caso tem 1423 caracteres; os primeiros 1398 são mostrados; facts tem 1869 caracteres; os primeiros 1396 são mostrados):
{
"task": "analise",
"caso": "Caso: Recurso inominado contra sentença que negou o dano moral\nPerfil: leigo - Leigo (registro: linguagem acessível, sem juridiquês, exemplos práticos, orientação passo a passo)\nÁrea: consumidor - Consumidor (módulo 7 do guia)\nUF: BA - Bahia; município: Salvador; foro/vara: Juizado Especial Cível\nRito: jec - Juizado Especial Cível (Lei 9.099/1995); autos: eletrônicos\nUrgência: nenhuma\n\nPartes (papel | descrição | qualidade):\n- autor | cliente de uma operadora de telefonia | consumidor\n- ré | operadora de telefonia | pessoa-juridica\n\nRelato:\nFui cobrado por um serviço que nunca contratei e meu nome foi negativado. Entrei no Juizado sem advogado. A sentença mandou cancelar a cobrança, mas negou o dano moral dizendo que eu já tinha uma negativação antiga de outra empresa. Recebi um aviso de que a sentença saiu no portal, mas não sei em que dia a intimação foi aberta.\n\nFatos (data | fato | documento):\n- 05/05/2026 | primeira cobrança do serviço não contratado | fatura\n- 12/06/2026 | nome incluído no cadastro de inadimplentes | consulta ao cadastro\n- 20/07/2026 | reclamação no Procon sem solução | protocolo do Procon\n- 03/08/2026 | ação no Juizado Especial Cível | termo de reclamação\n- 15/10/2026 | sentença: cobrança cancelada, dano moral negado | sentença\n\nReferências do guia para a área (pontos de partida - conferir a vigência e o texto consolidado):\nLei 8.078/1990; Art. 27 CDC;\n\n[... mais 25 caracteres cortados desta exibição ...]",
"prazo": "Ato: Recurso inominado - 10 dias úteis (art. 42 da Lei 9.099/1995)\nPrazo corre para: autor\nIntimação: Portal eletrônico - consultada - data não informada\nDATA FINAL DA PÁGINA: não calculada\nFalta: a data da consulta da intimação no portal",
"carry": "",
"facts": "Verificações da página (0 urgente, 1 falta, 1 conferir, 7 ok, 2 n/a); veredito: sem data final - faltam premissas:\n- Urgência | urgencia | pass | nenhuma urgência declarada\n- Competência | competencia | pass | Bahia, Salvador, Juizado Especial Cível - Juizado Especial Cível (Lei 9.099/1995)\n- Termo inicial | ato | pass | Recurso inominado: 10 dias úteis (art. 42 da Lei 9.099/1995); contagem em dias úteis (art. 12-A da Lei 9.099/1995, incluído pela Lei 13.728/2018)\n- Termo inicial | forma | pass | Intimação eletrônica no portal (art. 5º da Lei 11.419/2006): intimado na data da consulta; a contagem começa no primeiro dia útil seguinte (art. 224 CPC). Regra do CPC aplicada ao rito JEC - conferir.\n- Termo inicial | data | fail | falta a data da consulta da intimação no portal\n- Calendário | calendario | na | sem contagem - o calendário só se aplica com termo inicial\n- Prazo em dobro | dobro | na | no rito JEC a página não dobra prazos\n- Partes vulneráveis | consumidor | warn | autor: vulnerabilidade do consumidor (art. 4º, I, CDC); inversão do ônus da prova quando verossímil (art. 6º, VIII, CDC)\n- Dados pessoais | dados | pass | nenhum CPF, CNPJ, RG, e-mail, telefone ou CEP encontrado\n- A ficha do caso | partes | pass | 2 partes: autor (consumidor(a)), ré (pessoa jurídica)\n- A ficha do caso | fatos | pass | 5 fatos datados\nQualidades sinalizadas pela página: nenhuma.\ndeve: area\n\n[... mais 473 caracteres cortados desta exibição ...]"
}
Resposta (textos longos encurtados para exibição - veja os cortes abaixo):
{
"task": "analise",
"resumo": "A sentença cancelou a cobrança, mas negou o dano moral por causa de uma negativação antiga. O recurso inominado tem 10 dias úteis, mas a página não calculou a data final: falta o dia em que a intimação foi aberta no portal.",
"area": "consumidor",
"perfil": "leigo",
"base_legal": [
{
"norma": "CDC (Lei 8.078/1990)",
"artigo": "art. 14",
"conferir": "A empresa responde pelo defeito do serviço mesmo sem culpa - conferir como o tribunal aplica isso à cobrança de serviço não contratado."
},
{
"norma": "CDC (Lei 8.078/1990)",
"artigo": "art. 6º, VIII",
"conferir": "A inversão do ônus da prova, que o juiz pode conceder quando a sua versão é verossímil."
},
{
"norma": "Lei 9.099/1995",
"artigo": "art. 42",
"conferir": "O recurso inominado em 10 dias, contados em dias úteis (art. 12-A)."
}
],
"competencia": "O recurso é apresentado no próprio Juizado Especial Cível de Salvador e julgado pela Turma Recursal dos Juizados da Bahia.",
"partes": [
{
"papel": "autor",
"qualidade": "consumidor",
"observacao": "Você é a parte mais fraca na relação de consumo (art. 4º, I, CDC) e pode pedir a inversão do ônus da prova (art. 6º, VIII, CDC)."
},
{
"papel": "ré",
"qualidade": "pessoa-juridica",
"observacao": "A operadora responde sem culpa pelo defeito do serviço (art. 14 CDC)."
}
],
"cronologia": [
{
"data": "05/05/2026",
"fato": "Primeira cobrança do serviço que você não contratou (fatura)."
},
{
"data": "12/06/2026",
"fato": "Seu nome foi incluído no cadastro de inadimplentes."
},
{
"data": "20/07/2026",
"fato": "Reclamação no Procon, sem solução."
},
{
"data": "03/08/2026",
"fato": "Ação no Juizado Especial Cível."
},
{
"data": "15/10/2026",
"fato": "Sentença: cobrança cancelada e dano moral negado."
}
],
"merito": {
"forca_direito": "MEDIO",
"prova": "RAZOAVEL",
"porque": "A cobrança indevida já foi reconhecida, mas a Súmula 385 do STJ afasta o dano moral quando existe uma negativação anterior legítima; o recurso só tem chance se mostrar que a negativação antiga era indevida ou já tinha sido retirada - e os [... mais 38 caracteres cortados desta exibição]"
},
"riscos": [
{
"tipo": "prescricao-decadencia",
"nivel": "baixo",
"texto": "Os fatos e a ação são de 2026: não há risco de prescrição (fato do serviço, 5 anos, art. 27 CDC)."
},
{
"tipo": "legitimidade",
"nivel": "baixo",
"texto": "Você é quem foi cobrado e negativado, e a ré é a empresa que cobrou."
},
{
"tipo": "competencia",
"nivel": "baixo",
"texto": "O recurso vai para a Turma Recursal; no Juizado, o recurso exige advogado."
},
{
"tipo": "preclusao",
"nivel": "alto",
"texto": "Se os 10 dias úteis passarem, a sentença fica definitiva e o dano moral não pode mais ser discutido."
}
],
"prazos": [
{
"ato": "Recurso inominado",
"data_final": "não calculado",
"fundamento": "art. 42 da Lei 9.099/1995",
"observacao": "Falta a data da consulta da intimação no portal; com ela, são 10 dias úteis (art. 12-A da Lei 9.099/1995) a partir do dia útil seguinte, e é preciso conferir no tribunal se o recesso de fim de ano se aplica aos juizados."
}
],
"cenarios": {
"otimista": "A Turma Recursal entende que a negativação antiga não era legítima e fixa uma indenização por dano moral.",
"base": "A sentença é mantida: a cobrança fica cancelada, sem dano moral.",
"pessimista": "O recurso não é conhecido por ter sido apresentado fora do prazo ou sem preparo, e você paga custas e honorários do recurso."
},
"custos": [
"Preparo do recurso (custas), salvo gratuidade de justiça",
"Honorários do advogado ou da advogada que assinar o recurso",
"Custas e honorários de sucumbência se o recurso for negado",
"Gratuidade de justiça, se você não puder pagar (art. 98 CPC)"
],
"estrategia": "Procure agora um advogado ou a Defensoria Pública, porque no Juizado o recurso exige advogado; o recurso inominado pede o dano moral mostrando que a negativação antiga era indevida ou já tinha sido retirada.",
"urgencia": [
"Não há medida de urgência, mas o prazo pode já estar correndo: descubra hoje o dia em que a intimação foi aberta no portal."
],
"recomendacao": "acao-judicial",
"proximos_passos": [
"Entre no portal do processo, ou pergunte no balcão do Juizado, e anote o dia em que a intimação da sentença foi aberta.",
"Leve a sentença, as faturas e a consulta ao cadastro à Defensoria Pública ou a um advogado, porque o recurso exige advogado.",
"Reúna a prova de que a negativação antiga era indevida ou já tinha sido retirada antes de 12/06/2026."
],
"fontes_a_conferir": [
"Texto consolidado da Lei 9.099/1995, arts. 12-A e 42",
"Súmula 385 do STJ e a jurisprudência atual sobre negativação anterior",
"Regras do tribunal sobre o recesso de fim de ano nos juizados",
"A certidão de intimação no portal do processo"
],
"ressalvas": [
"Sem a data da intimação a página não calcula a data final: não conte com uma data até conferi-la.",
"A análise depende da sentença e dos documentos da negativação antiga, que não foram fornecidos.",
"Isto é apoio informativo: o recurso deve ser feito por advogado ou advogada, ou pela Defensoria Pública."
]
}
Cortado só desta exibição (a resposta salva e a verificação usam o texto inteiro): merito.porque (276 caracteres, 238 mostrados).
O que o passo 5 imprime para ela: Recurso inominado: não calculado
A verificação da página: mantida - nada a sinalizar
Monte a entrada você mesmo
Carregue o motor no node (global.window = global; require("./prazokit.js"); require("./prazoreply.js")), e então:
const K = PrazoKit, R = PrazoReply;
const f = K.form(Object.assign(K.blank(), { label: "Contestação", area: "civil-danos", perfil: "advogado", relato: "...",
rito: "cpc", ato: "contestacao", intimacao: "dje", intim_data: "15/12/2025", locais: "nenhum" }));
// f.final (DD/MM/AAAA, or "" when the page refuses), f.missing, f.res.table (day by day), K.premises(f), f.rows
// K.easter(2026), K.count(f) - the calendar and the count, directly
const b = K.buildInput(f, "analise"); // or "minuta" (R.laneForm(form, "minuta", analise) fills carry)
const wire = K.toWire(b.input); // POST this to /estimate and /run
// then: const reply = R.normalize(R.parseReply(job.output.output), "analise");
// R.check(reply, b) // {status: kept or flagged, notes}
Pegue um token para os passos abaixo em /tokens.html.
Passo 1 — um cliente mínimo
Uma função que envia JSON e desembrulha a resposta. Cole um token pessoal de /tokens.html, ou deixe vazio e crie um token de convidado no passo 2.
BASE="https://api.skillsafe.ai/v1/app-api"
TOKEN="YOUR_TOKEN" # from https://prazo-certo.skillsafe.ai/tokens.html
api() { # api METHOD PATH [JSON-BODY]
curl -s -X "$1" "$BASE$2" -H "Content-Type: application/json" \
${TOKEN:+-H "Authorization: Bearer $TOKEN"} ${3:+--data "$3"}
}
import json, urllib.request
BASE = "https://api.skillsafe.ai/v1/app-api"
TOKEN = "YOUR_TOKEN" # from https://prazo-certo.skillsafe.ai/tokens.html
def api(method, path, body=None, headers=None):
req = urllib.request.Request(BASE + path, method=method,
data=None if body is None else json.dumps(body).encode(),
headers={"Content-Type": "application/json", **({"Authorization": "Bearer " + TOKEN} if TOKEN else {}), **(headers or {})})
with urllib.request.urlopen(req) as r:
env = json.load(r)
if env.get("error"):
raise RuntimeError(env["error"])
return env["data"]
// prazo-certo.mjs -- Node 18+ (global fetch)
const BASE = "https://api.skillsafe.ai/v1/app-api";
let TOKEN = "YOUR_TOKEN"; // from https://prazo-certo.skillsafe.ai/tokens.html
async function api(method, path, body, headers = {}) {
const r = await fetch(BASE + path, { method, headers: { "Content-Type": "application/json",
...(TOKEN ? { Authorization: "Bearer " + TOKEN } : {}), ...headers },
body: body === undefined ? undefined : JSON.stringify(body) });
const env = await r.json();
if (env.error) throw new Error(env.error.code + ": " + env.error.message);
return env.data;
}
package main
import ("bytes"; "encoding/json"; "fmt"; "net/http")
const base = "https://api.skillsafe.ai/v1/app-api"
var token = "YOUR_TOKEN" // from https://prazo-certo.skillsafe.ai/tokens.html
func api(method, path string, body any, headers map[string]string) (map[string]any, error) {
var buf bytes.Buffer
if body != nil { json.NewEncoder(&buf).Encode(body) }
req, _ := http.NewRequest(method, base+path, &buf)
req.Header.Set("Content-Type", "application/json")
if token != "" { req.Header.Set("Authorization", "Bearer "+token) }
for k, v := range headers { req.Header.Set(k, v) }
res, err := http.DefaultClient.Do(req)
if err != nil { return nil, err }
defer res.Body.Close()
var env struct { Data map[string]any; Error map[string]any }
json.NewDecoder(res.Body).Decode(&env)
if env.Error != nil { return nil, fmt.Errorf("%v", env.Error) }
return env.Data, nil
}
// PrazoCerto.java -- Java 17+, with com.fasterxml.jackson.core:jackson-databind
import com.fasterxml.jackson.databind.*;
import java.net.URI; import java.net.http.*; import java.util.*;
public class PrazoCerto {
static final String BASE = "https://api.skillsafe.ai/v1/app-api";
static String token = "YOUR_TOKEN"; // from https://prazo-certo.skillsafe.ai/tokens.html
static final ObjectMapper M = new ObjectMapper();
static final HttpClient C = HttpClient.newHttpClient();
static JsonNode api(String method, String path, Object body, Map<String, String> headers) throws Exception {
var b = HttpRequest.newBuilder(URI.create(BASE + path)).header("Content-Type", "application/json");
if (!token.isEmpty()) b.header("Authorization", "Bearer " + token);
if (headers != null) headers.forEach(b::header);
b.method(method, body == null ? HttpRequest.BodyPublishers.noBody() : HttpRequest.BodyPublishers.ofString(M.writeValueAsString(body)));
JsonNode env = M.readTree(C.send(b.build(), HttpResponse.BodyHandlers.ofString()).body());
if (env.hasNonNull("error")) throw new RuntimeException(env.get("error").toString());
return env.get("data");
}
}
require "json"
require "net/http"
BASE = "https://api.skillsafe.ai/v1/app-api"
TOKEN = "YOUR_TOKEN" # from https://prazo-certo.skillsafe.ai/tokens.html
def api(method, path, body = nil, headers = {})
uri = URI(BASE + path)
req = Net::HTTPGenericRequest.new(method, !body.nil?, true, uri.request_uri,
{ "Content-Type" => "application/json" }.merge(TOKEN.empty? ? {} : { "Authorization" => "Bearer #{TOKEN}" }).merge(headers))
req.body = JSON.generate(body) unless body.nil?
env = JSON.parse(Net::HTTP.start(uri.host, uri.port, use_ssl: true) { |h| h.request(req) }.body)
raise env["error"].to_s if env["error"]
env["data"]
end
<?php
const BASE = "https://api.skillsafe.ai/v1/app-api";
$TOKEN = "YOUR_TOKEN"; // from https://prazo-certo.skillsafe.ai/tokens.html
function api(string $method, string $path, $body = null, array $headers = []) {
global $TOKEN;
$h = ["Content-Type: application/json"];
if ($TOKEN) $h[] = "Authorization: Bearer $TOKEN";
foreach ($headers as $k => $v) $h[] = "$k: $v";
$ch = curl_init(BASE . $path);
curl_setopt_array($ch, [CURLOPT_CUSTOMREQUEST => $method, CURLOPT_HTTPHEADER => $h, CURLOPT_RETURNTRANSFER => true]);
if ($body !== null) curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($body));
$env = json_decode(curl_exec($ch), true);
if (!empty($env["error"])) throw new Exception(json_encode($env["error"]));
return $env["data"];
}
// Program.cs -- .NET 6+ console app
using System.Net.Http.Json; using System.Text.Json; using System.Text.Json.Nodes;
static class Api {
public const string Base = "https://api.skillsafe.ai/v1/app-api";
public static string Token = "YOUR_TOKEN"; // from https://prazo-certo.skillsafe.ai/tokens.html
static readonly HttpClient C = new();
public static async Task<JsonNode?> Call(string method, string path, object? body = null, Dictionary<string, string>? headers = null) {
var req = new HttpRequestMessage(new HttpMethod(method), Base + path);
if (Token != "") req.Headers.Add("Authorization", "Bearer " + Token);
if (headers != null) foreach (var h in headers) req.Headers.Add(h.Key, h.Value);
if (body != null) req.Content = JsonContent.Create(body);
var env = JsonNode.Parse(await (await C.SendAsync(req)).Content.ReadAsStringAsync())!;
if (env["error"] is JsonNode e && e.GetValueKind() != JsonValueKind.Null) throw new Exception(e.ToJsonString());
return env["data"];
}
}
Passo 2 — um token
Um token de convidado basta para /me e /estimate. Uma execução é medida, então precisa de um token pessoal: entre em /tokens.html e copie de lá.
# a guest token (enough for /me and /estimate); a run needs your personal token from /tokens.html
TOKEN=$(curl -s -X POST "$BASE/guest" -H "Content-Type: application/json" -d '{"slug":"prazo-certo"}' | jq -r '.data.token')
# a guest token (enough for /me and /estimate); a run needs your personal token from /tokens.html
TOKEN = ""
TOKEN = api("POST", "/guest", {"slug": "prazo-certo"})["token"]
// a guest token (enough for /me and /estimate); a run needs your personal token from /tokens.html
TOKEN = "";
TOKEN = (await api("POST", "/guest", { slug: "prazo-certo" })).token;
// inside main: a guest token (enough for /me and /estimate); a run needs your personal token
token = ""
g, err := api("POST", "/guest", map[string]string{"slug": "prazo-certo"}, nil)
if err != nil { panic(err) }
token = g["token"].(string)
// inside main: a guest token (enough for /me and /estimate); a run needs your personal token
token = "";
token = api("POST", "/guest", Map.of("slug", "prazo-certo"), null).get("token").asText();
# a guest token (enough for /me and /estimate); a run needs your personal token from /tokens.html
TOKEN.replace("")
TOKEN.replace(api("POST", "/guest", { slug: "prazo-certo" })["token"])
// a guest token (enough for /me and /estimate); a run needs your personal token from /tokens.html
$TOKEN = "";
$TOKEN = api("POST", "/guest", ["slug" => "prazo-certo"])["token"];
// a guest token (enough for /me and /estimate); a run needs your personal token from /tokens.html
Api.Token = "";
Api.Token = (await Api.Call("POST", "/guest", new { slug = "prazo-certo" }))!["token"]!.GetValue<string>();
Passo 3 — GET /me
De quem é o token (subject_type: user ou guest) e o saldo de créditos.
api GET /me | jq '.data | {subject_type, credits}'
me = api("GET", "/me")
print(me["subject_type"], me.get("credits"))
const me = await api("GET", "/me");
console.log(me.subject_type, me.credits);
me, _ := api("GET", "/me", nil, nil)
fmt.Println(me["subject_type"], me["credits"])
JsonNode me = api("GET", "/me", null, null);
System.out.println(me.get("subject_type") + " " + me.get("credits"));
me = api("GET", "/me")
puts [me["subject_type"], me["credits"]].inspect
$me = api("GET", "/me");
echo $me["subject_type"], " ", $me["credits"] ?? "", "\n";
var me = await Api.Call("GET", "/me");
Console.WriteLine($"{me!["subject_type"]} {me["credits"]}");
Passo 4 — POST /estimate
Grátis. O corpo é a própria entrada da execução, o objeto puro (nunca dentro de {"input": ...}). hold_credits é uma reserva, não o preço; min_credits é o que o saldo precisa cobrir; model_alias mostra gpt-terra.
# input.json: the run input object - {"task": "analise", "caso": "Caso: ... | Perfil: ... | Partes ... | Fatos ...", "prazo": "Ato: ... | DATA FINAL DA PÁGINA: ... | Premissas ...", "carry": "", "facts": "Verificações da página ... | deve: ..."}
# - see the input table
api POST /estimate "$(cat input.json)" | jq '.data | {hold_credits, min_credits, model, model_alias, markup_bps, warnings}'
inp = json.load(open("input.json")) # {"task": "analise", "caso": "Caso: ... | Perfil: ... | Partes ... | Fatos ...", "prazo": "Ato: ... | DATA FINAL DA PÁGINA: ... | Premissas ...", "carry": "", "facts": "Verificações da página ... | deve: ..."}
# - see the input table
est = api("POST", "/estimate", inp)
print(est["hold_credits"], est["min_credits"], est["model"], est.get("warnings"))
import { readFileSync } from "node:fs";
const input = JSON.parse(readFileSync("input.json", "utf8")); // {task: "analise" or "minuta", caso, prazo, carry, facts} (see the input table)
const est = await api("POST", "/estimate", input);
console.log(est.hold_credits, est.min_credits, est.model, est.warnings);
raw, _ := os.ReadFile("input.json") // add "os" to the imports
var input map[string]any
json.Unmarshal(raw, &input)
est, _ := api("POST", "/estimate", input, nil)
fmt.Println(est["hold_credits"], est["min_credits"], est["model"])
Map<String, Object> input = M.readValue(new java.io.File("input.json"), Map.class);
JsonNode est = api("POST", "/estimate", input, null);
System.out.println(est.get("hold_credits") + " " + est.get("min_credits") + " " + est.get("model"));
input = JSON.parse(File.read("input.json"))
est = api("POST", "/estimate", input)
puts [est["hold_credits"], est["min_credits"], est["model"]].inspect
$input = json_decode(file_get_contents("input.json"), true);
$est = api("POST", "/estimate", $input);
echo $est["hold_credits"], " ", $est["min_credits"], " ", $est["model"], "\n";
var input = JsonNode.Parse(File.ReadAllText("input.json"))!;
var est = await Api.Call("POST", "/estimate", input);
Console.WriteLine($"{est!["hold_credits"]} {est["min_credits"]} {est["model"]}");
Passo 5 — POST /run, depois consulte o job
Mande uma Idempotency-Key feita da faixa e da entrada: uma nova tentativa com a mesma chave nunca cobra duas vezes. A página usa prazo-certo:<task>:<inputHash>:a<attempt> - a faixa faz parte da chave, retry_note fica fora do hash - e a sua única nova tentativa automática de formato é um novo número de tentativa, mostrada na página como uma execução a mais. Uma resposta analise traz resumo, area, perfil, base_legal, competencia, partes, cronologia, merito, riscos, prazos, cenarios, custos, estrategia, urgencia, recomendacao, proximos_passos, fontes_a_conferir e ressalvas; uma resposta minuta traz peca, prazo, enderecamento, qualificacao, secoes, pedidos, provas, checklist_protocolo e ressalvas. O código abaixo imprime o essencial de cada uma: cada prazo com a sua data final, ou a peça com o seu prazo.
KEY="prazo-certo:$(jq -r .task input.json):$(shasum -a 256 input.json | cut -c1-16):a1"
JOB=$(curl -s -X POST "$BASE/run" -H "Content-Type: application/json" -H "Authorization: Bearer $TOKEN" \
-H "Idempotency-Key: $KEY" --data @input.json | jq -r '.data.job_id')
while :; do
J=$(api GET "/jobs/$JOB"); S=$(echo "$J" | jq -r '.data.status')
case "$S" in succeeded|failed|cancelled) break;; esac; sleep 2
done
echo "$J" | jq -r '.data.output.output' > reply.json # one JSON object, the reply contract
echo "$J" | jq '.data | {charged_credits, truncated}'
jq -r 'if .task == "minuta" then "\(.peca): \(.prazo)"
else (.prazos[] | "\(.ato): \(.data_final)") end' reply.json
import hashlib, time
key = "prazo-certo:" + inp["task"] + ":" + hashlib.sha256(json.dumps(inp).encode()).hexdigest()[:16] + ":a1"
job = api("POST", "/run", inp, {"Idempotency-Key": key})
while True:
j = api("GET", "/jobs/" + job["job_id"])
if j["status"] in ("succeeded", "failed", "cancelled"):
break
time.sleep(2)
reply = json.loads(j["output"]["output"]) # the reply as one JSON object
print(j["charged_credits"], j.get("truncated"), reply["task"])
if reply["task"] == "minuta":
print(reply["peca"], reply["prazo"])
else:
for x in reply["prazos"]:
print(x["ato"], x["data_final"])
import { createHash } from "node:crypto";
const key = `prazo-certo:${input.task}:${createHash("sha256").update(JSON.stringify(input)).digest("hex").slice(0, 16)}:a1`;
const job = await api("POST", "/run", input, { "Idempotency-Key": key });
let j;
do { await new Promise((r) => setTimeout(r, 2000)); j = await api("GET", "/jobs/" + job.job_id); }
while (!["succeeded", "failed", "cancelled"].includes(j.status));
const reply = JSON.parse(j.output.output);
console.log(j.charged_credits, j.truncated, reply.task);
if (reply.task === "minuta") console.log(reply.peca, reply.prazo);
else { for (const x of reply.prazos) console.log(x.ato, x.data_final); }
sum := sha256.Sum256(raw) // add "crypto/sha256", "encoding/hex", "time" to the imports
key := "prazo-certo:" + input["task"].(string) + ":" + hex.EncodeToString(sum[:8]) + ":a1"
job, _ := api("POST", "/run", input, map[string]string{"Idempotency-Key": key})
var j map[string]any
for {
time.Sleep(2 * time.Second)
j, _ = api("GET", "/jobs/"+job["job_id"].(string), nil, nil)
if s := j["status"]; s == "succeeded" || s == "failed" || s == "cancelled" { break }
}
var reply map[string]any
json.Unmarshal([]byte(j["output"].(map[string]any)["output"].(string)), &reply)
fmt.Println(j["charged_credits"], j["truncated"], reply["task"])
if reply["task"] == "minuta" {
fmt.Println(reply["peca"], reply["prazo"])
} else {
xs, _ := reply["prazos"].([]any)
for _, x := range xs {
xx := x.(map[string]any)
fmt.Println(xx["ato"], xx["data_final"])
}
}
var digest = java.security.MessageDigest.getInstance("SHA-256").digest(M.writeValueAsBytes(input));
String key = "prazo-certo:" + input.get("task") + ":" + HexFormat.of().formatHex(digest, 0, 8) + ":a1";
JsonNode job = api("POST", "/run", input, Map.of("Idempotency-Key", key)), j;
do { Thread.sleep(2000); j = api("GET", "/jobs/" + job.get("job_id").asText(), null, null); }
while (!Set.of("succeeded", "failed", "cancelled").contains(j.get("status").asText()));
JsonNode reply = M.readTree(j.get("output").get("output").asText());
System.out.println(j.get("charged_credits") + " " + reply.path("task").asText());
if (reply.path("task").asText().equals("minuta")) {
System.out.println(reply.path("peca").asText() + " " + reply.path("prazo").asText());
} else {
for (JsonNode x : reply.path("prazos")) System.out.println(x.path("ato").asText() + " " + x.path("data_final").asText());
}
require "digest"
key = "prazo-certo:#{input["task"]}:#{Digest::SHA256.hexdigest(JSON.generate(input))[0, 16]}:a1"
job = api("POST", "/run", input, { "Idempotency-Key" => key })
j = nil
loop do
sleep 2
j = api("GET", "/jobs/#{job["job_id"]}")
break if %w[succeeded failed cancelled].include?(j["status"])
end
reply = JSON.parse(j["output"]["output"])
puts [j["charged_credits"], j["truncated"], reply["task"]].inspect
if reply["task"] == "minuta"
puts "#{reply["peca"]} #{reply["prazo"]}"
else
reply["prazos"].each { |x| puts "#{x["ato"]} #{x["data_final"]}" }
end
$key = "prazo-certo:" . $input["task"] . ":" . substr(hash("sha256", json_encode($input)), 0, 16) . ":a1";
$job = api("POST", "/run", $input, ["Idempotency-Key" => $key]);
do { sleep(2); $j = api("GET", "/jobs/" . $job["job_id"]); }
while (!in_array($j["status"], ["succeeded", "failed", "cancelled"]));
$reply = json_decode($j["output"]["output"], true);
echo $j["charged_credits"], " ", $reply["task"], "\n";
if ($reply["task"] === "minuta") { echo $reply["peca"], " ", $reply["prazo"], "\n"; }
else { foreach ($reply["prazos"] as $x) echo $x["ato"], " ", $x["data_final"], "\n"; }
var digest = System.Security.Cryptography.SHA256.HashData(System.Text.Encoding.UTF8.GetBytes(input.ToJsonString()));
var key = $"prazo-certo:{input["task"]}:{Convert.ToHexString(digest, 0, 8).ToLowerInvariant()}:a1";
var job = await Api.Call("POST", "/run", input, new() { ["Idempotency-Key"] = key });
JsonNode j;
do { await Task.Delay(2000); j = (await Api.Call("GET", "/jobs/" + job!["job_id"]))!; }
while (!new[] { "succeeded", "failed", "cancelled" }.Contains(j["status"]!.GetValue<string>()));
var reply = JsonNode.Parse(j["output"]!["output"]!.GetValue<string>())!;
var task = (string?)reply["task"];
Console.WriteLine($"{j["charged_credits"]} {task}");
if (task == "minuta") Console.WriteLine($"{reply["peca"]} {reply["prazo"]}");
else { foreach (var x in reply["prazos"]!.AsArray()) Console.WriteLine($"{x!["ato"]} {x["data_final"]}"); }
Passo 6 — POST /run-stream
A mesma execução como Server-Sent Events, com o mesmo input.json. Navegadores recebem ticks de progresso em vez de pedaços de texto; o evento final done traz a resposta.
# Server-Sent Events: tick/delta events while the job runs, then a final event with the job
curl -N -s -X POST "$BASE/run-stream" -H "Content-Type: application/json" -H "Authorization: Bearer $TOKEN" \
-H "Idempotency-Key: prazo-certo:$(jq -r .task input.json):$(shasum -a 256 input.json | cut -c1-16):a1" --data @input.json
rev = json.load(open("input.json")) # the same run input as input.json: {"task": "analise", "caso": "Caso: ... | Perfil: ... | Partes ... | Fatos ...", "prazo": "Ato: ... | DATA FINAL DA PÁGINA: ... | Premissas ...", "carry": "", "facts": "Verificações da página ... | deve: ..."}
# - see the input table
req = urllib.request.Request(BASE + "/run-stream", method="POST", data=json.dumps(rev).encode(),
headers={"Content-Type": "application/json", "Authorization": "Bearer " + TOKEN,
"Idempotency-Key": "prazo-certo:" + rev["task"] + ":" + hashlib.sha256(json.dumps(rev).encode()).hexdigest()[:16] + ":a1"})
with urllib.request.urlopen(req) as r:
for line in r:
line = line.decode().strip()
if line.startswith("data:"):
print(line[5:].strip()[:200])
const rev = JSON.parse(readFileSync("input.json", "utf8"));
const r = await fetch(BASE + "/run-stream", { method: "POST", body: JSON.stringify(rev), headers: {
"Content-Type": "application/json", Authorization: "Bearer " + TOKEN,
"Idempotency-Key": `prazo-certo:${rev.task}:${createHash("sha256").update(JSON.stringify(rev)).digest("hex").slice(0, 16)}:a1` } });
const dec = new TextDecoder();
for await (const chunk of r.body) for (const line of dec.decode(chunk).split("\n"))
if (line.startsWith("data:")) console.log(line.slice(5).trim().slice(0, 200));
rraw, _ := os.ReadFile("input.json") // add "bufio", "strings" to the imports
rs := sha256.Sum256(rraw)
req, _ := http.NewRequest("POST", base+"/run-stream", bytes.NewReader(rraw))
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Authorization", "Bearer "+token)
req.Header.Set("Idempotency-Key", "prazo-certo:"+input["task"].(string)+":"+hex.EncodeToString(rs[:8])+":a1")
res, _ := http.DefaultClient.Do(req)
sc := bufio.NewScanner(res.Body)
for sc.Scan() { if l := sc.Text(); strings.HasPrefix(l, "data:") { fmt.Println(l[5:]) } }
String rev = java.nio.file.Files.readString(java.nio.file.Path.of("input.json"));
var rd = java.security.MessageDigest.getInstance("SHA-256").digest(rev.getBytes());
var sreq = HttpRequest.newBuilder(URI.create(BASE + "/run-stream")).header("Content-Type", "application/json")
.header("Authorization", "Bearer " + token).header("Idempotency-Key", "prazo-certo:" + input.get("task") + ":" + HexFormat.of().formatHex(rd, 0, 8) + ":a1")
.POST(HttpRequest.BodyPublishers.ofString(rev)).build();
C.send(sreq, HttpResponse.BodyHandlers.ofLines()).body().filter(l -> l.startsWith("data:")).forEach(System.out::println);
rev = File.read("input.json")
uri = URI(BASE + "/run-stream")
req = Net::HTTP::Post.new(uri, "Content-Type" => "application/json", "Authorization" => "Bearer #{TOKEN}",
"Idempotency-Key" => "prazo-certo:#{JSON.parse(rev)["task"]}:#{Digest::SHA256.hexdigest(rev)[0, 16]}:a1")
req.body = rev
Net::HTTP.start(uri.host, uri.port, use_ssl: true) do |h|
h.request(req) { |res| res.read_body { |chunk| chunk.each_line { |l| puts l if l.start_with?("data:") } } }
end
$rev = file_get_contents("input.json");
$ch = curl_init(BASE . "/run-stream");
curl_setopt_array($ch, [CURLOPT_POST => true, CURLOPT_POSTFIELDS => $rev, CURLOPT_HTTPHEADER => [
"Content-Type: application/json", "Authorization: Bearer $TOKEN",
"Idempotency-Key: prazo-certo:" . json_decode($rev, true)["task"] . ":" . substr(hash("sha256", $rev), 0, 16) . ":a1"],
CURLOPT_WRITEFUNCTION => function ($ch, $chunk) { foreach (explode("\n", $chunk) as $l) if (str_starts_with($l, "data:")) echo $l, "\n"; return strlen($chunk); }]);
curl_exec($ch);
var rev = File.ReadAllText("input.json");
var rd = System.Security.Cryptography.SHA256.HashData(System.Text.Encoding.UTF8.GetBytes(rev));
var sreq = new HttpRequestMessage(HttpMethod.Post, Api.Base + "/run-stream") { Content = new StringContent(rev, System.Text.Encoding.UTF8, "application/json") };
sreq.Headers.Add("Authorization", "Bearer " + Api.Token);
sreq.Headers.Add("Idempotency-Key", $"prazo-certo:{input["task"]}:{Convert.ToHexString(rd, 0, 8).ToLowerInvariant()}:a1");
using var http = new HttpClient();
using var res = await http.SendAsync(sreq, HttpCompletionOption.ResponseHeadersRead);
using var rdr = new StreamReader(await res.Content.ReadAsStreamAsync());
for (string? l; (l = await rdr.ReadLineAsync()) != null;) if (l.StartsWith("data:")) Console.WriteLine(l);