Every API here is available over the APIs.io API and to AI agents over MCP.
MCP server
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
Tools for apis
7 MCP tools reach this
find_apisBrowse and filter every API in the catalog.
get_api_artifactsOne API's artifacts, grouped by type.
get_openapiThe primary OpenAPI for this API.
find_similar_apisAPIs that look like this one.
apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
resolveTurn a domain, URL or GitHub org into the provider it belongs to.
find_cohortsEvery scored population of providers in the catalog.
All 92 tools →
Call it yourself
curl for this page
This API
curl "https://apis.io/api/v1/apis/popp:popp-ats-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
Get an API key
Free tier, no form to fill in. Signing in shares your email address with us — we
store it to create your key and to recognise you if you sign in with another
provider. See our Privacy Policy and
Terms.
A second provider on the same verified email joins the account you already have.
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
# --- truncated at 32 KB (33 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/popp/refs/heads/main/openapi/popp-ats-api-openapi.yml