openapi: 3.0.3 info: title: Procure Aqui - API de Vagas description: > API para publicar e consultar vagas de emprego no Procure Aqui. Existem dois grupos de operações: publicação (criar/apagar vagas) e consulta (listar/ler vagas publicadas). Cada chave de API só pode usar as operações do tipo para que foi criada. version: "1.0.0" contact: name: Procure Aqui url: https://www.procureaqui.net servers: - url: https://www.procureaqui.net/wp-json/procure-aqui/v1 description: Produção security: - ApiKeyAuth: [] paths: /jobs: post: summary: Publicar uma vaga description: > Cria uma nova vaga, ou atualiza uma já existente se o campo 'external_id' corresponder a uma vaga anteriormente publicada com a mesma chave. Chaves do tipo 'interno' publicam de imediato; chaves do tipo 'parceiro' ficam pendentes de aprovação manual. operationId: criarVaga requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/NovaVaga' example: title: Desenvolvedor Backend description: Responsabilidades e requisitos da vaga... company_name: Empresa X company_email: rh@empresa.co.ao company_website: https://empresa.co.ao location: Luanda, Talatona application: rh@empresa.co.ao category_id: 4 job_type_id: 2 external_id: vaga-123-plataforma-origem responses: '201': description: Vaga criada ou atualizada. content: application/json: schema: $ref: '#/components/schemas/VagaCriada' '401': $ref: '#/components/responses/NaoAutorizado' '422': $ref: '#/components/responses/CampoInvalido' get: summary: Listar vagas publicadas description: Devolve vagas publicadas, com filtros e paginação. operationId: listarVagas parameters: - name: search in: query description: Pesquisa livre no título/conteúdo da vaga. schema: { type: string } - name: location in: query description: Filtra por localização (comparação parcial). schema: { type: string } example: Luanda - name: category in: query description: Slug da categoria da vaga. schema: { type: string } - name: job_type in: query description: Slug do tipo de contrato. schema: { type: string } - name: page in: query schema: { type: integer, default: 1, minimum: 1 } - name: per_page in: query schema: { type: integer, default: 20, maximum: 50 } responses: '200': description: Lista de vagas. content: application/json: schema: $ref: '#/components/schemas/ListaVagas' '401': $ref: '#/components/responses/NaoAutorizado' /jobs/{id}: parameters: - name: id in: path required: true schema: { type: integer } get: summary: Consultar uma vaga específica operationId: obterVaga responses: '200': description: Detalhe da vaga. content: application/json: schema: $ref: '#/components/schemas/VagaDetalhe' '401': $ref: '#/components/responses/NaoAutorizado' '404': $ref: '#/components/responses/NaoEncontrado' delete: summary: Apagar (mover para o lixo) uma vaga description: Só é possível apagar vagas publicadas pela mesma chave de API. operationId: apagarVaga responses: '200': description: Vaga apagada. content: application/json: schema: type: object properties: deleted: { type: boolean, example: true } '401': $ref: '#/components/responses/NaoAutorizado' '403': $ref: '#/components/responses/SemPermissao' '404': $ref: '#/components/responses/NaoEncontrado' components: securitySchemes: ApiKeyAuth: type: apiKey in: header name: X-API-Key description: > Chave gerada em Vagas > Chaves de API no painel do WordPress. Tipo 'interno' ou 'parceiro' para publicar; tipo 'consulta' ou 'interno' para consultar. schemas: NovaVaga: type: object required: [title, description, company_name, company_email, location, application] properties: title: { type: string, example: Desenvolvedor Backend } description: { type: string, example: Responsabilidades e requisitos... } company_name: { type: string, example: Empresa X } company_email: { type: string, format: email, example: rh@empresa.co.ao } company_website: { type: string, format: uri, example: https://empresa.co.ao } location: { type: string, example: Luanda, Talatona } application: { type: string, description: Email ou instrução para candidatura, example: rh@empresa.co.ao } category_id: { type: integer, description: ID da categoria (taxonomia job_listing_category) } job_type_id: { type: integer, description: ID do tipo de contrato (taxonomia job_listing_type) } external_id: { type: string, description: ID da vaga na plataforma de origem, para permitir atualização sem duplicar. } VagaCriada: type: object properties: id: { type: integer, example: 482 } status: { type: string, enum: [publish, pending], example: pending } link: { type: string, format: uri } ListaVagas: type: object properties: jobs: type: array items: { $ref: '#/components/schemas/VagaResumo' } page: { type: integer } per_page: { type: integer } total: { type: integer } total_pages: { type: integer } VagaResumo: type: object properties: id: { type: integer } title: { type: string } company_name: { type: string } location: { type: string } category: { type: array, items: { type: string } } job_type: { type: array, items: { type: string } } link: { type: string, format: uri } date_published: { type: string, format: date-time } VagaDetalhe: allOf: - $ref: '#/components/schemas/VagaResumo' - type: object properties: description: { type: string } company_website: { type: string } application: { type: string } Erro: type: object properties: code: { type: string, example: pa_unauthorized } message: { type: string, example: Chave de API em falta, inválida ou sem permissão. } responses: NaoAutorizado: description: Chave de API em falta, inválida, revogada ou sem permissão para esta operação. content: application/json: schema: { $ref: '#/components/schemas/Erro' } SemPermissao: description: A chave usada não tem permissão sobre este recurso. content: application/json: schema: { $ref: '#/components/schemas/Erro' } NaoEncontrado: description: Vaga não encontrada. content: application/json: schema: { $ref: '#/components/schemas/Erro' } CampoInvalido: description: Um ou mais campos obrigatórios estão em falta ou são inválidos. content: application/json: schema: { $ref: '#/components/schemas/Erro' }