openapi: 3.2.0 info: title: Popp ATS API description: Popp API documentation version: '1' servers: - url: https://api.joinpopp.com description: Development server security: - popp_api_key: [] organization_id: [] tags: - name: ATS paths: /v1/ats/jobs: get: summary: List ATS jobs description: Returns a paginated list of the authenticated organization's ATS jobs, read live from your connected ATS and annotated with what each job is connected to in Popp (`workflow`, `campaign`, or `analysis`). Each job includes the available detail — `description` (which may contain HTML), location, salary, employment type, screening questions, hiring-pipeline stages, and any ATS custom fields. Use this to discover the `atsJobId` you need to wire an ATS entry pathway when building an ATS-driven workflow. Results are cursor-paginated — pass the returned `next` value back as the `next` query parameter to fetch the following page. Filtering by a single `atsJobId` still returns an array — of length 0 or 1, never a bare object or a 404. Returns `422` if your connected ATS does not support jobs, or `502` if the ATS integration returns an error. operationId: list-ats-jobs parameters: - name: status in: query description: 'Filter by normalized job status. Allowed values: `OPEN`, `CLOSED`, `DRAFT`, `ARCHIVED`.' required: false schema: $ref: '#/components/schemas/status-8a98e189-83b3-4600-a5a6-22ce67b183c7' - name: updatedAfter in: query description: Only return jobs updated at or after this ISO-8601 timestamp. required: false schema: $ref: '#/components/schemas/updatedAfter' - name: atsJobIds in: query description: Comma-separated list of `atsJobId`s to restrict the result to. A single-job lookup still returns an array — of length 0 or 1, never a bare object or a 404. required: false schema: $ref: '#/components/schemas/atsJobIds' - name: nameContains in: query description: Filter to jobs whose title contains this keyword. required: false schema: $ref: '#/components/schemas/nameContains' - name: jobCodes in: query description: Comma-separated list of provider requisition / job codes to filter by. required: false schema: $ref: '#/components/schemas/jobCodes' - name: pageSize in: query description: Maximum number of jobs to return per page. Must be an integer between 1 and 250; values outside this range are rejected with a 400. required: false schema: $ref: '#/components/schemas/pageSize' - name: next in: query description: Opaque pagination cursor returned by the previous call. Omit for the first page. required: false schema: $ref: '#/components/schemas/next' tags: - ATS responses: '200': description: '' content: application/json: schema: $ref: '#/components/schemas/ListAtsJobsResponse' headers: {} '400': description: '' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' headers: {} '401': description: '' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' headers: {} '403': description: '' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' headers: {} '422': description: '' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' headers: {} '500': description: '' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' headers: {} '502': description: '' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' headers: {} /v1/ats/jobs/{atsJobId}/stages: get: summary: List ATS job stages description: Returns the interview pipeline stages for a single ATS job, read live from your connected ATS. Discover the `atsJobId` via `GET /v1/ats/jobs`. Returns `422` if your connected ATS does not support job stages, or `502` if the ATS integration returns an error. An empty `stages` list means the job has none configured. operationId: list-ats-job-stages parameters: - name: atsJobId in: path description: The `atsJobId` (from `GET /v1/ats/jobs`) whose pipeline stages to list. required: true schema: $ref: '#/components/schemas/atsJobId' tags: - ATS responses: '200': description: '' content: application/json: schema: $ref: '#/components/schemas/ListAtsJobStagesResponse' headers: {} '400': description: '' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' headers: {} '401': description: '' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' headers: {} '403': description: '' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' headers: {} '422': description: '' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' headers: {} '500': description: '' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' headers: {} '502': description: '' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' headers: {} /v1/ats/rejection-reasons: get: summary: List ATS rejection reasons description: Returns the rejection reasons configured in the authenticated organization's connected ATS, read live. Use the `atsReasonId` values when configuring workflow behaviour that rejects a candidate in the ATS. Returns `422` if your connected ATS does not support rejection reasons, or `502` if the ATS integration returns an error. An empty `rejectionReasons` list means none are configured. operationId: list-ats-rejection-reasons parameters: [] tags: - ATS responses: '200': description: '' content: application/json: schema: $ref: '#/components/schemas/ListAtsRejectionReasonsResponse' headers: {} '401': description: '' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' headers: {} '403': description: '' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' headers: {} '422': description: '' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' headers: {} '500': description: '' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' headers: {} '502': description: '' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' headers: {} components: schemas: atsJobId: type: string ListAtsJobsResponse: type: object description: 'A page of your organization''s ATS jobs, read live from your connected ATS and annotated with what each job is connected to in Popp (`workflow`, `campaign`, or `analysis`). Cursor-paginated: pass the returned `next` value back as the `next` query parameter for the following page. Filtering by a single `atsJobId` returns an array of length 0 or 1 (never a bare object or a 404). Use an `atsJobId` to connect a workflow to that job via an ATS entry pathway.' properties: jobs: type: array title: Jobs description: ATS jobs on this page. items: type: object properties: atsJobId: type: string title: ATS Job ID description: The job's identifier in your ATS. Use this to connect a workflow to the job via an ATS entry pathway. title: type: - string - 'null' title: Title description: Job title. atsJobReference: type: - string - 'null' title: ATS Job Reference description: Your ATS's requisition or job code for the role, when provided. status: type: - string - 'null' enum: - OPEN - CLOSED - DRAFT - ARCHIVED title: Status description: Normalized job status, or `null` when your ATS's value doesn't map to one of these (see `rawStatus`). rawStatus: type: - string - 'null' title: Raw Status description: The verbatim status string from your ATS, before normalization. remoteWorkStatus: type: - string - 'null' enum: - REMOTE - HYBRID - TEMPORARY - ON_SITE title: Remote Work Status description: Normalized remote-work arrangement for the role, when available. description: type: - string - 'null' title: Description description: Job description. May contain HTML. department: type: - string - 'null' title: Department description: Department the role sits in, when provided. category: type: - string - 'null' title: Category description: Job category, when provided. experienceLevel: type: - string - 'null' title: Experience Level description: Experience level for the role, when provided. employmentType: type: - string - 'null' title: Employment Type description: Employment type passed through from your ATS (e.g. `FULL_TIME`, `PART_TIME`, `CONTRACT`). visibility: type: - string - 'null' title: Visibility description: Posting visibility passed through from your ATS (e.g. `PUBLIC`, `INTERNAL`). weeklyHours: type: - number - 'null' title: Weekly Hours description: Contracted weekly hours, when provided. postUrl: type: - string - 'null' title: Post URL description: Public posting URL, when provided. remoteUrl: type: - string - 'null' title: Remote URL description: Provider-hosted job URL, when provided. location: type: object title: Location description: Job location, decomposed. Each field is `null` when your ATS doesn't provide it. properties: city: type: - string - 'null' title: City state: type: - string - 'null' title: State country: type: - string - 'null' title: Country required: - city - state - country additionalProperties: false salary: type: object title: Salary description: Salary information, when provided by your ATS. Each field is `null` when unavailable. properties: amount: type: - number - 'null' title: Amount from: type: - number - 'null' title: From to: type: - number - 'null' title: To currency: type: - string - 'null' title: Currency period: type: - string - 'null' title: Period description: Salary period passed through from your ATS (e.g. `YEAR`, `MONTH`, `HOUR`). required: - amount - from - to - currency - period additionalProperties: false openedAt: type: - string - 'null' format: date-time title: Opened At description: When the job was opened in your ATS, when provided. closedAt: type: - string - 'null' format: date-time title: Closed At description: When the job was closed in your ATS, when provided. remoteUpdatedAt: type: - string - 'null' format: date-time title: Remote Updated At description: When the job was last updated in your ATS, when provided. customFields: type: - object - 'null' title: Custom Fields description: Arbitrary custom fields configured in your ATS, as key-value pairs. `null` when none. additionalProperties: true stages: type: array title: Stages description: The job's hiring-pipeline stages. items: type: object properties: atsStageId: type: - string - 'null' title: ATS Stage ID name: type: - string - 'null' title: Name index: type: - integer - 'null' title: Index description: Order within the pipeline, when provided. required: - atsStageId - name - index additionalProperties: false screeningQuestions: type: array title: Screening Questions description: The job's screening questions. items: type: object properties: atsQuestionId: type: - string - 'null' title: ATS Question ID title: type: - string - 'null' title: Title description: type: - string - 'null' title: Description description: Question help text. May contain HTML. type: type: - string - 'null' title: Type description: Answer format (e.g. `TEXT`, `SINGLE_SELECT`, `MULTI_SELECT`). required: type: - boolean - 'null' title: Required options: type: array title: Options description: Choices for `SINGLE_SELECT` / `MULTI_SELECT` questions. items: type: object properties: atsOptionId: type: - string - 'null' title: ATS Option ID name: type: - string - 'null' title: Name required: - atsOptionId - name additionalProperties: false required: - atsQuestionId - title - description - type - required - options additionalProperties: false isConnected: type: boolean title: Is Connected description: True when the job is connected to a workflow, campaign, or analysis. workflow: type: - object - 'null' title: Connected Workflow description: The workflow this job is connected to, or `null`. A job connected to a workflow cannot also be connected to a campaign or analysis. required: - id - name additionalProperties: false properties: id: type: string title: ID description: Identifier of the connected workflow. name: type: string title: Name description: Human-readable label for the connected workflow. campaign: type: - object - 'null' title: Connected Campaign description: The campaign this job is connected to, or `null`. required: - id - name additionalProperties: false properties: id: type: string title: ID description: Identifier of the connected campaign. name: type: string title: Name description: Human-readable label for the connected campaign. analysis: type: - object - 'null' title: Connected Analysis description: The analysis this job is connected to, or `null`. required: - id - name additionalProperties: false properties: id: type: string title: ID description: Identifier of the connected analysis. name: type: string title: Name description: Human-readable label for the connected analysis. required: - atsJobId - isConnected - location - salary - stages - screeningQuestions additionalProperties: false next: type: - string - 'null' title: Next description: Pagination cursor. Pass as the `next` query parameter to fetch the following page; `null` on the last page. required: - jobs additionalProperties: false ListAtsRejectionReasonsResponse: type: object description: The rejection reasons configured in your connected ATS for the authenticated organization, read live. Empty when none are configured. properties: rejectionReasons: type: array title: Rejection Reasons description: ATS rejection reasons available to the organization. items: type: object properties: atsReasonId: type: - string - 'null' title: ATS Reason ID description: The rejection reason's identifier in your ATS. name: type: - string - 'null' title: Name description: Human-readable rejection reason. atsJobIds: type: string ListAtsJobStagesResponse: type: object description: The interview pipeline stages for an ATS job, read live from your connected ATS. Empty when the job has none configured. properties: stages: type: array title: Stages description: ATS pipeline stages for the job, in the order your ATS defines. items: type: object properties: atsStageId: type: - string - 'null' title: ATS Stage ID description: The stage's identifier in your ATS. name: type: - string - 'null' title: Name description: Human-readable stage name. index: type: - integer - 'null' title: Index description: Zero-based position of the stage in the pipeline, when your ATS provides an ordering. nameContains: type: string jobCodes: type: string updatedAfter: type: string format: date-time next: type: string ErrorResponse: type: object status-8a98e189-83b3-4600-a5a6-22ce67b183c7: type: string enum: - OPEN - CLOSED - DRAFT - ARCHIVED pageSize: type: integer minimum: 1 maximum: 250 securitySchemes: popp_api_key: description: Your Popp API key for authentication type: apiKey name: x-api-key in: header organization_id: description: Your organization's unique identifier type: apiKey name: x-organization-id in: header x-provenance: method: searched source: https://docs.joinpopp.com/reference harvested: '2026-10-14' tool: harvest-readme-openapi.py note: Assembled verbatim from the OpenAPI definition ReadMe embeds in each operation page of the provider's developer portal; paths and components merged by API title, nothing authored. assembled_from: - https://docs.joinpopp.com/reference/add-candidates-to-list-by-external-id.md - https://docs.joinpopp.com/reference/add-candidates-to-list.md - https://docs.joinpopp.com/reference/archive-analysis.md - https://docs.joinpopp.com/reference/archive-document-type.md - https://docs.joinpopp.com/reference/archive-workflow-by-external-id.md - https://docs.joinpopp.com/reference/archive-workflow.md - https://docs.joinpopp.com/reference/bulk-create-conversations.md - https://docs.joinpopp.com/reference/cancel-booking.md - https://docs.joinpopp.com/reference/cancel-workflow-run.md - https://docs.joinpopp.com/reference/create-analysis-candidate.md - https://docs.joinpopp.com/reference/create-analysis.md - https://docs.joinpopp.com/reference/create-campaign.md - https://docs.joinpopp.com/reference/create-candidate-list.md - https://docs.joinpopp.com/reference/create-candidate-note-by-external-id.md - https://docs.joinpopp.com/reference/create-candidate-note.md - https://docs.joinpopp.com/reference/create-candidate.md - https://docs.joinpopp.com/reference/create-conversation.md - https://docs.joinpopp.com/reference/create-custom-field.md - https://docs.joinpopp.com/reference/create-document-credential.md - https://docs.joinpopp.com/reference/create-document-type.md - https://docs.joinpopp.com/reference/create-meeting-template.md - https://docs.joinpopp.com/reference/create-organization-config.md - https://docs.joinpopp.com/reference/create-scheduling-conversation.md - https://docs.joinpopp.com/reference/create-user.md - https://docs.joinpopp.com/reference/create-webhook.md - https://docs.joinpopp.com/reference/create-workflow.md - https://docs.joinpopp.com/reference/deactivate-user-by-email.md - https://docs.joinpopp.com/reference/deactivate-user.md - https://docs.joinpopp.com/reference/delete-candidate-by-email.md - https://docs.joinpopp.com/reference/delete-candidate-by-external-id.md - https://docs.joinpopp.com/reference/delete-candidate-by-phone-number.md - https://docs.joinpopp.com/reference/delete-candidate-list-by-external-id.md - https://docs.joinpopp.com/reference/delete-candidate-list.md - https://docs.joinpopp.com/reference/delete-candidate-note.md - https://docs.joinpopp.com/reference/delete-candidate.md - https://docs.joinpopp.com/reference/delete-custom-field.md - https://docs.joinpopp.com/reference/delete-document-credential.md - https://docs.joinpopp.com/reference/delete-document-type.md - https://docs.joinpopp.com/reference/delete-meeting-template.md - https://docs.joinpopp.com/reference/delete-tag.md - https://docs.joinpopp.com/reference/delete-user-by-email.md - https://docs.joinpopp.com/reference/delete-user.md - https://docs.joinpopp.com/reference/delete-webhook.md - https://docs.joinpopp.com/reference/download-media.md - https://docs.joinpopp.com/reference/generate-preferred-answer-requirements.md - https://docs.joinpopp.com/reference/generate-questions.md - https://docs.joinpopp.com/reference/generate-requirements.md - https://docs.joinpopp.com/reference/get-analysis.md - https://docs.joinpopp.com/reference/get-booking.md - https://docs.joinpopp.com/reference/get-campaign.md - https://docs.joinpopp.com/reference/get-candidate-by-external-id.md - https://docs.joinpopp.com/reference/get-candidate-list-by-external-id.md - https://docs.joinpopp.com/reference/get-candidate-list.md - https://docs.joinpopp.com/reference/get-candidate-profile-by-external-id.md - https://docs.joinpopp.com/reference/get-candidate.md - https://docs.joinpopp.com/reference/get-conversation.md - https://docs.joinpopp.com/reference/get-custom-field.md - https://docs.joinpopp.com/reference/get-document-media.md - https://docs.joinpopp.com/reference/get-document-type.md - https://docs.joinpopp.com/reference/get-document.md - https://docs.joinpopp.com/reference/get-meeting-template.md - https://docs.joinpopp.com/reference/get-organization-config-by-external-id.md - https://docs.joinpopp.com/reference/get-organization-config.md - https://docs.joinpopp.com/reference/get-organization-details.md - https://docs.joinpopp.com/reference/get-user-by-email.md - https://docs.joinpopp.com/reference/get-user-calendar.md - https://docs.joinpopp.com/reference/get-user.md - https://docs.joinpopp.com/reference/get-workflow-analysis-application.md - https://docs.joinpopp.com/reference/get-workflow-analysis.md - https://docs.joinpopp.com/reference/get-workflow-by-external-id.md - https://docs.joinpopp.com/reference/get-workflow-run.md - https://docs.joinpopp.com/reference/get-workflow.md - https://docs.joinpopp.com/reference/hand-conversation-to-agent.md - https://docs.joinpopp.com/reference/invite-calendar-contact.md - https://docs.joinpopp.com/reference/list-agents.md - https://docs.joinpopp.com/reference/list-analyses.md - https://docs.joinpopp.com/reference/list-ats-job-stages.md - https://docs.joinpopp.com/reference/list-ats-jobs.md - https://docs.joinpopp.com/reference/list-ats-rejection-reasons.md - https://docs.joinpopp.com/reference/list-bookings.md - https://docs.joinpopp.com/reference/list-campaigns.md - https://docs.joinpopp.com/reference/list-candidate-lists.md - https://docs.joinpopp.com/reference/list-candidate-notes-by-external-id.md - https://docs.joinpopp.com/reference/list-candidate-notes.md - https://docs.joinpopp.com/reference/list-conversation-documents.md - https://docs.joinpopp.com/reference/list-conversation-messages.md - https://docs.joinpopp.com/reference/list-conversations.md - https://docs.joinpopp.com/reference/list-custom-fields.md - https://docs.joinpopp.com/reference/list-document-credentials.md - https://docs.joinpopp.com/reference/list-document-types.md - https://docs.joinpopp.com/reference/list-meeting-templates.md - https://docs.joinpopp.com/reference/list-organization-users.md - https://docs.joinpopp.com/reference/list-organizations.md - https://docs.joinpopp.com/reference/list-tags.md - https://docs.joinpopp.com/reference/list-templates.md - https://docs.joinpopp.com/reference/list-user-calendars.md - https://docs.joinpopp.com/reference/list-users.md - https://docs.joinpopp.com/reference/list-webhook-events.md - https://docs.joinpopp.com/reference/list-webhooks.md - https://docs.joinpopp.com/reference/list-workflow-analysis-application-history.md - https://docs.joinpopp.com/reference/list-workflow-analysis-applications.md - https://docs.joinpopp.com/reference/list-workflow-runs.md - https://docs.joinpopp.com/reference/list-workflows.md - https://docs.joinpopp.com/reference/parse-availability.md - https://docs.joinpopp.com/reference/pause-workflow-by-external-id.md - https://docs.joinpopp.com/reference/pause-workflow.md - https://docs.joinpopp.com/reference/process-document.md - https://docs.joinpopp.com/reference/publish-workflow-by-external-id.md - https://docs.joinpopp.com/reference/publish-workflow.md - https://docs.joinpopp.com/reference/reactivate-user-by-email.md - https://docs.joinpopp.com/reference/reactivate-user.md - https://docs.joinpopp.com/reference/remove-candidate-document-by-external-id.md - https://docs.joinpopp.com/reference/remove-candidate-document.md - https://docs.joinpopp.com/reference/remove-candidates-from-list-by-external-id.md - https://docs.joinpopp.com/reference/remove-candidates-from-list.md - https://docs.joinpopp.com/reference/reparse-candidate-cv-by-external-id.md - https://docs.joinpopp.com/reference/reparse-candidate-cv.md - https://docs.joinpopp.com/reference/resend-booking-url.md - https://docs.joinpopp.com/reference/resume-workflow-by-external-id.md - https://docs.joinpopp.com/reference/resume-workflow.md - https://docs.joinpopp.com/reference/send-conversation-message.md - https://docs.joinpopp.com/reference/set-user-calendar-availability.md - https://docs.joinpopp.com/reference/sign-out-user-by-email.md - https://docs.joinpopp.com/reference/sign-out-user.md - https://docs.joinpopp.com/reference/start-workflow-runs-by-external-id.md - https://docs.joinpopp.com/reference/start-workflow-runs.md - https://docs.joinpopp.com/reference/stop-campaign.md - https://docs.joinpopp.com/reference/takeover-conversation.md - https://docs.joinpopp.com/reference/update-analysis.md - https://docs.joinpopp.com/reference/update-booking.md - https://docs.joinpopp.com/reference/update-campaign.md - https://docs.joinpopp.com/reference/update-candidate-by-external-id.md - https://docs.joinpopp.com/reference/update-candidate-list-by-external-id.md - https://docs.joinpopp.com/reference/update-candidate-list.md - https://docs.joinpopp.com/reference/update-candidate-note.md - https://docs.joinpopp.com/reference/update-candidate.md - https://docs.joinpopp.com/reference/update-custom-field.md - https://docs.joinpopp.com/reference/update-document-credential.md - https://docs.joinpopp.com/reference/update-document-type.md - https://docs.joinpopp.com/reference/update-meeting-template.md - https://docs.joinpopp.com/reference/update-organization-config-by-external-id.md - https://docs.joinpopp.com/reference/update-organization-config.md - https://docs.joinpopp.com/reference/update-organization-details.md - https://docs.joinpopp.com/reference/update-requirements-and-reanalyse.md - https://docs.joinpopp.com/reference/update-user-by-email.md - https://docs.joinpopp.com/reference/update-user.md - https://docs.joinpopp.com/reference/update-webhook.md - https://docs.joinpopp.com/reference/update-workflow-by-external-id.md - https://docs.joinpopp.com/reference/update-workflow.md merge: pages: 149 deduped: 618 conflicts_kept_first: 0