openapi: 3.1.0

info:
  title: API VaaS /Vagas as a Service/
  version: "1.0.0"
  description: |
    O VaaS /Vagas as a Service/ é um verdadeiro agente de recrutamento para permitir que
    qualquer software possa usar a Vaga Inteligente.

    Com o **VaaS**, clientes da **Vagas** que utilizam outros softwares podem publicar vagas automaticamente no **Vagas.com Empresas** por meio de uma chamada HTTP em formato **JSON**.
    Diferente do processo tradicional de publicação, essa API permite incluir uma **URL externa** na vaga, redirecionando os candidatos para outro sistema no momento em que clicarem para se candidatar.

    Outro diferencial do **VaaS** é que, caso o cliente utilize um parceiro para realizar publicações, esse parceiro poderá efetuar a chamada **em nome da empresa** dentro do sistema Vagas.com Empresas. Isso possibilita que ele publique vagas representando terceiros, desde que autorizado, utilizando os dados da empresa representada na requisição da API.

    ## Requisitos Técnicos

    **Entrega dos dados**
    - Contrato: JSON
    - Formato: JSON, UTF-8
    - Autenticação: OAuth2/API Key
    - Tráfego: TLS 1.2
    - Proteções: CSRF, Rate limit , WAF

    **Requisitos do cliente**
    - TLS suportado, versões de HTTP (1.2)
    - Timeouts/retries desejados
    - User-Agent identificável. Ex:  X-Idempotency-Key/X-Client-Id/X-Tenant-Id

    ## Autenticação

    A autenticação para utilização desta API pode ser feita de 02 maneiras:

    - Client Credencials
      - A vaga será criada com o usuário de identificação _Admin_ como responsável
    - Autorization Code (3-legged)
      - A vaga será criada com o usuário informado na autorização como responsável

    ### Client Credencials

    Esse processo consiste em uma chamada POST direto ao gateway indicando as credencias para obter o token de acesso.

    Considerando que as credencias foram criadas no gateway, basta realizar uma chamada conforme o exemplo:

    ```
    curl -X POST -k -H 'Content-Type: application/x-www-form-urlencoded' -i 'https://apigateway.vagas.com.br/oauth/token' --data 'grant_type=client_credentials' -u 'client_id:client_secret'
    ```

    O retorno dessa execução será:

    ```json
    {
      "access_token": "asd23sde12e123sd",
      "expires_in": 2591999,
      "token_type": "Bearer"
    }
    ```

    Para todas as demais requisições abaixo, o __access\_token__ deve ser
    incluído na requisição como um atributo do HEADER em formato BEARER

    Lembrando que o __access\_token__ tem um limite de tempo para uso, a informação retornada
    na chave __expires\_in__ indica a quantidades de segundos que o token será expirado a partir de sua data de geração.

    __Exemplo de chamada usando o __access\_token__:__

    ```shell
    # Valor exemplo que deve ser incluido no HEADER da requisição:
    # Authorization: Bearer asd23sde12e123sd
    CURL example:
    curl -XGET <URL TBD>
        --header “Authorization: Bearer asd23sde12e123sd”
    ```

    ### Authorization Code (Three-Legged OAuth)

    Este processo implementa a especificação __OAuth 2.0__ para autenticação e autorização.

    A autenticação utiliza o fluxo __Authorization Code (Three-Legged OAuth)__, no qual o sistema cliente direciona o usuário (cadastrado no Vagas.com) para o servidor de autorização da API da Vagas.

    #### Obtenção do Token de Acesso

    Para iniciar o processo de autenticação, a aplicação cliente deve realizar uma requisição para o endpoint __/oauth/authorize__ da API da Vagas.
    A requisição deve incluir os seguintes parâmetros:

    - __client_id__: Identificador da aplicação fornecido pela Vagas.
    - __login_type__: Tipo de autenticação utilizada. Deve ser enviado o valor “empresa”.
    - __response_type__: Tipo de resposta esperada. Deve ser enviado o valor “code” para utilização do fluxo Authorization Code.
    - __redirect_uri__: URL previamente cadastrada para a aplicação, para a qual o usuário será redirecionado após a conclusão do processo de autenticação, independentemente de sucesso ou falha.

    __Exemplo:__
    ```
    https://apigateway.vagas.com.br/oauth/authorize?response_type=code&client_id=some_application_id&login_type=empresa&redirect_uri=http%3A%2F%2Flocalhost%2Foauth%2Fcode_callback
    ```

    O usuário deverá autenticar-se utilizando suas credenciais de acesso e conceder autorização para que a aplicação utilize as suas informações para acessar os recursos disponibilizados pela API da Vagas.

    Após a autenticação e a confirmação da autorização pelo usuário, o servidor de autorização da API da Vagas redirecionará o navegador para a URL informada no parâmetro __redirect_uri__, incluindo um __código de autorização (authorization code)__ na resposta.

    __Exemplo:__
    ```
    http://localhost/oauth/code_callback?code=AixUbVTop239876
    ```

    Em caso de falha na autenticação ou autorização, o servidor redirecionará a requisição para a mesma URL informada no parâmetro __redirect_uri__, incluindo o parâmetro de erro na resposta.

    __Exemplo:__
    ```
    http://localhost/oauth/code_callback?error=unauthorized-request
    ```

    Com base no __authorization code__ retornado na etapa anterior, a aplicação cliente deverá solicitar um __access token__, que será utilizado para autenticar todas as requisições subsequentes à API.

    Para isso, deve ser realizada uma requisição HTTP __POST__ para o endpoint __/oauth/token__, utilizando o formato __application/x-www-form-urlencoded__.

    - __code__: Código de autorização obtido na etapa anterior.
    - __grant_type__: Tipo de concessão OAuth. Deve ser enviado com o valor “authorization_code”.

    Também deve ser incluído no cabeçalho da requisição (__HEADER__) um atributo contendo as credenciais de autenticação, composto pelo __client_id__ e __client_secret__, concatenados por dois pontos (:), e codificados em __Base64__

    __Exemplo:__

    - __client_id__: "exemplo"
    - __client_secret__: "emi40QrBjUiPaVC2eGK5"
    - A concatenação dos valores será: __exemplo:emi40QrBjUiPaVC2eGK5__
    - Após a codificação em Base64, o resultado será: __ZXhlbXBsbzplbWk0MFFyQmpVaVBhVkMyZUdLNQ==__

    Esse valor deve ser enviado no header da requisição utilizando o esquema __Basic Authentication__, conforme abaixo:
    __Authorization: Basic ZXhlbXBsbzplbWk0MFFyQmpVaVBhVkMyZUdLNQ==__

    __Exemplo:__

    ```shell
    curl -XPOST https://apigateway.vagas.com.br/oauth/token \
        --header “Authorization: Basic ZXhlbXBsbzplbWk0MFFyQmpVaVBhVkMyZUdLNQ==” \
        --data “code=AixUbVTop239876&grant_type=authorization_code”
    ```

    _Em caso de sucesso, o retorno da requisição será:_
    ```json
     {
       "access_token": "asd23sde12e123sd",
       "expired_in": 2591999
     }
    ```

    Para todas as demais requisições, o __access_token__ deverá ser incluído no __HEADER__ da requisição utilizando o esquema __Bearer__.

    É importante ressaltar que o __access_token__ __possui tempo de expiração__. O valor retornado no campo __expires_in__ indica a quantidade de segundos em que o token permanecerá válido a partir do momento de sua geração.

    __Exemplo:__

    ```shell
    # Valor exemplo que deve ser incluido no HEADER da requisição:
    # Authorization: Bearer asd23sde12e123sd
    CURL example:
    curl -XGET <URL TBD>
        --header “Authorization: Bearer asd23sde12e123sd”
    ```

servers:
  - url: https://apigateway.vagas.com.br/v1

security:
  - OAuth2: []

tags:
  - name: VaaS
  - name: Listas
    description: Endpoints para retorno de informções necessárias para criação da vaga.

paths:
  /job-posting/vaas/{id}:
    post:
      tags: [VaaS]
      summary: Publicar Vaga
      operationId: publicarVagaVaas
      description: |
        Endpoint para publicar vaga no sistema Vagas.com Empresas no contexto VaaS.

        Os atributos *cargo*, *descrição do anuncio* e *outros requisitos do anúncio* aceitam algumas _tags_ HTML para formatação do texto, as opções permitidas estão listadas abaixo.

        *Tags HTML permitidas*:

        - span
        - br
        - p
        - ul
        - ol
        - li
        - b
        - i
        - u
        - strong
        - em
        - div
        - h1
        - h2
        - h3
        - h4
        - h5
        - h6
      parameters:
        - name: id
          in: path
          required: true
          description: |
            Hash identificador da empresa representada (`hash_representado` no documento
            original). Nesta operação o segmento identifica a empresa, não a vaga.
          schema: { type: string }
          example: abc123xyz
      requestBody:
        required: true
        content:
          application/json:
            schema: { $ref: '#/components/schemas/VaasJobCreateParams' }
      responses:
        "200":
          description: OK
          content:
            application/json:
              schema: { $ref: '#/components/schemas/Job' }

    patch:
      tags: [VaaS]
      summary: Atualizar Vaga
      operationId: atualizarVagaVaas
      description: |
        Endpoint para atualização parcial de uma vaga publicada pelo VaaS.

        Somente os campos permitidos para atualização podem ser enviados na requisição.
        Caso seja enviado um campo cuja alteração não seja permitida, a API retornará
        uma mensagem informando que o campo não é editável.
      parameters:
        - name: id
          in: path
          required: true
          description: Identificador da vaga que será atualizada.
          schema: { type: integer }
          example: 123456
      requestBody:
        required: true
        content:
          application/json:
            schema: { $ref: '#/components/schemas/VaasJobUpdateParams' }
      responses:
        "200":
          description: OK

  /job-posting/vaas/{id}/{representado_hash_id}:
    patch:
      tags: [VaaS]
      summary: Atualizar Vaga Representada
      operationId: atualizarVagaRepresentadaVaas
      description: |
        Endpoint para atualização parcial de uma vaga publicada no contexto VaaS
        em nome de uma empresa representada.

        Somente os campos permitidos para atualização podem ser enviados na requisição.
        Caso seja enviado um campo cuja alteração não seja permitida, a API retornará
        uma mensagem informando que o campo não é editável.
      parameters:
        - name: id
          in: path
          required: true
          description: Identificador da vaga que será atualizada.
          schema: { type: integer }
          example: 123456
        - name: representado_hash_id
          in: path
          required: true
          description: Hash identificador da empresa representada.
          schema: { type: string }
          example: abc123xyz
      requestBody:
        required: true
        content:
          application/json:
            schema: { $ref: '#/components/schemas/VaasJobUpdateParams' }
      responses:
        "200":
          description: OK

  /job-posting/vaas/{hash_representado}/{cod_vaga}/suspend:
    patch:
      tags: [VaaS]
      summary: Suspender Vaga
      operationId: suspenderVagaVaas
      description: Endpoint para suspender uma vaga publicada no contexto VaaS.
      parameters:
        - $ref: '#/components/parameters/HashRepresentado'
        - name: cod_vaga
          in: path
          required: true
          schema: { type: integer }
          example: 27000
      responses:
        "200":
          description: OK
          content:
            application/json:
              schema: { $ref: '#/components/schemas/Suspend' }

  /job-posting/presentations/{hash_representado}:
    get:
      tags: [Listas]
      summary: Apresentações
      operationId: apresentacoes
      parameters:
        - $ref: '#/components/parameters/HashRepresentado'
      responses:
        "200":
          description: OK
          content:
            application/json:
              schema:
                type: array
                items: { $ref: '#/components/schemas/Presentations' }

  /dominios/setores:
    get:
      tags: [Listas]
      summary: Áreas de Atuação
      operationId: areasDeAtuacao
      responses:
        "200":
          description: OK
          content:
            application/json:
              schema:
                type: array
                items: { $ref: '#/components/schemas/Area' }

  /job-posting/benefits/{hash_representado}:
    get:
      tags: [Listas]
      summary: Beneficíos
      operationId: beneficios
      parameters:
        - $ref: '#/components/parameters/HashRepresentado'
      responses:
        "200":
          description: OK
          content:
            application/json:
              schema:
                type: array
                items: { $ref: '#/components/schemas/Benefit' }

  /job-posting/partner_channels:
    get:
      tags: [Listas]
      summary: Canais de publicação
      operationId: canaisDePublicacao
      responses:
        "200":
          description: OK
          content:
            application/json:
              schema:
                type: array
                items: { $ref: '#/components/schemas/PartnerChannels' }

  /dominios/paises/{pais_id}/estados/{estado_id}/cidades:
    get:
      tags: [Listas]
      summary: Cidades
      operationId: cidades
      parameters:
        - name: pais_id
          in: path
          required: true
          description: Identificação do país
          schema: { type: integer }
          example: 999
        - name: estado_id
          in: path
          required: true
          description: Identificação do estado
          schema: { type: integer }
          example: 999
        - name: nome
          in: query
          required: false
          description: busca pelo nome da cidade
          schema: { type: string }
          example: Sao Paulo
        - name: nome_exato
          in: query
          required: false
          description: busca pelo nome exato da cidade
          schema: { type: boolean }
          example: true
        - name: descricao
          in: query
          required: false
          description: busca pela descrição da cidade
          schema: { type: string }
          example: Sao Paulo/SP/BR
      responses:
        "200":
          description: OK
          content:
            application/json:
              schema:
                type: array
                items: { $ref: '#/components/schemas/City' }

  /job-posting/divisions/{hash_representado}:
    get:
      tags: [Listas]
      summary: Divisões da Empresa
      operationId: divisoesDaEmpresa
      parameters:
        - $ref: '#/components/parameters/HashRepresentado'
      responses:
        "200":
          description: OK
          content:
            application/json:
              schema:
                type: array
                items: { $ref: '#/components/schemas/Divisions' }

  /dominios/paises/{pais_id}/estados:
    get:
      tags: [Listas]
      summary: Estados
      operationId: estados
      parameters:
        - name: pais_id
          in: path
          required: true
          description: Identificação do país
          schema: { type: integer }
          example: 999
      responses:
        "200":
          description: OK
          content:
            application/json:
              schema:
                type: array
                items: { $ref: '#/components/schemas/StateResponse' }

  /job-posting/phases/{hash_representado}:
    get:
      tags: [Listas]
      summary: Fases
      operationId: fases
      parameters:
        - $ref: '#/components/parameters/HashRepresentado'
      responses:
        "200":
          description: OK
          content:
            application/json:
              schema:
                type: array
                items: { $ref: '#/components/schemas/Phases' }

  /dominios/idiomas:
    get:
      tags: [Listas]
      summary: Idiomas
      operationId: idiomas
      parameters:
        - name: nome
          in: query
          required: false
          description: nome do idioma ou apenas o começo do nome
          schema: { type: string }
          example: Espanhol
      responses:
        "200":
          description: OK
          content:
            application/json:
              schema:
                type: array
                items: { $ref: '#/components/schemas/Language' }

  /dominios/modelos-locais-trabalho:
    get:
      tags: [Listas]
      summary: Locais de Trabalho
      operationId: locaisDeTrabalho
      responses:
        "200":
          description: OK
          content:
            application/json:
              schema:
                type: array
                items: { $ref: '#/components/schemas/WorkLocation' }

  /dominios/niveis_de_escolaridade:
    get:
      tags: [Listas]
      summary: Níveis de Escolaridade
      operationId: niveisDeEscolaridade
      responses:
        "200":
          description: OK
          content:
            application/json:
              schema:
                type: array
                items: { $ref: '#/components/schemas/LevelOfSchooling' }

  /dominios/niveis_hierarquicos:
    get:
      tags: [Listas]
      summary: Níveis Hierárquicos
      operationId: niveisHierarquicos
      responses:
        "200":
          description: OK
          content:
            application/json:
              schema:
                type: array
                items: { $ref: '#/components/schemas/HierarchicalLevels' }

  /dominios/paises:
    get:
      tags: [Listas]
      summary: Paises
      operationId: paises
      parameters:
        - name: associacoes
          in: query
          required: false
          description: |
            Estende as possíveis associações de países: tipos de documento e estados. Por exemplo, se desejar obter os documentos associados a um país, o parâmetro associacoes[]=tipos_de_documento deve ser informado
          schema:
            type: array
            items: { type: string }
          example: ["tipos_de_documento", "estado"]
      responses:
        "200":
          description: OK
          content:
            application/json:
              schema:
                type: array
                items: { $ref: '#/components/schemas/Country' }

  /dominios/modelos-contratuais:
    get:
      tags: [Listas]
      summary: Tipo de contratação
      operationId: tipoDeContratacao
      responses:
        "200":
          description: OK
          content:
            application/json:
              schema:
                type: array
                items: { $ref: '#/components/schemas/ContractModel' }

components:
  securitySchemes:
    OAuth2:
      type: oauth2
      description: |
        Ver **Autenticação** acima. O __access_token__ deverá ser incluído no __HEADER__
        da requisição utilizando o esquema __Bearer__.
      flows:
        clientCredentials:
          tokenUrl: https://apigateway.vagas.com.br/oauth/token
          scopes: {}
        authorizationCode:
          authorizationUrl: https://apigateway.vagas.com.br/oauth/authorize
          tokenUrl: https://apigateway.vagas.com.br/oauth/token
          scopes: {}

  parameters:
    HashRepresentado:
      name: hash_representado
      in: path
      required: true
      description: Hash identificador da empresa representada.
      schema: { type: string }
      example: abc123xyz

  schemas:
    IdAndDescription:
      type: object
      properties:
        id: { type: integer, example: 999 }
        descricao: { type: string, example: Uma descrição }

    Area:
      $ref: '#/components/schemas/IdAndDescription'

    ContractModel:
      $ref: '#/components/schemas/IdAndDescription'

    HierarchicalLevels:
      $ref: '#/components/schemas/IdAndDescription'

    Benefit:
      type: object
      properties:
        id: { type: integer, example: 34 }
        descricao: { type: string, example: Horário flexível }
        permite_valor: { type: boolean, example: false }

    BenefitParams:
      type: object
      required: [id]
      properties:
        id: { type: integer, example: 2 }
        valor: { type: number, example: 80 }

    City:
      type: object
      properties:
        id: { type: integer, example: 1 }
        nome: { type: string, example: Sao Paulo }
        descricao: { type: string, example: Sao Paulo/SP/BR }
        latitude: { type: number, example: 1.5 }
        longitude: { type: number, example: 1.8 }
        lat: { type: number, example: 23.5475 }
        lng: { type: number, example: 46.63611111111111 }
        capital: { type: boolean, example: true }
        estado_id: { type: integer, example: 128 }
        pais_id: { type: integer, example: 128 }

    Country:
      type: object
      properties:
        id: { type: integer, example: 31 }
        sigla: { type: string, example: BR }
        nome: { type: string, example: Brazil }
        codigo_telefonico: { type: string, example: "55" }
        estados:
          type: array
          items: { $ref: '#/components/schemas/State' }
        tipos_de_documento:
          type: array
          items: { $ref: '#/components/schemas/DocumentType' }

    Divisions:
      type: object
      properties:
        id: { type: integer, example: 72590 }
        nome: { type: string, example: Recrutamento Interno }

    DocumentType:
      type: object
      properties:
        id: { type: integer, example: 38 }
        pais_id: { type: integer, example: 3 }
        nome: { type: string, example: Passport (AFG) }

    Form:
      type: object
      properties:
        id: { type: integer, example: 312065 }
        identificacao:
          type: string
          example: Teste de língua portuguesa - VAGAS - Resultado

    FormsResponse:
      type: object
      properties:
        total: { type: integer, example: 173 }
        total_paginas: { type: integer, example: 18 }
        pagina_atual: { type: integer, example: 5 }
        tamanho_pagina: { type: integer, example: 10 }
        fichas:
          type: array
          items: { $ref: '#/components/schemas/Form' }

    JobModel:
      allOf:
        - $ref: '#/components/schemas/IdAndDescription'
        - type: object
          properties:
            data_criacao: { type: string, example: "2021-09-03T16:58:48-03:00" }
            titulo: { type: string, example: Analista Suporte Teste Aline }

    JobModelResponse:
      type: object
      properties:
        total: { type: integer, example: 173 }
        total_paginas: { type: integer, example: 18 }
        pagina_atual: { type: integer, example: 5 }
        anuncios:
          type: array
          items: { $ref: '#/components/schemas/JobModel' }

    Language:
      type: object
      properties:
        id:
          type: integer
          example: 999
          description: Identificador único do elemento na tabela
        nome:
          type: string
          example: nome de identificação
          description: Nome informado para o item da entidade

    LanguageParams:
      type: object
      required: [id, nivel_id]
      properties:
        id: { type: integer, example: 534 }
        nivel_id:
          type: integer
          enum: [1, 2, 3, 4, 5]
          example: 5
          description: |
            - 1 - não tem
            - 2 - Básico
            - 3 - Intermediário
            - 4 - Avançado
            - 5 - Fluente

    LevelOfSchooling:
      type: object
      properties:
        id: { type: integer, example: 999 }
        descricao: { type: string, example: Uma descrição }
        ordenacao: { type: integer, example: 25 }
        tipo: { type: string, example: ensino_medio }

    PartnerChannels:
      type: object
      properties:
        id: { type: integer, example: 1 }
        nome: { type: string, example: Linkedin }
        texto:
          type: string
          example: Fundado em 2003, o LinkedIn conecta os profissionais do mundo ...

    Phases:
      type: object
      properties:
        id: { type: integer, example: 1 }
        nome: { type: string, example: vaga teste }
        sigla: { type: string, example: VAGTEST }
        ordem: { type: integer, example: 2 }

    Presentations:
      type: object
      properties:
        id: { type: integer, example: 1 }
        nome_template: { type: string, example: Programa de Trainee }
        descricao: { type: string, example: Descrição da empresa }
        nome_empresa: { type: string, example: Empresa XPTO }
        confidencial: { type: boolean, example: false }

    State:
      type: object
      properties:
        id: { type: integer, example: 1 }
        nome: { type: string, example: Acre }
        pais_id: { type: integer, example: 31 }
        sigla_pais: { type: string, example: BR }

    StateResponse:
      type: object
      properties:
        id:
          type: integer
          example: 999
          description: Identificador único do elemento na tabela
        nome:
          type: string
          example: nome de identificação
          description: Nome informado para o item da entidade
        descricao:
          type: string
          example: Uma descrição
          description: |
            Descrição associada com o elemento, pode ter com valores diferentes dependendo da internacionalização, mas é a mesma informação
        sigla: { type: string, example: SP }

    WorkLocation:
      type: object
      properties:
        id: { type: integer, example: 1 }
        tipo: { type: string, example: home_office }
        nome: { type: string, example: 100% Home Office }

    Suspend:
      type: object
      properties:
        id: { type: integer, example: 27000 }
        suspend: { type: boolean, example: true }

    LocalAceitaCandidaturas:
      type: string
      enum: [somente_cidade, cidades_proximas, qualquer_cidade]
      example: cidades_proximas
      description: |
        Enum com o local de onde aceita candidatura, apenas da cidade, cidades próximas ou
        qualquer cidade. Se o valor for `somente_cidade`, aceita candidatos que tenham cadastrado
        a cidade da vaga na região de interesse com a opção "Usar meu endereço" ligada. Se o valor
        for `cidades_proximas`, aceita candidatos que tenham cadastrado a cidade da vaga na região
        de interesse com a opção "Usar meu endereço" ligada que sejam próximas da cidade da vaga
        (distância de até 50 Km). Se o valor for `qualquer_cidade`, aceita candidatos de tenham
        cadastrado a cidade da vaga na região de interesse.

    VaasJobCreateParams:
      type: object
      required: [url_externa, cargo, benefícios_txt, periodo_de_inscricao]
      properties:
        url_externa:
          type: string
          example: http://urlexternadavag.com/
        fases_ids:
          type: array
          items: { type: integer }
          example: [999, 999]
          description: |
            IDs das fases que a vaga terá, os ids podem ser obtidos no endpoint `/v1/job-posting/phases`.
            Caso não seja enviado, será assumida a fase de `ordem` 1 cadastrada no ambiente da empresa.
        notificar:
          type: array
          items: { type: string }
          example: ["contato@empresa.com", "rh@email.com"]
          description: Lista de emails para notificar quando a vaga for publicada
        cargo: { type: string, example: Engenheiro, description: Titulo da vaga }
        cargo_exclusivo_pcd: { type: boolean, example: false }
        tipo_de_contratacao_id:
          type: integer
          example: 999
          description: |
            Id do tipo de contratação. Pode ser obtido no endpoint `/v1/dominios/modelos-contratuais`.
            Caso não seja enviado, será assumido "CLT" (id 1).
        numero_de_posicoes:
          type: integer
          example: 1
          description: |
            Número de posições abertas para a vaga.
            Caso não seja enviado, será assumido o valor 1.
        idiomas:
          type: array
          items: { $ref: '#/components/schemas/LanguageParams' }
          description: |
            Idiomas necessários para a vaga, as opções podem ser obtidas no endpoint
            `/v1/dominios/idiomas`
        beneficios:
          type: array
          items: { $ref: '#/components/schemas/BenefitParams' }
          description: |
            Os IDs podem ser obtidos por meio do endpoint v1/job-posting/benefits.
            Um mesmo benefício não pode ser adicionado mais de uma vez à mesma vaga. Caso este campo seja enviado, o campo “beneficios_txt” não deve ser enviado na requisição.
        benefícios_txt:
          type: string
          example: Benefits text
          description: |
            Este campo deve ser utilizado para o envio dos benefícios em formato de texto livre. Caso este campo seja enviado, o campo “benefícios” não deve ser enviado na requisição.
        anuncio:
          type: object
          required: [descricao]
          properties:
            descricao: { type: string, example: Descrição da vaga }
            outros_requisitos: { type: string, example: Ter certificação em Inglês }
        salario:
          type: object
          required: [exibir_salario_no_anuncio]
          description: |
            Caso o objeto inteiro não seja enviado, será assumido salário "a combinar"
            (`tipo_moeda`: `BRL`, `faixa_salario_min`: `0.0`, `faixa_salario_max`: `0.0`,
            `exibir_salario_no_anuncio`: `false`). Caso seja enviado, todos os 4 atributos abaixo
            devem ser enviados - o envio parcial retorna erro.
          properties:
            tipo_moeda:
              type: string
              enum: [BRL, USD]
              example: BRL
              description: |
                Moeda em que será pago o salário, se `exibir_salario_no_anuncio` for true,
                esse campo é obrigatório
            faixa_salario_min:
              type: number
              example: 999
              description: |
                Valor minimo da faixa de salário, se `exibir_salario_no_anuncio` for true,
                esse campo é obrigatório
            faixa_salario_max:
              type: number
              example: 999
              description: |
                Valor máximo da faixa de salário, se `exibir_salario_no_anuncio` for true,
                esse campo é obrigatório
            exibir_salario_no_anuncio:
              type: boolean
              example: true
              description: Se false o salário será a combinar
        pre_requisitos:
          type: object
          required: [nivel_hierarquico_id, areas_de_atuacao_ids]
          properties:
            escolaridade_minima_id:
              type: integer
              example: 1
              description: |
                Nível mínimo de escolaridade, o id pode ser obtido no endpoint
                `v1/dominios/niveis_de_escolaridade`
                Caso a escolaridade seja indiferente para a vaga passe o valor "-1".
                Caso não seja enviado, será assumido "-1" (Indiferente).
            nivel_hierarquico_id:
              type: integer
              example: 3
              description: |
                Nivel hieraquico da vaga. O id pode ser obtido no endpoint
                `/v1/dominios/niveis_hierarquicos`
            aceitar_candidaturas_outras_areas:
              type: boolean
              example: true
              description: Se true, a vaga aceitará candidaturas de outras áreas de atuação
            areas_de_atuacao_ids:
              type: array
              items: { type: integer }
              example: [4, 6, 10]
              description: |
                Areas de atuação da vaga. Os ids podem ser obtidos no endpoint
                `/v1/dominios/setores`
        atuacao:
          type: object
          required: [local_de_trabalho]
          properties:
            modelo_de_trabalho:
              type: integer
              example: 4
              description: |
                Modelo de local de trabalho. O id pode ser obtido no endpoint
                `/v1/dominios/modelos-locais-trabalho`.
                Caso não seja enviado, será assumido "Presencial" (id 1).
            aceitar_candidaturas:
              deprecated: true
              description: DEPRECATED
            local_aceita_candidaturas: { $ref: '#/components/schemas/LocalAceitaCandidaturas' }
            local_de_trabalho:
              type: object
              properties:
                pais_id:
                  type: integer
                  example: 999
                  description: Id pode ser oobtido no endpoint `/v1/dominios/paises/`.
                estado_id:
                  type: integer
                  example: 999
                  description: Id pode ser oobtido no endpoint `/v1/dominios/paises/:pais_id/estados`.
                cidade_id:
                  type: integer
                  example: 999
                  description: Id pode ser obtido no endpoint `/v1/dominios/paises/:pais_id/estados/:estado_id/cidades`.
        sobre_a_empresa:
          type: object
          properties:
            anuncio_confidencial:
              type: boolean
              example: false
              description: |
                Se o valor for true, o nome da empresa não aparecerá na descrição da vaga.
                Caso não seja enviado, será assumido `false`.
            apresentacao_da_empresa:
              type: integer
              example: 999
              description: |
                Caso não seja enviado (e `anuncio_confidencial` for `false`), será assumida a
                apresentação de maior id cadastrada no ambiente da empresa.
        periodo_de_inscricao:
          type: object
          required: [data_inicio]
          properties:
            data_inicio: { type: string, example: "2024/01/01" }
            veiculacao_suspensa: { type: boolean, example: false }
        acesso_restrito:
          type: object
          properties:
            vaga_restrita:
              type: boolean
              example: false
              description: Deve ser sempre falso. Caso não seja enviado, será assumido `false`.
        canais_de_divulgacao:
          type: object
          properties:
            divisao_id:
              type: integer
              example: 999
              description: |
                Divisão da vaga. O id pode ser obtido pelo endpoint `/v1/job-posting/divisions`.
                Caso não seja enviado, será assumida a divisão de menor id cadastrada no ambiente
                da empresa que não seja do tipo Recrutamento Interno. Caso não haja nenhuma divisão
                elegível, a requisição retornará erro.
            parceiros_ids:
              type: array
              items: { type: integer }
              example: [999]
        vaga_inteligente:
          type: boolean
          example: true
          description: |
            Caso não seja enviado, será assumido `true`. O contexto VaaS não permite o envio
            explícito do valor `false`.

    VaasJobUpdateParams:
      type: object
      properties:
        url_externa: { type: string, example: https://empresa.com.br/vaga/123 }
        cargo: { type: string, example: Desenvolvedor Ruby }
        cargo_exclusivo_pcd: { type: boolean, example: false }
        tipo_de_contratacao_id: { type: integer, example: 1 }
        idiomas:
          type: array
          items: { $ref: '#/components/schemas/LanguageParams' }
        beneficios:
          type: array
          items: { $ref: '#/components/schemas/BenefitParams' }
          description: |
            Um mesmo benefício não pode ser adicionado mais de uma vez à vaga.
            Caso este campo seja enviado, o campo `beneficios_txt` não deve
            ser enviado na requisição.
        beneficios_txt:
          type: string
          example: Vale-refeição, plano de saúde e vale-transporte
          description: |
            Texto livre contendo os benefícios da vaga.
            Caso este campo seja enviado, o campo `beneficios` não deve ser
            enviado na requisição.
        anuncio:
          type: object
          properties:
            descricao: { type: string, example: Descrição atualizada da vaga }
            outros_requisitos: { type: string, example: Outros requisitos da vaga }
        salario:
          type: object
          properties:
            tipo_moeda: { type: string, example: BRL }
            faixa_salario_min: { type: number, example: 5000 }
            faixa_salario_max: { type: number, example: 8000 }
            exibir_salario_no_anuncio: { type: boolean, example: true }
        pre_requisitos:
          type: object
          properties:
            escolaridade_minima_id: { type: integer, example: 1 }
            nivel_hierarquico_id: { type: integer, example: 40 }
            aceitar_candidaturas_outras_areas: { type: boolean, example: false }
            areas_de_atuacao_ids:
              type: array
              items: { type: integer }
              example: [1, 2]
        atuacao:
          type: object
          properties:
            modelo_de_trabalho: { type: integer, example: 1 }
            local_aceita_candidaturas:
              type: string
              enum: [somente_cidade, cidades_proximas, qualquer_cidade]
              example: cidades_proximas
            local_de_trabalho:
              type: object
              required: [pais_id, estado_id, cidade_id]
              properties:
                pais_id: { type: integer, example: 31 }
                estado_id: { type: integer, example: 35 }
                cidade_id: { type: integer, example: 3550308 }
        sobre_a_empresa:
          type: object
          properties:
            anuncio_confidencial: { type: boolean, example: false }
            apresentacao_da_empresa: { type: integer, example: 999 }
        canais_de_divulgacao:
          type: object
          properties:
            divisao_id: { type: integer, example: 999 }
            parceiros_ids:
              type: array
              items: { type: integer }
              example: [1, 2]

    Job:
      type: object
      properties:
        id: { type: integer, example: 2505124 }
        cargo_exclusivo_pcd: { type: boolean, example: false }
        cargo: { type: string, example: Analista de crédito }
        numero_de_posicoes: { type: integer, example: 2 }
        tipo_de_contratacao_id: { type: integer, example: 4 }
        funcionario_id: { type: integer, example: 17742 }
        empresa_id: { type: integer, example: 12702 }
        data_criacao: { type: string, example: "2023-05-03T11:13:34-03:00" }
        fases_ids:
          type: array
          items: { type: integer }
          example: [469731, 649710, 641396]
        canais_de_divulgacao:
          type: object
          properties:
            divisao_id: { type: integer, example: 67518 }
            parceiros_ids:
              type: array
              items: { type: integer }
              example: [11, 10]
        acesso_restrito:
          type: object
          properties:
            vaga_restrita: { type: boolean, example: false }
        sobre_a_empresa:
          type: object
          properties:
            anuncio_confidencial: { type: boolean, example: false }
            apresentacao_da_empresa: { type: integer, example: 139 }
        anuncio:
          type: object
          properties:
            descricao: { type: string, example: Descrição da Vaga }
            outros_requisitos: { type: string, example: sem comentários }
        periodo_de_inscricao:
          type: object
          properties:
            data_inicio: { type: string, example: "2023-05-03" }
            data_fim: { type: string, example: "2023-05-03T21:00:00-03:00" }
            veiculacao_suspensa: { type: boolean, example: false }
        salario:
          type: object
          properties:
            tipo_moeda:
              type: string
              enum: [BRL, USD]
              example: BRL
            faixa_salario_min: { type: number, example: 1500 }
            faixa_salario_max: { type: number, example: 2000 }
            exibir_salario_no_anuncio: { type: boolean, example: true }
        idiomas:
          type: array
          items:
            type: object
            properties:
              id: { type: integer, example: 20 }
              nivel_id: { type: integer, example: 2 }
        pre_requisitos:
          type: object
          properties:
            escolaridade_minima_id: { type: integer, example: 60 }
            nivel_hierarquico_id: { type: integer, example: 40 }
            areas_de_atuacao_ids:
              type: array
              items: { type: integer }
              example: [70, 1, 124]
        atuacao:
          type: object
          properties:
            modelo_de_trabalho: { type: integer, example: 2 }
            local_aceita_candidaturas:
              type: string
              enum: [somente_cidade, cidades_proximas, qualquer_cidade]
              example: somente_cidade
            local_de_trabalho:
              type: object
              properties:
                localizacao_completa: { type: string, example: "Angra dos Reis, RJ, Brasil" }
                pais: { type: string, example: Brasil }
                estado: { type: string, example: RJ }
                cidade: { type: string, example: Angra dos Reis }
                cidade_id: { type: integer, example: 60968 }
        fichas_gerenciais:
          type: array
          items:
            type: object
            properties:
              id: { type: integer, example: 23 }
        beneficios:
          type: array
          items:
            type: object
            properties:
              id: { type: integer, example: 2 }
              valor: { type: number, example: 34.5 }
        fichas:
          type: array
          items:
            type: object
            properties:
              id: { type: integer, example: 147637 }
              obrigratoria: { type: boolean, example: true }
        vaga_inteligente: { type: boolean, example: true }
