Get On Board Jobs API

Job posting CRUD operations

OpenAPI Specification

get-on-board-jobs-api-openapi.yml Raw ↑
openapi: 3.0.3
info:
  title: Get on Board Applications Jobs API
  version: 0.1.0
  description: "The Get on Board API provides access to the data inside Get on Board, the leading recruitment platform for tech professionals in Latin America.\n\nThere are two facets of the API:\n\n- **Public API** — Open to anyone. Access the same data visible on the platform without logging in: job categories, company profiles, published jobs, and a job search endpoint. No authentication required.\n- **Private API** — Requires authentication. Access your company's private data: jobs, recruitment processes, professionals, and applications. Available to companies with an active subscription plan that includes API access.\n\nBase URL: `https://www.getonbrd.com/api/v0/`\n\nFor bugs, improvement suggestions, or missing features, contact us at team@getonbrd.com.\n\n## Sandbox environment\n\nYou can test any endpoint using the sandbox environment:\n\n```\nhttps://sandbox.getonbrd.dev/api/v0/\n```\n\nWe strongly encourage you to test your API integrations against the sandbox before making live requests in production. The sandbox contains fake data, and certain features like payments may not work.\n\nIf your company wants to test the private API before subscribing, contact us at info@getonbrd.com or via the support chat to discuss temporary access.\n\n## Expanding responses\n\nMany endpoints support the `expand` query parameter to include full related resources instead of ID-only references.\n\n**Default (collapsed)** — Related objects return only `id` and `type`:\n\n```json\n{\n  \"job\": {\n    \"data\": { \"id\": 285, \"type\": \"job\" }\n  }\n}\n```\n\n**Expanded** — Pass `expand[]` to get the full resource with all attributes:\n\n```\nGET /api/v0/applications?expand[]=job&expand[]=professional\n```\n\nYou can expand multiple relationships in a single request. Nested expansion is supported with dot notation (e.g., `expand[]=job.tags`).\n\nSupported expand values vary by endpoint — refer to each endpoint's parameter documentation for available options.\n\n## Pagination and metadata\n\nMost list endpoints return paginated results with a `data` array and a `meta` object:\n\n```json\n{\n  \"data\": [ ... ],\n  \"meta\": {\n    \"page\": 1,\n    \"per_page\": 120,\n    \"total_pages\": 3\n  }\n}\n```\n\n| Parameter  | Type    | Default | Max | Description             |\n|------------|---------|---------|-----|-------------------------|\n| `page`     | integer | 1       | —   | Page number (min 1)     |\n| `per_page` | integer | 120     | 120 | Items per page (min 1)  |\n\nSome collection endpoints intentionally omit pagination metadata because they return bounded reference data or workflow state:\n\n- `GET /api/v0/perks`\n- `GET /api/v0/applications/discard_reasons`\n- `GET /api/v0/processes/{process_id}/phases`\n- `GET /api/v0/webhook_endpoints`\n- `GET /api/v0/webhook_events`\n- `GET /api/v0/matching_jobs` currently ignores `per_page` and omits pagination metadata.\n\n## Date filtering\n\nSome private endpoints support date range filtering using Unix epoch timestamps:\n\n| Parameter | Type    | Description                       |\n|-----------|---------|-----------------------------------|\n| `from`    | integer | Start date (epoch timestamp)      |\n| `to`      | integer | End date (epoch timestamp)        |\n\nInvalid date formats return a `422` error.\n\n## Localization\n\nAPI responses can be localized by setting a language preference. Supported locales: `en` (English), `es` (Spanish), `pt` (Portuguese).\n\n| Parameter | Type   | Description                     |\n|-----------|--------|---------------------------------|\n| `lang`    | string | Locale code: `en`, `es`, or `pt` |\n\nLanguage is resolved in this order:\n\n1. `lang` query parameter (e.g., `?lang=es`)\n2. `Accept-Language` HTTP header\n3. Authenticated user's language preference (private API only)\n4. Default locale\n\nLocalized fields include category names, perk descriptions, country names, and validation error messages. Use `?lang=en` to force English responses.\n\n## Companies Private API\n\nCollection of protected resources and endpoints a subscribed company has access to. Every request needs to be authenticated.\n\n> **Note:** Only companies with an active subscription plan can have access to the private API. The Companies Private API endpoints will return `404` if a subscription expires.\n\n### Authentication\n\nAuthenticate requests by sending the company API key in the `Authorization` header as `Bearer <api_key>`.\n\nThe key can be found in the company's profile page in Get on Board. Look for the section **API access** (`https://www.getonbrd.com/companies/[your-company]/api_settings`).\n\n### How the endpoints work together\n\nThe Companies Private API provides four interconnected endpoints that represent your complete recruitment workflow:\n\n**Jobs** (create postings) → **Applications** (receive candidates) → **Processes** (manage hiring) → **Professionals** (access profiles)\n\n### Core relationships\n\n- **Jobs**: Your job postings. The starting point that attracts candidates.\n- **Applications**: Generated when professionals apply to your jobs.\n- **Processes**: Structured hiring pipelines with phases (screening, interviews, etc.) that organize your recruitment workflow. A job can have multiple processes.\n- **Professionals**: Candidate profiles with detailed information.\n\n### Moving applications between phases\n\nTo move a candidate through your hiring pipeline:\n\n1. List your jobs with `GET /api/v0/jobs`.\n2. Pick a job and list its processes with `GET /api/v0/jobs/{job_id}/processes`. Use the job `id` string returned by `GET /api/v0/jobs`; this is normally a slug, not the numeric relationship ID embedded inside expanded process/job payloads.\n3. List applications for the process with `GET /api/v0/applications?process_id={process_id}`.\n4. Discover available target phases with `GET /api/v0/processes/{process_id}/phases`.\n5. If the target phase has `kind: \"discarded\"`, fetch valid reasons with `GET /api/v0/applications/discard_reasons`.\n6. Move the application with `PATCH /api/v0/applications/{application_id}/phase`.\n\nPhase IDs are numeric. Use a reason `id` from `GET /api/v0/applications/discard_reasons` as `discard_reason` when moving to a discarded phase. Moving an application back to a non-discarded phase clears its stored discard reason.\n\n### Multi-brand posting for ATS partners (company shells)\n\nRecruiting for many client companies through one integration? Authorized partner accounts can create\n**company shells** — public brand profiles (name, logo, description, own company page) for each client —\nand post jobs under those brands with a single API key:\n\n1. Create a shell with `POST /api/v0/company_shells` (a logo is required).\n2. Pass the shell's slug as `company_shell_id` on `POST /api/v0/jobs` or `PUT /api/v0/jobs/{id}`.\n3. The public job page, company profile, feeds, and public API show the client's brand; applications,\n   processes, and billing stay on your partner account.\n\nShell endpoints return `403` for non-partner API keys. Contact Get on Board to enable partner access\nfor your integration.\n\n### Key business rules\n\n- **Professional data access**: The Professionals endpoint has the strictest access controls. You can only access professional profiles when the professional is part of an active hiring process, the professional profile has been \"unlocked\", and you own the hiring process.\n- **Professionals are process-scoped**: Always include `process_id` when listing or retrieving professionals, for example `GET /api/v0/professionals?process_id=123` or `GET /api/v0/professionals/{id}?process_id=123`.\n- **Event payloads are starting points**: Webhook payloads and collapsed relationships identify resources, but some related endpoints still require additional scope such as `process_id`.\n- **Prefer canonical follow-up reads**: When starting from an event or collapsed payload, fetch the resource named by the payload first (for example `GET /api/v0/applications/{application_id}`), then use `expand[]` or process-scoped endpoints as needed.\n- **Data scoping**: All endpoints only return data belonging to your company (jobs you created, applications to your jobs, your hiring processes).\n- **Job moderation**: Jobs must be submitted via `POST /jobs/:id/submit` and approved before going live on the platform.\n- **Expandable relationships**: Use `expand[]=applications`, `expand[]=processes`, etc. to include related data and reduce API calls.\n\n### Read-only smoke test\n\nThe following sequence exercises the public API and the private company workflow without creating, updating, or deleting data:\n\n```bash\ncurl \"https://www.getonbrd.com/api/v0/categories?per_page=3&lang=en\"\ncurl -H \"Authorization: Bearer YOUR_API_KEY\" \"https://www.getonbrd.com/api/v0/jobs?per_page=3&lang=en\"\ncurl -H \"Authorization: Bearer YOUR_API_KEY\" \"https://www.getonbrd.com/api/v0/jobs/JOB_ID_FROM_LIST/processes\"\ncurl -H \"Authorization: Bearer YOUR_API_KEY\" \"https://www.getonbrd.com/api/v0/applications?process_id=PROCESS_ID&expand[]=job&expand[]=professional\"\ncurl -H \"Authorization: Bearer YOUR_API_KEY\" \"https://www.getonbrd.com/api/v0/applications/APPLICATION_ID?expand[]=professional\"\ncurl -H \"Authorization: Bearer YOUR_API_KEY\" \"https://www.getonbrd.com/api/v0/processes/PROCESS_ID/phases\"\ncurl -H \"Authorization: Bearer YOUR_API_KEY\" \"https://www.getonbrd.com/api/v0/professionals?process_id=PROCESS_ID&per_page=2\"\n```"
servers:
- url: https://www.getonbrd.com
  description: Production
- url: https://sandbox.getonbrd.dev
  description: Sandbox
tags:
- name: Jobs
  description: Job posting CRUD operations
paths:
  /api/v0/jobs:
    get:
      summary: List company jobs
      tags:
      - Jobs
      parameters:
      - name: Authorization
        in: header
        required: false
        schema:
          type: string
        example: Bearer YOUR_API_KEY
        description: Bearer credential for the authentication scheme required by this endpoint.
      - name: page
        in: query
        required: false
        schema:
          type: integer
          minimum: 1
        example: 1
        description: Page number, starting at 1.
      - name: per_page
        in: query
        required: false
        schema:
          type: integer
          minimum: 1
          maximum: 120
        example: 2
        description: Number of records per page. The default and maximum are usually 120 unless an endpoint documents a different behavior.
      responses:
        '200':
          description: Returns a paginated list of jobs for the authenticated company.
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      type: object
                      properties:
                        id:
                          type: string
                        type:
                          type: string
                        attributes:
                          type: object
                          properties:
                            title:
                              type: string
                            description_headline:
                              nullable: true
                            description:
                              type: string
                            projects:
                              type: string
                            functions_headline:
                              nullable: true
                            functions:
                              type: string
                            benefits_headline:
                              nullable: true
                            benefits:
                              type: string
                            desirable_headline:
                              nullable: true
                            desirable:
                              type: string
                            remote:
                              type: boolean
                            remote_modality:
                              type: string
                            remote_zone:
                              nullable: true
                            countries:
                              type: array
                              items:
                                type: string
                            lang:
                              type: string
                            rejected_reasons:
                              type: array
                              items:
                                type: object
                                properties:
                                  bad_job:
                                    type: object
                                    properties:
                                      title:
                                        type: string
                                      description:
                                        type: string
                                    required:
                                    - title
                                    - description
                                required:
                                - bad_job
                            category_name:
                              type: string
                            perks:
                              type: array
                              items: {}
                            min_salary:
                              type: integer
                            max_salary:
                              type: integer
                            published_at:
                              type: integer
                            response_time_in_days:
                              type: object
                              properties:
                                min:
                                  nullable: true
                                max:
                                  nullable: true
                              required:
                              - min
                              - max
                            applications_count:
                              type: integer
                            location_regions:
                              type: object
                              properties:
                                data:
                                  type: array
                                  items: {}
                              required:
                              - data
                            location_tenants:
                              type: object
                              properties:
                                data:
                                  type: array
                                  items: {}
                              required:
                              - data
                            location_cities:
                              type: object
                              properties:
                                data:
                                  type: array
                                  items:
                                    type: object
                                    properties:
                                      id:
                                        type: integer
                                      type:
                                        type: string
                                    required:
                                    - id
                                    - type
                              required:
                              - data
                            modality:
                              type: object
                              properties:
                                data:
                                  type: object
                                  properties:
                                    id:
                                      type: integer
                                    type:
                                      type: string
                                  required:
                                  - id
                                  - type
                              required:
                              - data
                            seniority:
                              type: object
                              properties:
                                data:
                                  type: object
                                  properties:
                                    id:
                                      type: integer
                                    type:
                                      type: string
                                  required:
                                  - id
                                  - type
                              required:
                              - data
                            tags:
                              type: object
                              properties:
                                data:
                                  type: array
                                  items: {}
                              required:
                              - data
                            state:
                              type: string
                            deleted:
                              type: boolean
                            questions:
                              type: object
                              properties:
                                data:
                                  type: array
                                  items: {}
                              required:
                              - data
                            location_countries:
                              type: object
                              properties:
                                data:
                                  type: array
                                  items: {}
                              required:
                              - data
                            submitted_at:
                              type: integer
                            created_at:
                              type: integer
                            updated_at:
                              type: integer
                            company_shell_id:
                              nullable: true
                              type: string
                          required:
                          - title
                          - description_headline
                          - description
                          - projects
                          - functions_headline
                          - functions
                          - benefits_headline
                          - benefits
                          - desirable_headline
                          - desirable
                          - remote
                          - remote_modality
                          - remote_zone
                          - countries
                          - lang
                          - rejected_reasons
                          - category_name
                          - perks
                          - min_salary
                          - max_salary
                          - published_at
                          - response_time_in_days
                          - applications_count
                          - location_regions
                          - location_tenants
                          - location_cities
                          - modality
                          - seniority
                          - tags
                          - state
                          - deleted
                          - questions
                          - location_countries
                          - submitted_at
                          - created_at
                          - updated_at
                      required:
                      - id
                      - type
                      - attributes
                  meta:
                    type: object
                    properties:
                      page:
                        type: integer
                      per_page:
                        type: integer
                      total_pages:
                        type: integer
                    required:
                    - page
                    - per_page
                    - total_pages
                required:
                - data
                - meta
              example:
                data: []
                meta:
                  page: 1
                  per_page: 120
                  total_pages: 1
        '401':
          description: Returns a paginated list of jobs for the authenticated company.
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                  code:
                    type: string
                required:
                - message
                - code
              example:
                message: (Status 401) Unauthorized access to the API
                code: unauthorized
      security:
      - ApiKeyAuth: []
      description: To manage candidate phase moves, choose a job from this response and call `GET /api/v0/jobs/{job_id}/processes` with the returned job identifier.
      operationId: listCompanyPrivateJobs
    post:
      summary: Create a job
      tags:
      - Jobs
      security:
      - ApiKeyAuth: []
      parameters:
      - name: Authorization
        in: header
        required: true
        schema:
          type: string
        example: Bearer YOUR_API_KEY
        description: Bearer credential for the authentication scheme required by this endpoint.
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                title:
                  type: string
                description:
                  type: string
                projects:
                  type: string
                category_id:
                  type: string
                min_salary:
                  type: string
                max_salary:
                  type: string
                modality_id:
                  type: string
                seniority_id:
                  type: string
                remote_modality:
                  type: string
                  enum:
                  - no_remote
                  - temporarily_remote
                  - remote_local
                  - fully_remote
                  - hybrid
                  description: Work-location policy. Determines which location ID fields are accepted.
                questions:
                  type: array
                  items:
                    type: object
                    properties:
                      title:
                        type: string
                      kind:
                        type: string
                      ai_generated:
                        type: string
                      score:
                        type: string
                      choices:
                        type: array
                        items:
                          type: object
                          properties:
                            label:
                              type: string
                            value:
                              type: string
                          required:
                          - label
                          - value
                    required:
                    - title
                    - kind
                expand:
                  type: array
                  items:
                    type: string
                functions:
                  type: string
                perks:
                  type: string
                state:
                  type: string
                location_region_ids:
                  type: array
                  items:
                    type: string
                  nullable: true
                  description: For `remote_local` jobs only. Region slugs from `GET /api/v0/regions`.
                location_country_ids:
                  type: array
                  items:
                    type: string
                  nullable: true
                  description: For `remote_local` jobs only. Country slugs from `GET /api/v0/countries`.
                location_city_ids:
                  nullable: true
                  type: array
                  items:
                    type: integer
                  description: Required for `no_remote`, `hybrid`, and `temporarily_remote`. Numeric city IDs from `GET /api/v0/cities`.
                company_shell_id:
                  type: string
                  nullable: true
                  description: Partner accounts only. Slug of one of your company shells (`GET /api/v0/company_shells`) to publicly brand this job as that client company. Omit for a normal job. On update, send `""` to detach the shell. `404` for an unknown or foreign slug; `422` if your account is not partner-enabled.
              required:
              - title
              - description
              - remote_modality
              - projects
              - min_salary
              - max_salary
              - seniority_id
              - modality_id
              - category_id
            examples:
              fully_remote:
                summary: Fully remote
                value:
                  title: Ruby on Rails Developer
                  description: We are looking for a backend engineer who can own product features, collaborate closely with design, and ship reliable Rails code across a growing platform.
                  projects: You will work on our ATS and recruiting platform, improve internal APIs, and help keep the hiring workflow stable as more customers integrate with us.
                  functions: Build Rails features, review code, write tests, and improve the API experience for customers integrating with the platform.
                  remote_modality: fully_remote
                  min_salary: 1500
                  max_salary: 2000
                  modality_id: 376
                  seniority_id: 367
                  category_id: programming
                  perks: pet_friendly, informal_dresscode, life_insurance
              remote_local:
                summary: Remote limited to regions or countries
                value:
                  title: Ruby on Rails Developer
                  description: We are looking for a backend engineer who can own product features, collaborate closely with design, and ship reliable Rails code across a growing platform.
                  projects: You will work on our ATS and recruiting platform, improve internal APIs, and help keep the hiring workflow stable as more customers integrate with us.
                  functions: Build Rails features, review code, write tests, and improve the API experience for customers integrating with the platform.
                  remote_modality: remote_local
                  min_salary: 1500
                  max_salary: 2000
                  modality_id: 376
                  seniority_id: 367
                  category_id: programming
                  perks: pet_friendly, informal_dresscode, life_insurance
                  location_region_ids:
                  - latin-america
                  location_country_ids:
                  - mexico
              city_limited:
                summary: Hybrid, on-site, or temporarily remote
                value:
                  title: Ruby on Rails Developer
                  description: We are looking for a backend engineer who can own product features, collaborate closely with design, and ship reliable Rails code across a growing platform.
                  projects: You will work on our ATS and recruiting platform, improve internal APIs, and help keep the hiring workflow stable as more customers integrate with us.
                  functions: Build Rails features, review code, write tests, and improve the API experience for customers integrating with the platform.
                  remote_modality: hybrid
                  min_salary: 1500
                  max_salary: 2000
                  modality_id: 376
                  seniority_id: 367
                  category_id: programming
                  perks: pet_friendly, informal_dresscode, life_insurance
                  location_city_ids:
                  - 1
                  - 2
              company_shell:
                summary: Branded as a company shell (partners only)
                value:
                  title: Ruby on Rails Developer
                  description: We are looking for a backend engineer who can own product features, collaborate closely with design, and ship reliable Rails code across a growing platform.
                  projects: You will work on our ATS and recruiting platform, improve internal APIs, and help keep the hiring workflow stable as more customers integrate with us.
                  functions: Build Rails features, review code, write tests, and improve the API experience for customers integrating with the platform.
                  remote_modality: fully_remote
                  min_salary: 1500
                  max_salary: 2000
                  modality_id: 376
                  seniority_id: 367
                  category_id: programming
                  perks: pet_friendly, informal_dresscode, life_insurance
                  company_shell_id: client-brand-slug
      responses:
        '200':
          description: Creates a new job posting for the authenticated company.
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: object
                    properties:
                      id:
                        type: string
                      type:
                        type: string
                      attributes:
                        type: object
                        properties:
                          title:
                            type: string
                          description_headline:
                            nullable: true
                          description:
                            type: string
                          projects:
                            type: string
                          functions_headline:
                            nullable: true
                          functions:
                            type: string
                          benefits_headline:
                            nullable: true
                          benefits:
                            type: string
                          desirable_headline:
                            nullable: true
                          desirable:
                            type: string
                          remote:
                            type: boolean
                          remote_modality:
                            type: string
                          remote_zone:
                            nullable: true
                          countries:
                            type: array
                            items:
                              type: string
                          lang:
                            type: string
                          rejected_reasons:
                            type: array
                            items: {}
                          category_name:
                            type: string
                          perks:
                            type: array
                            items:
                              type: string
                          min_salary:
                            type: integer
                          max_salary:
                            type: integer
                          published_at:
                            type: integer
                          response_time_in_days:
                            type: object
                            properties:
                              min:
                                nullable: true
                              max:
                                nullable: true
                            required:
 

# --- truncated at 32 KB (143 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/get-on-board/refs/heads/main/openapi/get-on-board-jobs-api-openapi.yml