{"openapi":"3.1.0","info":{"title":"API pública da Associação VEM","version":"1.0.0","summary":"Cursos, projetos, blog e relatórios de transparência da Associação VEM (ONG de São Paulo).","description":"API REST somente leitura do site da Associação VEM (Vontade, Educação e Mudança), ONG do bairro de Santana, em São Paulo.\n\nUse para listar cursos e projetos com horários e valores, ler publicações do blog e baixar os relatórios mensais e anuais de transparência.\n\n- Não exige autenticação para as rotas descritas aqui.\n- Respostas em JSON; listas são paginadas (`docs`, `totalDocs`, `page`, `totalPages`, `hasNextPage`...).\n- Filtros seguem a sintaxe `where[campo][operador]=valor` do Payload CMS.\n- Não há limite de requisições publicado. Faça cache das respostas (o conteúdo muda poucas vezes por semana) e evite rajadas.\n- Inscrições, doações e mensagens são feitas pelas páginas do site; essas ações não fazem parte desta API pública.","contact":{"name":"Associação VEM","email":"contato@associacaovem.org.br","url":"https://www.associacaovem.org.br/contato"}},"externalDocs":{"description":"Guia para desenvolvedores e agentes","url":"https://www.associacaovem.org.br/developers"},"servers":[{"url":"https://www.associacaovem.org.br/api","description":"Produção"}],"tags":[{"name":"Projetos","description":"Cursos, oficinas, terapias e projetos culturais oferecidos pela associação."},{"name":"Blog","description":"Publicações do blog (somente as publicadas)."},{"name":"Transparência","description":"Relatórios mensais de atividades e relatórios anuais com gestão financeira."},{"name":"Institucional","description":"Dados de contato e redes sociais da associação."}],"paths":{"/projetos":{"get":{"operationId":"listProjetos","tags":["Projetos"],"summary":"Listar cursos e projetos","description":"Lista os cursos e projetos da associação, com descrição, categoria, dias, horários, taxa de inscrição e contribuição mensal. Use `where[slug][equals]` para buscar um projeto pelo endereço da página (/projetos/{slug}).","parameters":[{"$ref":"#/components/parameters/Limit"},{"$ref":"#/components/parameters/Page"},{"$ref":"#/components/parameters/Sort"},{"$ref":"#/components/parameters/Depth"},{"name":"where[slug][equals]","in":"query","required":false,"description":"Filtra pelo slug do projeto.","schema":{"type":"string"},"example":"arteterapia"},{"name":"where[category][equals]","in":"query","required":false,"description":"Filtra pela categoria.","schema":{"type":"string","enum":["cultural","educacao","saude","geracao-de-renda","terapias-integrativas","projetos"]}}],"responses":{"200":{"description":"Página de projetos.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjetoList"}}}}}}},"/projetos/{id}":{"get":{"operationId":"getProjeto","tags":["Projetos"],"summary":"Obter um projeto","description":"Retorna um curso ou projeto pelo id numérico.","parameters":[{"$ref":"#/components/parameters/Id"},{"$ref":"#/components/parameters/Depth"}],"responses":{"200":{"description":"O projeto.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Projeto"}}}},"404":{"description":"Documento não encontrado.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/posts":{"get":{"operationId":"listPosts","tags":["Blog"],"summary":"Listar publicações do blog","description":"Lista as publicações do blog. Só aparecem as publicadas. Ordene por `-publishedAt` para ver as mais recentes primeiro.","parameters":[{"$ref":"#/components/parameters/Limit"},{"$ref":"#/components/parameters/Page"},{"$ref":"#/components/parameters/Sort"},{"$ref":"#/components/parameters/Depth"},{"name":"where[slug][equals]","in":"query","required":false,"description":"Filtra pelo slug da publicação.","schema":{"type":"string"}},{"name":"where[category][equals]","in":"query","required":false,"description":"Filtra pela categoria.","schema":{"type":"string","enum":["noticias","historias","educacao","cultura","capacitacao","bem-estar","eventos"]}}],"responses":{"200":{"description":"Página de publicações.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PostList"}}}}}}},"/posts/{id}":{"get":{"operationId":"getPost","tags":["Blog"],"summary":"Obter uma publicação","description":"Retorna uma publicação do blog pelo id numérico.","parameters":[{"$ref":"#/components/parameters/Id"},{"$ref":"#/components/parameters/Depth"}],"responses":{"200":{"description":"A publicação.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Post"}}}},"404":{"description":"Documento não encontrado.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/relatorios":{"get":{"operationId":"listRelatorios","tags":["Transparência"],"summary":"Listar relatórios de transparência","description":"Lista os relatórios em PDF: mensais (atividades do mês) e anuais (balanço do ano com gestão financeira). O campo `url` aponta para o PDF. Ordene por `-referenceDate` para ver os mais recentes.","parameters":[{"$ref":"#/components/parameters/Limit"},{"$ref":"#/components/parameters/Page"},{"$ref":"#/components/parameters/Sort"},{"name":"where[reportType][equals]","in":"query","required":false,"description":"Filtra pelo tipo de relatório.","schema":{"type":"string","enum":["mensal","anual"]}}],"responses":{"200":{"description":"Página de relatórios.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RelatorioList"}}}}}}},"/relatorios/{id}":{"get":{"operationId":"getRelatorio","tags":["Transparência"],"summary":"Obter um relatório","description":"Retorna os dados de um relatório pelo id numérico (título, tipo, mês de referência, descrição e link do PDF).","parameters":[{"$ref":"#/components/parameters/Id"}],"responses":{"200":{"description":"O relatório.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Relatorio"}}}},"404":{"description":"Documento não encontrado.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/relatorios/file/{filename}":{"get":{"operationId":"downloadRelatorio","tags":["Transparência"],"summary":"Baixar o PDF de um relatório","description":"Baixa o arquivo PDF de um relatório. O nome do arquivo vem do campo `filename` (ex.: relatorio-mensal-vem-2025-01.pdf).","parameters":[{"name":"filename","in":"path","required":true,"description":"Nome do arquivo do relatório.","schema":{"type":"string","pattern":"^[A-Za-z0-9._-]+\\.pdf$"},"example":"relatorio-mensal-vem-2025-01.pdf"}],"responses":{"200":{"description":"O PDF do relatório.","content":{"application/pdf":{"schema":{"type":"string","format":"binary"}}}},"404":{"description":"Arquivo não encontrado."}}}},"/globals/configuracoes":{"get":{"operationId":"getConfiguracoes","tags":["Institucional"],"summary":"Obter contatos da associação","description":"Retorna e-mail, telefone, link de WhatsApp, endereço e redes sociais da associação.","parameters":[{"$ref":"#/components/parameters/Depth"}],"responses":{"200":{"description":"Configurações públicas do site.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Configuracoes"}}}}}}}},"components":{"parameters":{"Limit":{"name":"limit","in":"query","required":false,"description":"Itens por página (padrão 10).","schema":{"type":"integer","minimum":1,"maximum":100,"default":10}},"Page":{"name":"page","in":"query","required":false,"description":"Número da página (começa em 1).","schema":{"type":"integer","minimum":1,"default":1}},"Sort":{"name":"sort","in":"query","required":false,"description":"Campo de ordenação; prefixe com `-` para ordem decrescente (ex.: `-referenceDate`, `order`).","schema":{"type":"string"}},"Depth":{"name":"depth","in":"query","required":false,"description":"Quantos níveis de relações popular (0 = só ids; 1 = inclui imagens). Padrão 2.","schema":{"type":"integer","minimum":0,"maximum":3,"default":2}},"Id":{"name":"id","in":"path","required":true,"description":"Id numérico do documento.","schema":{"type":"integer","minimum":1}}},"schemas":{"Error":{"type":"object","description":"Erro no formato do Payload CMS.","properties":{"errors":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}},"required":["errors"]},"Pagination":{"type":"object","description":"Campos de paginação comuns a todas as listas.","properties":{"totalDocs":{"type":"integer"},"limit":{"type":"integer"},"totalPages":{"type":"integer"},"page":{"type":"integer"},"pagingCounter":{"type":"integer"},"hasPrevPage":{"type":"boolean"},"hasNextPage":{"type":"boolean"},"prevPage":{"type":["integer","null"]},"nextPage":{"type":["integer","null"]}},"required":["totalDocs","limit","totalPages","page","hasPrevPage","hasNextPage"]},"RichText":{"type":"object","description":"Conteúdo formatado no formato JSON do editor Lexical (raiz em `root.children`).","properties":{"root":{"type":"object"}}},"Media":{"type":"object","description":"Imagem (presente quando `depth` ≥ 1).","properties":{"id":{"type":"integer"},"alt":{"type":"string"},"url":{"type":"string","description":"Caminho da imagem; prefixe com o domínio do site."},"width":{"type":["integer","null"]},"height":{"type":["integer","null"]},"mimeType":{"type":["string","null"]}},"required":["id"]},"ImageRef":{"description":"Id da imagem (depth = 0) ou a imagem completa.","oneOf":[{"type":"integer"},{"$ref":"#/components/schemas/Media"}]},"Projeto":{"type":"object","description":"Curso, oficina, terapia ou projeto cultural.","properties":{"id":{"type":"integer"},"title":{"type":"string"},"slug":{"type":"string","description":"Endereço da página: /projetos/{slug}."},"excerpt":{"type":"string","description":"Resumo curto."},"category":{"type":"string","enum":["cultural","educacao","saude","geracao-de-renda","terapias-integrativas","projetos"]},"categoryLabel":{"type":["string","null"]},"content":{"oneOf":[{"$ref":"#/components/schemas/RichText"},{"type":"null"}]},"targetAudience":{"type":["string","null"],"description":"Público."},"whatYouDevelop":{"type":["string","null"]},"benefits":{"type":["array","null"],"items":{"type":"object","properties":{"title":{"type":"string"},"text":{"type":"string"}}}},"startDate":{"type":["string","null"],"description":"Início (texto livre)."},"frequency":{"type":["string","null"]},"duration":{"type":["string","null"]},"weekdays":{"type":["string","null"],"description":"Dias da semana."},"time":{"type":["string","null"],"description":"Horário."},"schedule":{"type":["array","null"],"items":{"type":"object","properties":{"day":{"type":"string"},"time":{"type":"string"}}}},"enrollmentFee":{"type":["string","null"],"description":"Taxa de inscrição (texto livre)."},"monthlyFee":{"type":["string","null"],"description":"Contribuição mensal (texto livre)."},"observation":{"type":["string","null"]},"coverImage":{"$ref":"#/components/schemas/ImageRef"},"active":{"type":["boolean","null"]},"featured":{"type":["boolean","null"]},"order":{"type":["integer","null"]},"updatedAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"}},"required":["id","title","slug","category"]},"ProjetoList":{"allOf":[{"$ref":"#/components/schemas/Pagination"},{"type":"object","properties":{"docs":{"type":"array","items":{"$ref":"#/components/schemas/Projeto"}}},"required":["docs"]}]},"Post":{"type":"object","description":"Publicação do blog.","properties":{"id":{"type":"integer"},"title":{"type":"string"},"slug":{"type":"string","description":"Endereço da página: /blog/{slug}."},"excerpt":{"type":"string"},"category":{"type":["string","null"],"enum":["noticias","historias","educacao","cultura","capacitacao","bem-estar","eventos",null]},"content":{"$ref":"#/components/schemas/RichText"},"publishedAt":{"type":["string","null"],"format":"date-time"},"coverImage":{"$ref":"#/components/schemas/ImageRef"},"featured":{"type":["boolean","null"]},"updatedAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"}},"required":["id","title","slug"]},"PostList":{"allOf":[{"$ref":"#/components/schemas/Pagination"},{"type":"object","properties":{"docs":{"type":"array","items":{"$ref":"#/components/schemas/Post"}}},"required":["docs"]}]},"Relatorio":{"type":"object","description":"Relatório de transparência em PDF.","properties":{"id":{"type":"integer"},"title":{"type":"string","example":"Relatório mensal — Janeiro/2025"},"reportType":{"type":"string","enum":["mensal","anual"]},"referenceDate":{"type":"string","format":"date-time","description":"Mês (mensal) ou ano (anual) de referência."},"description":{"type":["string","null"]},"url":{"type":"string","description":"Caminho do PDF; prefixe com o domínio do site."},"filename":{"type":"string"},"mimeType":{"type":"string","example":"application/pdf"},"filesize":{"type":"integer","description":"Tamanho em bytes."},"updatedAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"}},"required":["id","title","reportType","referenceDate","url","filename"]},"RelatorioList":{"allOf":[{"$ref":"#/components/schemas/Pagination"},{"type":"object","properties":{"docs":{"type":"array","items":{"$ref":"#/components/schemas/Relatorio"}}},"required":["docs"]}]},"Configuracoes":{"type":"object","description":"Contatos e redes sociais da associação.","properties":{"email":{"type":["string","null"]},"phone":{"type":["string","null"]},"whatsapp":{"type":["string","null"],"description":"Link para conversar no WhatsApp."},"address":{"type":["string","null"]},"mapsUrl":{"type":["string","null"]},"instagram":{"type":["string","null"]},"facebook":{"type":["string","null"]},"youtube":{"type":["string","null"]}}}}}}