{
  "info": {
    "description": "\n\n# Introduction\n\nThe Gem Job Board API is designed for teams that need full control over their career page\npresentation and want to build a fully custom job board experience. **This is an advanced use\ncase.** For most teams, Gem's hosted job board or embeddable widget are simpler and cover the same\nrequirements \u2014 see the [Job Board setup guide](https://help.gem.com/external/configuring-your-job-board-in-gem-ats). If you do proceed with a custom build, see the [Job Board API article](https://help.gem.com/databases/gem-help-center/the-job-board-api) for additional setup steps.\n\n**Before building a custom job board, be aware of the following limitations:**\n\n> **Job posts are hosted on jobs.gem.com.** When a candidate clicks Apply on your custom page,\n> they are redirected to the relevant page on `jobs.gem.com` \u2014 they do not stay on your domain.\n\n> **We strongly recommend using Gem's built-in application form** rather than building your own.\n> Gem's application form will automatically be maintained, and includes built-in spam protection.\n> Building a custom application form introduces overhead and ongoing maintenance that\n> is generally not worth the effort.\n\n> **Requires Gem ATS** to be enabled on your account with at least one live job post published.\n\n# Authentication\n\nMost endpoints in the Job Board API are **public** and do not require authentication \u2014 job board\ninformation can be read by anyone using your job board's vanity URL path. The `vanity_url_path`\nis the job board URL slug configured in your\n[Admin Settings under Gem ATS \u2192 Job boards & posts](https://www.gem.com/admin-settings/ats/job-boards).\n\nThe application submission endpoint (`POST .../applications`) requires a team API key and accepts\n`multipart/form-data` to support resume file uploads. Team admins\ncan provision API keys on your team's admin settings page.\nPass the key via the `X-API-Key` header:\n\n    curl -X POST \\\n        -H \"X-API-Key: <YOUR_API_KEY>\" \\\n        https://api.gem.com/job_board/v0/<vanity_url_path>/job_posts/<job_post_id>/applications\n\n# Rate Limits\n\nBy default, each API key is subject to a rate limit of 20 requests per second, with a burst\ncapacity of 500 requests. If you exceed either of these limits, you will receive a `429 Too Many\nRequests` or `Limit Exceeded` error code.\n\n\n# Pagination\n\nThe Job Board API does not use pagination. Endpoints return complete lists of all matching\nresources in a single response.\n",
    "title": "Gem Job Board API",
    "version": "v0"
  },
  "paths": {
    "/job_board/v0/{vanity_url_path}/job_posts/": {
      "get": {
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/JobPostResponse"
                  }
                }
              }
            }
          },
          "default": {
            "$ref": "#/components/responses/DEFAULT_ERROR"
          }
        },
        "summary": "List Job Posts",
        "description": "Lists all of a team's job posts.",
        "tags": [
          "Job Board Job Post"
        ]
      },
      "parameters": [
        {
          "in": "path",
          "name": "vanity_url_path",
          "required": true,
          "schema": {
            "type": "string",
            "minLength": 1
          }
        }
      ]
    },
    "/job_board/v0/{vanity_url_path}/job_posts/{job_post_id}": {
      "get": {
        "parameters": [
          {
            "in": "query",
            "name": "questions",
            "description": "If true, include application form questions and demographic questions in the response.",
            "schema": {
              "type": "boolean",
              "default": false
            },
            "required": false
          }
        ],
        "responses": {
          "422": {
            "$ref": "#/components/responses/UNPROCESSABLE_CONTENT"
          },
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobPostDetailResponse"
                }
              }
            }
          },
          "default": {
            "$ref": "#/components/responses/DEFAULT_ERROR"
          }
        },
        "summary": "Get Job Post",
        "description": "Get a single job post by its `id`.",
        "tags": [
          "Job Board Job Post"
        ]
      },
      "parameters": [
        {
          "in": "path",
          "name": "vanity_url_path",
          "required": true,
          "schema": {
            "type": "string",
            "minLength": 1
          }
        },
        {
          "in": "path",
          "name": "job_post_id",
          "required": true,
          "schema": {
            "type": "string",
            "minLength": 1
          }
        }
      ]
    },
    "/job_board/v0/{vanity_url_path}/job_posts/{job_post_id}/applications": {
      "post": {
        "responses": {
          "422": {
            "$ref": "#/components/responses/UNPROCESSABLE_CONTENT"
          },
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApplicationResponse"
                }
              }
            }
          },
          "default": {
            "$ref": "#/components/responses/DEFAULT_ERROR"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/ApplicationSubmissionForm"
              }
            }
          }
        },
        "summary": "Submit Application [BETA]",
        "description": "Submit an application to a job post. If the candidate already has an active\napplication, it is updated in place; otherwise a new application is created.\n\n**Authentication.** This endpoint requires the same API key authentication as\nthe ATS API: pass a valid team API key via the `X-API-Key` header (or via HTTP\nBasic Auth \u2014 `Authorization: Basic <base64(api_key:)>`). The\nAPI key's team must own the job board referenced by `<vanity_url_path>`;\notherwise the endpoint returns 404.\n\nThe request body must be `multipart/form-data`. In addition to the declared\nstandard fields (see the schema below), the endpoint accepts:\n\n- `resume` \u2014 multipart file upload. The extension must be one of\n  `.pdf`, `.doc`, `.docx`, `.rtf`, `.txt`, and the file's signature\n  and MIME type must match the extension; otherwise the request\n  returns 422.\n- `cover_letter` \u2014 multipart file upload. Any extension is accepted.\n- **Custom question answers** \u2014 one field per question. Discover the\n  available questions and their `fields[].name` / `fields[].type` /\n  `fields[].values[]` via\n  `GET /<vanity_url_path>/job_posts/<job_post_id>?questions=true`.\n  Use the `name` (the question's external ID) as the form key. For\n  `multi_value_single_select` and `multi_value_multi_select`, submit the\n  chosen option's `value` (the option's external ID) \u2014 repeat the field\n  for multi-select. For `input_file`, upload a file under the same key.\n\n  Example for a job post that exposes a short-text \"Why us?\" question\n  (`name`: `cXVlc3Rpb246UTE`) and a single-select \"Preferred location\"\n  question (`name`: `cXVlc3Rpb246UTI`, with values `Remote` / `Onsite`):\n\n      -F \"cXVlc3Rpb246UTE=Because I love the mission.\" \\\n      -F \"cXVlc3Rpb246UTI=cXVlc3Rpb25vcHRpb246T1\"\n\n**Full example request** (with resume, cover letter, two custom answers,\nand one demographic answer):\n\n    curl -X POST \\\n      \"https://api.gem.com/job_board/v0/<vanity_url_path>/job_posts/<job_post_id>/applications\" \\\n      -H \"X-API-Key: <your_api_key>\" \\\n      -F \"first_name=Jane\" \\\n      -F \"last_name=Doe\" \\\n      -F \"email=jane@candidate-test.io\" \\\n      -F \"phone=+12025550195\" \\\n      -F \"location=123 Main St, San Francisco, CA\" \\\n      -F \"source_id=c291cmNlOjEyMw\"\n      -F \"resume=@./resume.pdf\" \\\n      -F \"cover_letter=@./cover_letter.pdf\" \\\n      -F \"cXVlc3Rpb246UTE=Because I love the mission.\" \\\n      -F \"cXVlc3Rpb246UTI=cXVlc3Rpb25vcHRpb246T1\" \\\n      -F 'demographic_answers=[{\"question_id\":\"cXVlc3Rpb246UTM\",\"answer_options\":[{\"answer_option_id\":\"cXVlc3Rpb25vcHRpb246T3\"}]}]'\n\nSuccessful response:\n\n    {\n      \"candidate_id\": \"Y2FuZGlkYXRlczoxMjM0NQ==\",\n      \"application_id\": \"YXBwOoabc123...\"\n    }",
        "tags": [
          "Job Board Job Post"
        ]
      },
      "parameters": [
        {
          "in": "path",
          "name": "vanity_url_path",
          "required": true,
          "schema": {
            "type": "string",
            "minLength": 1
          }
        },
        {
          "in": "path",
          "name": "job_post_id",
          "required": true,
          "schema": {
            "type": "string",
            "minLength": 1
          }
        }
      ]
    },
    "/job_board/v0/{vanity_url_path}/departments/": {
      "get": {
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DepartmentListResponse"
                }
              }
            }
          },
          "default": {
            "$ref": "#/components/responses/DEFAULT_ERROR"
          }
        },
        "summary": "List Departments",
        "description": "Lists all of a team's departments.",
        "tags": [
          "Job Board Department"
        ]
      },
      "parameters": [
        {
          "in": "path",
          "name": "vanity_url_path",
          "required": true,
          "schema": {
            "type": "string",
            "minLength": 1
          }
        }
      ]
    },
    "/job_board/v0/{vanity_url_path}/departments/{department_id}": {
      "get": {
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DepartmentWithJobs"
                }
              }
            }
          },
          "default": {
            "$ref": "#/components/responses/DEFAULT_ERROR"
          }
        },
        "summary": "Get Department",
        "description": "Get a single department by its `id`.",
        "tags": [
          "Job Board Department"
        ]
      },
      "parameters": [
        {
          "in": "path",
          "name": "vanity_url_path",
          "required": true,
          "schema": {
            "type": "string",
            "minLength": 1
          }
        },
        {
          "in": "path",
          "name": "department_id",
          "required": true,
          "schema": {
            "type": "string",
            "minLength": 1
          }
        }
      ]
    },
    "/job_board/v0/{vanity_url_path}/offices/": {
      "get": {
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OfficeListResponse"
                }
              }
            }
          },
          "default": {
            "$ref": "#/components/responses/DEFAULT_ERROR"
          }
        },
        "summary": "List Offices",
        "description": "Lists all of a team's offices.",
        "tags": [
          "Job Board Office"
        ]
      },
      "parameters": [
        {
          "in": "path",
          "name": "vanity_url_path",
          "required": true,
          "schema": {
            "type": "string",
            "minLength": 1
          }
        }
      ]
    },
    "/job_board/v0/{vanity_url_path}/offices/{office_id}": {
      "get": {
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OfficeWithDepartments"
                }
              }
            }
          },
          "default": {
            "$ref": "#/components/responses/DEFAULT_ERROR"
          }
        },
        "summary": "Get Office",
        "description": "Get a single office by its `id`.",
        "tags": [
          "Job Board Office"
        ]
      },
      "parameters": [
        {
          "in": "path",
          "name": "vanity_url_path",
          "required": true,
          "schema": {
            "type": "string",
            "minLength": 1
          }
        },
        {
          "in": "path",
          "name": "office_id",
          "required": true,
          "schema": {
            "type": "string",
            "minLength": 1
          }
        }
      ]
    }
  },
  "tags": [
    {
      "name": "Job Board Job Post",
      "description": "Read job post"
    },
    {
      "name": "Job Board Department",
      "description": "Read departments"
    },
    {
      "name": "Job Board Office",
      "description": "Read offices"
    }
  ],
  "openapi": "3.0.2",
  "components": {
    "schemas": {
      "Error": {
        "type": "object",
        "properties": {
          "code": {
            "type": "integer",
            "description": "Error code"
          },
          "status": {
            "type": "string",
            "description": "Error name"
          },
          "message": {
            "type": "string",
            "description": "Error message"
          },
          "errors": {
            "type": "object",
            "description": "Errors",
            "additionalProperties": {}
          }
        },
        "additionalProperties": false
      },
      "PaginationMetadata": {
        "type": "object",
        "properties": {
          "total": {
            "type": "integer"
          },
          "total_pages": {
            "type": "integer"
          },
          "first_page": {
            "type": "integer"
          },
          "last_page": {
            "type": "integer"
          },
          "page": {
            "type": "integer"
          },
          "previous_page": {
            "type": "integer"
          },
          "next_page": {
            "type": "integer"
          }
        },
        "additionalProperties": false
      },
      "Department": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "The unique identifier for the department.",
            "example": "ZGVwdDrA2PG_W06NNxLA-cZDOod0"
          },
          "name": {
            "type": "string",
            "description": "The name of the department as defined upon creation.",
            "example": "Engineering"
          },
          "parent_id": {
            "type": "string",
            "description": "The id of the parent department if one exists, otherwise null.",
            "example": null
          },
          "child_ids": {
            "readOnly": true,
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "The ids of any child departments if they exist, otherwise blank.",
            "example": []
          }
        }
      },
      "LocationName": {
        "type": "object",
        "properties": {
          "name": {
            "readOnly": true,
            "type": "string",
            "description": "The location, pulled from a combination of City and Country (and Remote too, if relevant).",
            "example": "New York, United States"
          }
        }
      },
      "Location": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "The unique identifier for the office, automatically generated when the location was created.",
            "example": "bG9jOgElbPrlXPP5lgsVo86j5H0"
          },
          "name": {
            "type": "string",
            "description": "The name of the office as defined in the 'Display name' field when the location was created.",
            "example": "NYC"
          },
          "location": {
            "description": "Information regarding the location of the office.",
            "allOf": [
              {
                "$ref": "#/components/schemas/LocationName"
              }
            ]
          },
          "parent_id": {
            "type": "string",
            "description": "The automatically-generated id of the parent office if one exists, otherwise null.",
            "example": null
          },
          "child_ids": {
            "readOnly": true,
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "The automatically-generated ids of any child offices if they exist, otherwise blank.",
            "example": []
          },
          "parent_office_external_id": {
            "readOnly": true,
            "type": "string",
            "description": "The external id of the parent office if one exists. Only populated when data is imported from Greenhouse; otherwise, the value is null.",
            "example": null
          },
          "child_office_external_ids": {
            "readOnly": true,
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "The external ids of any child offices if they exist. Only populated when data is imported from Greenhouse; otherwise, the value is an empty array.",
            "example": []
          },
          "deleted_at": {
            "type": "string",
            "format": "date-time",
            "description": "The date and time at which the office was deleted. Only populated when data is imported from Greenhouse."
          }
        }
      },
      "JobPostResponse": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "The unique identifier for this job post, automatically generated when the job was created.",
            "example": "am9icG9zdDrmEc_QDH2AJLVNz4fQpF5Q"
          },
          "title": {
            "type": "string",
            "description": "The job title as defined in the job post's Title field.",
            "example": "Product Manager"
          },
          "first_published_at": {
            "type": "string",
            "format": "date-time",
            "description": "The date and time when the job was originally posted.",
            "example": "2023-09-22T20:17:34.000Z"
          },
          "internal_job_id": {
            "type": "string",
            "description": "The unique identifier for the underlying job (not typically exposed to applicants).",
            "example": "am9iOr5BtVXSFABj7-MyNJ0o0d4"
          },
          "content": {
            "type": "string",
            "description": "The text included in the job post's 'Job description' field, including HTML tags. If either the External job post intro or External job post outro options are toggled to ON, this also includes the text from those fields.",
            "example": "<p><strong>About Us:</strong></p><p>Gem is seeking a dynamic and highly organized individual to join our team.</p>"
          },
          "content_plain": {
            "type": "string",
            "description": "The same as content, but excluding HTML tags.",
            "example": "About Us:\nGem is seeking a dynamic and highly organized individual to join our team."
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "description": "The date and time when the job was originally created.",
            "example": "2023-09-22T20:17:34.000Z"
          },
          "updated_at": {
            "type": "string",
            "format": "date-time",
            "description": "The date and time when the job was last updated.",
            "example": "2025-01-15T22:52:24.609Z"
          },
          "departments": {
            "type": "array",
            "description": "An array of data regarding the department.",
            "items": {
              "$ref": "#/components/schemas/Department"
            }
          },
          "offices": {
            "type": "array",
            "description": "An array of data regarding the office details for the job.",
            "items": {
              "$ref": "#/components/schemas/Location"
            }
          },
          "absolute_url": {
            "type": "string",
            "description": "The direct link to the job post on the auto-generated job board.",
            "example": "https://jobs.gem.com/test-board/am9icG9zdDrmEc_QDH2AJLVNz4fQpF5"
          },
          "location": {
            "description": "Information regarding the location of the job.",
            "allOf": [
              {
                "$ref": "#/components/schemas/LocationName"
              }
            ]
          },
          "location_type": {
            "type": "string",
            "description": "The Location type as defined upon creation. Possible values are 'in_office', 'hybrid' or 'remote'.",
            "example": "hybrid"
          },
          "employment_type": {
            "type": "string",
            "description": "The Employment type as defined upon creation. Possible values are 'contract', 'full_time', 'intern', 'part_time' or 'temporary'.",
            "example": "full_time"
          },
          "requisition_id": {
            "type": "string",
            "description": "The unique identifier for this job, as defined when the job was created (either auto-generated or specified by the user).",
            "example": "R16"
          }
        }
      },
      "JobPostQuestionResponse": {
        "type": "object",
        "properties": {
          "label": {
            "type": "string",
            "description": "The question text displayed to the applicant.",
            "example": "Why do you want to work here?"
          },
          "required": {
            "type": "boolean",
            "description": "Whether an answer to this question is required.",
            "example": true
          },
          "fields": {
            "readOnly": true,
            "description": "The list of input fields the applicant must submit for this question. Each entry has a `name` (the form field name to use when posting an application), a `type` (input type), and\u2014for select-type questions\u2014a `values` array of `{value, label}` options.",
            "example": [
              {
                "name": "cXVlc3Rpb246UTE",
                "type": "multi_value_single_select",
                "values": [
                  {
                    "value": "cXVlc3Rpb25vcHRpb246T1",
                    "label": "Yes"
                  },
                  {
                    "value": "cXVlc3Rpb25vcHRpb246T2",
                    "label": "No"
                  },
                  {
                    "value": "cXVlc3Rpb25vcHRpb246T3",
                    "label": "Prefer not to say"
                  }
                ]
              }
            ]
          }
        }
      },
      "DemographicSurveyQuestionResponse": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "The unique identifier for this demographic question.",
            "example": "cXVlc3Rpb246abc123"
          },
          "label": {
            "type": "string",
            "description": "The question text displayed to the applicant.",
            "example": "Favorite Color"
          },
          "description": {
            "type": "string",
            "description": "The question description displayed to the applicant.",
            "example": "<div><strong>One of e.g. blue, black, red, green etc.</strong></div>"
          },
          "type": {
            "readOnly": true,
            "description": "The input type of the answer expected (e.g. `multi_value_single_select`, `multi_value_multi_select`).",
            "example": "multi_value_multi_select"
          },
          "answer_options": {
            "readOnly": true,
            "description": "The list of selectable answer options for this question. Empty for text-block questions (`type: input_hidden`), which are instructional content and not answerable.",
            "example": [
              {
                "id": "cXVlc3Rpb25vcHRpb246T1",
                "label": "Red",
                "free_form": false
              },
              {
                "id": "cXVlc3Rpb25vcHRpb246T2",
                "label": "Green",
                "free_form": false
              },
              {
                "id": "cXVlc3Rpb25vcHRpb246T3",
                "label": "Blue",
                "free_form": false
              }
            ]
          }
        }
      },
      "DemographicQuestionsResponse": {
        "type": "object",
        "properties": {
          "header": {
            "type": "string",
            "description": "The header for the demographic questions section.",
            "example": "Diversity and Inclusion at My Corp.",
            "nullable": true
          },
          "questions": {
            "type": "array",
            "description": "The list of demographic questions.",
            "items": {
              "$ref": "#/components/schemas/DemographicSurveyQuestionResponse"
            }
          }
        }
      },
      "JobPostDetailResponse": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "The unique identifier for this job post, automatically generated when the job was created.",
            "example": "am9icG9zdDrmEc_QDH2AJLVNz4fQpF5Q"
          },
          "title": {
            "type": "string",
            "description": "The job title as defined in the job post's Title field.",
            "example": "Product Manager"
          },
          "first_published_at": {
            "type": "string",
            "format": "date-time",
            "description": "The date and time when the job was originally posted.",
            "example": "2023-09-22T20:17:34.000Z"
          },
          "internal_job_id": {
            "type": "string",
            "description": "The unique identifier for the underlying job (not typically exposed to applicants).",
            "example": "am9iOr5BtVXSFABj7-MyNJ0o0d4"
          },
          "content": {
            "type": "string",
            "description": "The text included in the job post's 'Job description' field, including HTML tags. If either the External job post intro or External job post outro options are toggled to ON, this also includes the text from those fields.",
            "example": "<p><strong>About Us:</strong></p><p>Gem is seeking a dynamic and highly organized individual to join our team.</p>"
          },
          "content_plain": {
            "type": "string",
            "description": "The same as content, but excluding HTML tags.",
            "example": "About Us:\nGem is seeking a dynamic and highly organized individual to join our team."
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "description": "The date and time when the job was originally created.",
            "example": "2023-09-22T20:17:34.000Z"
          },
          "updated_at": {
            "type": "string",
            "format": "date-time",
            "description": "The date and time when the job was last updated.",
            "example": "2025-01-15T22:52:24.609Z"
          },
          "departments": {
            "type": "array",
            "description": "An array of data regarding the department.",
            "items": {
              "$ref": "#/components/schemas/Department"
            }
          },
          "offices": {
            "type": "array",
            "description": "An array of data regarding the office details for the job.",
            "items": {
              "$ref": "#/components/schemas/Location"
            }
          },
          "absolute_url": {
            "type": "string",
            "description": "The direct link to the job post on the auto-generated job board.",
            "example": "https://jobs.gem.com/test-board/am9icG9zdDrmEc_QDH2AJLVNz4fQpF5"
          },
          "location": {
            "description": "Information regarding the location of the job.",
            "allOf": [
              {
                "$ref": "#/components/schemas/LocationName"
              }
            ]
          },
          "location_type": {
            "type": "string",
            "description": "The Location type as defined upon creation. Possible values are 'in_office', 'hybrid' or 'remote'.",
            "example": "hybrid"
          },
          "employment_type": {
            "type": "string",
            "description": "The Employment type as defined upon creation. Possible values are 'contract', 'full_time', 'intern', 'part_time' or 'temporary'.",
            "example": "full_time"
          },
          "requisition_id": {
            "type": "string",
            "description": "The unique identifier for this job, as defined when the job was created (either auto-generated or specified by the user).",
            "example": "R16"
          },
          "questions": {
            "type": "array",
            "description": "The list of application form questions for this job post. Only included when questions=true.",
            "items": {
              "$ref": "#/components/schemas/JobPostQuestionResponse"
            }
          },
          "demographic_questions": {
            "description": "The demographic questions for this job post, or null if none apply. Only included when questions=true.",
            "anyOf": [
              {
                "$ref": "#/components/schemas/DemographicQuestionsResponse"
              },
              {
                "type": "object",
                "nullable": true
              }
            ]
          }
        }
      },
      "ApplicationSubmissionForm": {
        "type": "object",
        "properties": {
          "first_name": {
            "type": "string",
            "description": "The applicant's first name.",
            "example": "Jane"
          },
          "last_name": {
            "type": "string",
            "description": "The applicant's last name.",
            "example": "Doe"
          },
          "email": {
            "type": "string",
            "format": "email",
            "description": "The applicant's email address.",
            "example": "jane@example.com"
          },
          "phone": {
            "type": "string",
            "description": "The applicant's phone number.",
            "example": "+12025550195"
          },
          "location": {
            "type": "string",
            "description": "The applicant's street address.",
            "example": "123 Main St, San Francisco, CA"
          },
          "linkedin_url": {
            "type": "string",
            "description": "The applicant's LinkedIn profile URL. Must be a valid LinkedIn profile URL (e.g. `https://www.linkedin.com/in/<handle>`).",
            "example": "https://www.linkedin.com/in/jane-doe"
          },
          "company": {
            "type": "string",
            "description": "The applicant's current company.",
            "example": "Acme Corp."
          },
          "job_title": {
            "type": "string",
            "description": "The applicant's current job title.",
            "example": "Software Engineer"
          },
          "source_id": {
            "type": "string",
            "description": "The ID of the source to attribute to the application.",
            "example": "c291cmNlOjEyMw"
          },
          "demographic_answers": {
            "type": "string",
            "description": "JSON-encoded array of demographic answers.\n          Discover the question and option IDs from\n          `demographic_questions.questions[].id` and\n          `demographic_questions.questions[].answer_options[].id` in the\n          `?questions=true` GET above \u2014 and submit them here as `question_id`\n          and `answer_option_id` respectively.\n          Example for a single-select \"What is your gender?\" question\n          (`question_id`: `cXVlc3Rpb246UTM`) where the applicant chose\n          \"Prefer not to say\" (`answer_option_id`: `cXVlc3Rpb25vcHRpb246T3`):\n\n          -F 'demographic_answers=[{\"question_id\":\"cXVlc3Rpb246UTM\",\"answer_options\":[{\"answer_option_id\":\"cXVlc3Rpb25vcHRpb246T3\"}]}]'",
            "example": "[{\"question_id\": \"cXVlc3Rpb246UTE\", \"answer_options\": [{\"answer_option_id\": \"cXVlc3Rpb25vcHRpb246T1\"}]}]"
          }
        },
        "required": [
          "email",
          "first_name",
          "last_name"
        ]
      },
      "ApplicationResponse": {
        "type": "object",
        "properties": {
          "candidate_id": {
            "type": "string",
            "description": "The ID of the candidate who submitted the application.",
            "example": "cGVyc29uOoabc123"
          },
          "application_id": {
            "type": "string",
            "description": "The ID of the created or updated application.",
            "example": "YXBwOoabc123"
          }
        }
      },
      "JobInDepartment": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "The unique identifier for this job post.",
            "example": "am9icG9zdDrmEc_QDH2AJLVNz4fQpF5Q"
          },
          "title": {
            "type": "string",
            "description": "The job title.",
            "example": "Product Manager"
          },
          "updated_at": {
            "type": "string",
            "format": "date-time",
            "description": "The date and time when the job post was last updated.",
            "example": "2025-01-15T22:52:24.609Z"
          },
          "absolute_url": {
            "type": "string",
            "description": "The direct link to the job post on the auto-generated job board.",
            "example": "https://jobs.gem.com/test-board/am9icG9zdDrmEc_QDH2AJLVNz4fQpF5"
          },
          "location": {
            "description": "Information regarding the location of the job.",
            "allOf": [
              {
                "$ref": "#/components/schemas/LocationName"
              }
            ]
          }
        }
      },
      "DepartmentWithJobs": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "The unique identifier for the department.",
            "example": "ZGVwdDrA2PG_W06NNxLA-cZDOod0"
          },
          "name": {
            "type": "string",
            "description": "The name of the department as defined upon creation.",
            "example": "Engineering"
          },
          "parent_id": {
            "type": "string",
            "description": "The id of the parent department if one exists, otherwise null.",
            "example": null
          },
          "child_ids": {
            "readOnly": true,
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "The ids of any child departments if they exist, otherwise blank.",
            "example": []
          },
          "jobs": {
            "type": "array",
            "description": "The published job posts belonging to this department. Each entry is a slim view (id, title, location, updated_at, absolute_url).",
            "items": {
              "$ref": "#/components/schemas/JobInDepartment"
            }
          }
        }
      },
      "DepartmentListResponse": {
        "type": "object",
        "properties": {
          "departments": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/DepartmentWithJobs"
            }
          }
        }
      },
      "OfficeWithDepartments": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "The unique identifier for the office, automatically generated when the location was created.",
            "example": "bG9jOgElbPrlXPP5lgsVo86j5H0"
          },
          "name": {
            "type": "string",
            "description": "The name of the office as defined in the 'Display name' field when the location was created.",
            "example": "NYC"
          },
          "location": {
            "description": "Information regarding the location of the office.",
            "allOf": [
              {
                "$ref": "#/components/schemas/LocationName"
              }
            ]
          },
          "parent_id": {
            "type": "string",
            "description": "The automatically-generated id of the parent office if one exists, otherwise null.",
            "example": null
          },
          "child_ids": {
            "readOnly": true,
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "The automatically-generated ids of any child offices if they exist, otherwise blank.",
            "example": []
          },
          "parent_office_external_id": {
            "readOnly": true,
            "type": "string",
            "description": "The external id of the parent office if one exists. Only populated when data is imported from Greenhouse; otherwise, the value is null.",
            "example": null
          },
          "child_office_external_ids": {
            "readOnly": true,
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "The external ids of any child offices if they exist. Only populated when data is imported from Greenhouse; otherwise, the value is an empty array.",
            "example": []
          },
          "deleted_at": {
            "type": "string",
            "format": "date-time",
            "description": "The date and time at which the office was deleted. Only populated when data is imported from Greenhouse."
          },
          "departments": {
            "type": "array",
            "description": "Departments that have at least one published job post at this office. Each department carries the slim job posts at this office under it.",
            "items": {
              "$ref": "#/components/schemas/DepartmentWithJobs"
            }
          }
        }
      },
      "OfficeListResponse": {
        "type": "object",
        "properties": {
          "offices": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/OfficeWithDepartments"
            }
          }
        }
      }
    },
    "responses": {
      "DEFAULT_ERROR": {
        "description": "Default error response",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      },
      "UNPROCESSABLE_CONTENT": {
        "description": "Unprocessable Content",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      }
    }
  }
}