{"openapi":"3.1.0","info":{"title":"Plataforma de pesquisas — núcleo","description":"API interna. Sessão por cookie.","license":{"name":"UNLICENSED","identifier":"UNLICENSED"},"version":"0.1.0"},"paths":{"/api/eu":{"get":{"tags":["auth"],"summary":"Quem sou eu.","operationId":"eu","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Usuario"}}}},"401":{}}}},"/api/jobs":{"get":{"tags":["jobs"],"summary":"Últimos 50 jobs (admin).","operationId":"listar","responses":{"200":{"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/JobResumo"}}}}}}},"post":{"tags":["jobs"],"summary":"Enfileira um job (admin). Tipos hoje: ping, s3_saude.","operationId":"enfileirar","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NovoJob"}}},"required":true},"responses":{"202":{}}}},"/api/pesquisas":{"get":{"tags":["catalogo"],"summary":"Lista pesquisas visíveis ao usuário.","operationId":"listar_pesquisas","responses":{"200":{"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Pesquisa"}}}}}}},"post":{"tags":["catalogo"],"summary":"Cria uma pesquisa (admin ou supervisor).","operationId":"criar_pesquisa","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NovaPesquisa"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Pesquisa"}}}},"409":{}}}},"/api/pesquisas/{id}/rodadas":{"get":{"tags":["catalogo"],"summary":"Rodadas de uma pesquisa.","operationId":"listar_rodadas","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Rodada"}}}}}}},"post":{"tags":["catalogo"],"summary":"Cria uma rodada (admin ou supervisor).","operationId":"criar_rodada","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NovaRodada"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Rodada"}}}}}}},"/api/rodadas/{id}":{"patch":{"tags":["ingestao"],"summary":"Atualiza status (planejada | em_campo | encerrada) e campos de ingestão da rodada (admin/supervisor).","operationId":"atualizar_rodada","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AtualizarRodada"}}},"required":true},"responses":{"204":{}}}},"/api/rodadas/{id}/sincronizar":{"post":{"tags":["ingestao"],"summary":"Enfileira uma sincronização agora (admin/supervisor), sem esperar o agendador.","operationId":"sincronizar","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"202":{}}}},"/api/rodadas/{id}/sombra":{"get":{"tags":["ingestao"],"summary":"Contagens da sombra: o que já ingerimos × o que a origem informa.","operationId":"sombra","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Sombra"}}}}}}},"/api/rodadas/{id}/submissoes":{"get":{"tags":["ingestao"],"summary":"Últimas submissões da rodada (sem o conteúdo das respostas).","operationId":"submissoes","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"limite","in":"query","required":false,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SubmissaoResumo"}}}}}}}},"/api/saude":{"get":{"tags":["saude"],"summary":"Saúde do núcleo: banco e S3. Sem autenticação, para o Uptime Kuma.","operationId":"saude","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Saude"}}}}}}},"/api/submissoes/{id}/audio":{"get":{"tags":["ingestao"],"summary":"Link assinado (15 min) para ouvir a gravação de uma submissão. Exige sessão e acesso à pesquisa.","operationId":"audio","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkAudio"}}}},"404":{}}}},"/auth/callback":{"get":{"tags":["auth"],"summary":"Volta do Google: valida estado e nonce, resolve o usuário e abre a sessão.","operationId":"callback","responses":{"303":{"description":"redireciona à raiz"}}}},"/auth/dev":{"post":{"tags":["auth"],"summary":"Login de desenvolvimento (e-mail + AUTH_DEV_PASSWORD). Só existe quando a variável está definida.","operationId":"login_dev","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginDev"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Usuario"}}}}}}},"/auth/login":{"get":{"tags":["auth"],"summary":"Começa o login pelo Google Workspace. Responde 404 quando o OIDC não está configurado.","operationId":"login","responses":{"303":{"description":"redireciona ao Google"}}}},"/auth/logout":{"post":{"tags":["auth"],"summary":"Encerra a sessão.","operationId":"logout","responses":{"204":{}}}}},"components":{"schemas":{"AtualizarRodada":{"type":"object","properties":{"campo_agente":{"type":["string","null"]},"campo_interacao":{"type":["string","null"]},"campo_rodada":{"type":["string","null"]},"status":{"type":["string","null"]},"valor_rodada":{"type":["string","null"]}}},"JobResumo":{"type":"object","required":["id","tipo","payload","tentativas","proxima_execucao"],"properties":{"concluido_em":{"type":["string","null"]},"erro":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"payload":{},"proxima_execucao":{"type":"string"},"resultado":{},"tentativas":{"type":"integer","format":"int32"},"tipo":{"type":"string"}}},"LinkAudio":{"type":"object","required":["url","validade_s","status"],"properties":{"status":{"type":"string"},"url":{"type":"string"},"validade_s":{"type":"integer","format":"int64","minimum":0}}},"LoginDev":{"type":"object","required":["email","senha"],"properties":{"email":{"type":"string"},"senha":{"type":"string"}}},"NovaPesquisa":{"type":"object","required":["codigo","nome"],"properties":{"cliente":{"type":"string"},"codigo":{"type":"string"},"nome":{"type":"string"},"tipo":{"type":"string"}}},"NovaRodada":{"type":"object","required":["rotulo","plataforma","form_ref"],"properties":{"fim":{"type":["string","null"]},"form_ref":{"type":"string"},"inicio":{"type":["string","null"]},"plataforma":{"type":"string"},"rotulo":{"type":"string"}}},"NovoJob":{"type":"object","required":["tipo"],"properties":{"payload":{},"tipo":{"type":"string"}}},"Pesquisa":{"type":"object","required":["id","codigo","nome","cliente","tipo","ativo","criado_em"],"properties":{"ativo":{"type":"boolean"},"cliente":{"type":"string"},"codigo":{"type":"string"},"criado_em":{"type":"string"},"id":{"type":"string","format":"uuid"},"nome":{"type":"string"},"tipo":{"type":"string"}}},"Rodada":{"type":"object","required":["id","pesquisa_id","rotulo","plataforma","form_ref","status"],"properties":{"fim":{"type":["string","null"]},"form_ref":{"type":"string"},"id":{"type":"string","format":"uuid"},"inicio":{"type":["string","null"]},"pesquisa_id":{"type":"string","format":"uuid"},"plataforma":{"type":"string"},"rotulo":{"type":"string"},"status":{"type":"string"}}},"Saude":{"type":"object","required":["ok","banco","s3","versao"],"properties":{"banco":{"type":"string"},"ok":{"type":"boolean"},"s3":{"type":"string"},"versao":{"type":"string"}}},"Sombra":{"type":"object","required":["rodada_id","rotulo","status","plataforma","form_ref","nossas_submissoes","com_interacao","removidas_na_origem","audios_ok","audios_pendentes","audios_falhos","vinculos_ok","vinculos_sem"],"properties":{"audios_falhos":{"type":"integer","format":"int64"},"audios_ok":{"type":"integer","format":"int64"},"audios_pendentes":{"type":"integer","format":"int64"},"com_interacao":{"type":"integer","format":"int64"},"cursor":{"type":["string","null"]},"form_ref":{"type":"string"},"nossas_submissoes":{"type":"integer","format":"int64"},"plataforma":{"type":"string"},"removidas_na_origem":{"type":"integer","format":"int64"},"rodada_id":{"type":"string","format":"uuid"},"rotulo":{"type":"string"},"status":{"type":"string"},"total_origem":{"type":["integer","null"],"format":"int32"},"ultima_sincronizacao":{"type":["string","null"]},"ultima_submissao":{"type":["string","null"]},"ultimo_erro":{"type":["string","null"]},"vinculos_ok":{"type":"integer","format":"int64"},"vinculos_sem":{"type":"integer","format":"int64"}}},"SubmissaoResumo":{"type":"object","required":["id","instance_id","submitted_at","campos"],"properties":{"agente":{"type":["string","null"]},"campos":{"type":"integer","format":"int32"},"id":{"type":"string","format":"uuid"},"instance_id":{"type":"string"},"interacao_id":{"type":["string","null"]},"submitted_at":{"type":"string"},"versao_form":{"type":["string","null"]}}},"Usuario":{"type":"object","required":["id","email","nome","papel","ativo"],"properties":{"ativo":{"type":"boolean"},"email":{"type":"string"},"id":{"type":"string","format":"uuid"},"nome":{"type":"string"},"papel":{"type":"string"}}}}},"tags":[{"name":"saude"},{"name":"auth"},{"name":"catalogo"},{"name":"ingestao"},{"name":"jobs"}]}