Fountain Openings API
Manage openings (funnels) - the hiring workflows candidates move through - including listing, creating, updating, deleting openings, and listing the stages that belong to each opening.
Manage openings (funnels) - the hiring workflows candidates move through - including listing, creating, updating, deleting openings, and listing the stages that belong to each opening.
openapi: 3.0.3
info:
title: Fountain Developer API (Hire API v2)
description: >-
The Fountain Developer API lets customers of the Fountain high-volume hiring
platform programmatically manage their hiring data - applicants, openings
(funnels), positions, stages, labels, secure documents, interview scheduling
slots, webhooks, and post-hire workers. All requests are authenticated with
an API token passed in the X-ACCESS-TOKEN request header.
termsOfService: https://www.fountain.com/legal/terms-of-use
contact:
name: Fountain Support
email: support@fountain.com
url: https://developer.fountain.com/reference
version: '2.0'
servers:
- url: https://api.fountain.com/v2
description: Fountain Hire API v2
security:
- AccessToken: []
tags:
- name: Applicants
description: Manage applicants moving through hiring funnels.
- name: Openings
description: Manage openings (funnels) - the hiring workflows.
- name: Positions
description: Manage the job positions applicants are hired into.
- name: Stages
description: Retrieve stages and their available scheduling slots.
- name: Scheduling
description: Manage interview / calendar slots and bookings.
- name: Labels
description: Assign and manage labels on applicants and stages.
- name: Documents
description: Manage secure applicant documents.
- name: Webhooks
description: Manage webhook settings for hiring event notifications.
- name: Workers
description: Manage post-hire workers.
paths:
/applicants:
get:
operationId: listApplicants
tags:
- Applicants
summary: List all applicants
description: Returns a paginated list of applicants, filterable by funnel, stage, labels, and timestamps.
parameters:
- name: funnel_id
in: query
description: Filter by opening (funnel) ID.
schema:
type: string
- name: stage_id
in: query
description: Filter by stage ID.
schema:
type: string
- name: stage
in: query
description: Filter by stage type.
schema:
type: string
enum: [hired, rejected, archived, background_check, interview, signature]
- name: labels
in: query
description: Comma-separated, URL-encoded list of label titles.
schema:
type: string
- name: cursor
in: query
description: Cursor for cursor-based pagination.
schema:
type: string
- name: page
in: query
description: Page number for offset pagination.
schema:
type: integer
- name: per_page
in: query
description: Number of results per page.
schema:
type: integer
responses:
'200':
description: A list of applicants.
content:
application/json:
schema:
$ref: '#/components/schemas/ApplicantList'
'401':
$ref: '#/components/responses/Unauthorized'
post:
operationId: createApplicant
tags:
- Applicants
summary: Create an applicant
description: Creates a new applicant in a specified funnel.
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/ApplicantCreate'
responses:
'201':
description: The created applicant.
content:
application/json:
schema:
$ref: '#/components/schemas/Applicant'
'401':
$ref: '#/components/responses/Unauthorized'
/applicants/{id}:
parameters:
- $ref: '#/components/parameters/ApplicantId'
get:
operationId: getApplicant
tags:
- Applicants
summary: Get applicant info
responses:
'200':
description: The applicant.
content:
application/json:
schema:
$ref: '#/components/schemas/Applicant'
'401':
$ref: '#/components/responses/Unauthorized'
put:
operationId: updateApplicant
tags:
- Applicants
summary: Update applicant info
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/ApplicantUpdate'
responses:
'200':
description: The updated applicant.
content:
application/json:
schema:
$ref: '#/components/schemas/Applicant'
'401':
$ref: '#/components/responses/Unauthorized'
delete:
operationId: deleteApplicant
tags:
- Applicants
summary: Delete an applicant
responses:
'204':
description: Applicant deleted.
'401':
$ref: '#/components/responses/Unauthorized'
/applicants/{id}/advance:
parameters:
- $ref: '#/components/parameters/ApplicantId'
put:
operationId: advanceApplicant
tags:
- Applicants
summary: Advance an applicant
description: Advances an applicant to the next (or specified) stage in the funnel.
requestBody:
content:
application/json:
schema:
type: object
properties:
stage_id:
type: string
description: Target stage to advance the applicant to.
responses:
'200':
description: The advanced applicant.
content:
application/json:
schema:
$ref: '#/components/schemas/Applicant'
'401':
$ref: '#/components/responses/Unauthorized'
/applicants/advance:
post:
operationId: bulkAdvanceApplicants
tags:
- Applicants
summary: Bulk advance multiple applicants
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
applicant_ids:
type: array
items:
type: string
stage_id:
type: string
responses:
'200':
description: Bulk advance accepted.
'401':
$ref: '#/components/responses/Unauthorized'
/applicants/{id}/transitions:
parameters:
- $ref: '#/components/parameters/ApplicantId'
get:
operationId: getApplicantTransitions
tags:
- Applicants
summary: Get transition history
responses:
'200':
description: Applicant transition history.
'401':
$ref: '#/components/responses/Unauthorized'
/applicants/notify:
post:
operationId: notifyApplicant
tags:
- Applicants
summary: Notify applicant
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
applicant_id:
type: string
message:
type: string
responses:
'200':
description: Notification sent.
'401':
$ref: '#/components/responses/Unauthorized'
/applicants/{id}/duplicates:
parameters:
- $ref: '#/components/parameters/ApplicantId'
get:
operationId: getDuplicateApplicants
tags:
- Applicants
summary: Get duplicate applicants
responses:
'200':
description: List of potential duplicate applicants.
content:
application/json:
schema:
$ref: '#/components/schemas/ApplicantList'
'401':
$ref: '#/components/responses/Unauthorized'
/funnels:
get:
operationId: listOpenings
tags:
- Openings
summary: List all openings
description: Returns all openings (funnels) in the account.
responses:
'200':
description: A list of openings.
content:
application/json:
schema:
$ref: '#/components/schemas/OpeningList'
'401':
$ref: '#/components/responses/Unauthorized'
post:
operationId: createOpening
tags:
- Openings
summary: Create an opening
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/Opening'
responses:
'201':
description: The created opening.
content:
application/json:
schema:
$ref: '#/components/schemas/Opening'
'401':
$ref: '#/components/responses/Unauthorized'
/funnels/{id}:
parameters:
- $ref: '#/components/parameters/FunnelId'
get:
operationId: getOpening
tags:
- Openings
summary: Retrieve opening
responses:
'200':
description: The opening.
content:
application/json:
schema:
$ref: '#/components/schemas/Opening'
'401':
$ref: '#/components/responses/Unauthorized'
put:
operationId: updateOpening
tags:
- Openings
summary: Update opening
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/Opening'
responses:
'200':
description: The updated opening.
content:
application/json:
schema:
$ref: '#/components/schemas/Opening'
'401':
$ref: '#/components/responses/Unauthorized'
delete:
operationId: deleteOpening
tags:
- Openings
summary: Delete opening
responses:
'204':
description: Opening deleted.
'401':
$ref: '#/components/responses/Unauthorized'
/funnels/{funnel_id}/stages:
parameters:
- name: funnel_id
in: path
required: true
schema:
type: string
get:
operationId: listOpeningStages
tags:
- Openings
summary: List opening stages
responses:
'200':
description: The stages in the opening.
content:
application/json:
schema:
$ref: '#/components/schemas/StageList'
'401':
$ref: '#/components/responses/Unauthorized'
/positions:
get:
operationId: listPositions
tags:
- Positions
summary: List positions
responses:
'200':
description: A list of positions.
content:
application/json:
schema:
$ref: '#/components/schemas/PositionList'
'401':
$ref: '#/components/responses/Unauthorized'
post:
operationId: createPosition
tags:
- Positions
summary: Create a position
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/Position'
responses:
'201':
description: The created position.
content:
application/json:
schema:
$ref: '#/components/schemas/Position'
'401':
$ref: '#/components/responses/Unauthorized'
/positions/{id}:
parameters:
- $ref: '#/components/parameters/PositionId'
get:
operationId: getPosition
tags:
- Positions
summary: Retrieve position
responses:
'200':
description: The position.
content:
application/json:
schema:
$ref: '#/components/schemas/Position'
'401':
$ref: '#/components/responses/Unauthorized'
put:
operationId: updatePosition
tags:
- Positions
summary: Update position
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/Position'
responses:
'200':
description: The updated position.
content:
application/json:
schema:
$ref: '#/components/schemas/Position'
'401':
$ref: '#/components/responses/Unauthorized'
delete:
operationId: deletePosition
tags:
- Positions
summary: Delete position
responses:
'204':
description: Position deleted.
'401':
$ref: '#/components/responses/Unauthorized'
/stages/{id}:
parameters:
- $ref: '#/components/parameters/StageId'
get:
operationId: getStage
tags:
- Stages
summary: Retrieve stage
responses:
'200':
description: The stage.
content:
application/json:
schema:
$ref: '#/components/schemas/Stage'
'401':
$ref: '#/components/responses/Unauthorized'
/stages/{id}/available-slots:
parameters:
- $ref: '#/components/parameters/StageId'
get:
operationId: listStageAvailableSlots
tags:
- Stages
summary: List available slots
responses:
'200':
description: Available scheduling slots for the stage.
content:
application/json:
schema:
$ref: '#/components/schemas/SlotList'
'401':
$ref: '#/components/responses/Unauthorized'
/stages/{stage_id}/labels:
parameters:
- name: stage_id
in: path
required: true
schema:
type: string
get:
operationId: listStageLabels
tags:
- Labels
summary: List all labels in stage
responses:
'200':
description: Labels used in the stage.
content:
application/json:
schema:
$ref: '#/components/schemas/LabelList'
'401':
$ref: '#/components/responses/Unauthorized'
/applicants/{id}/labels:
parameters:
- $ref: '#/components/parameters/ApplicantId'
get:
operationId: listApplicantLabels
tags:
- Labels
summary: List labels for applicant
responses:
'200':
description: Labels on the applicant.
content:
application/json:
schema:
$ref: '#/components/schemas/LabelList'
'401':
$ref: '#/components/responses/Unauthorized'
/applicants/{id}/labels/{title}:
parameters:
- $ref: '#/components/parameters/ApplicantId'
- name: title
in: path
required: true
description: Label title.
schema:
type: string
put:
operationId: updateApplicantLabel
tags:
- Labels
summary: Update label for applicant
description: Assigns or removes a label on an applicant.
responses:
'200':
description: Label updated.
'401':
$ref: '#/components/responses/Unauthorized'
/available-slots:
post:
operationId: createAvailableSlots
tags:
- Scheduling
summary: Create calendar slots
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/Slot'
responses:
'201':
description: The created slot(s).
content:
application/json:
schema:
$ref: '#/components/schemas/Slot'
'401':
$ref: '#/components/responses/Unauthorized'
/available-slots/{id}:
parameters:
- name: id
in: path
required: true
schema:
type: string
patch:
operationId: updateAvailableSlot
tags:
- Scheduling
summary: Update calendar slot
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/Slot'
responses:
'200':
description: The updated slot.
content:
application/json:
schema:
$ref: '#/components/schemas/Slot'
'401':
$ref: '#/components/responses/Unauthorized'
delete:
operationId: deleteAvailableSlot
tags:
- Scheduling
summary: Delete calendar slot
responses:
'204':
description: Slot deleted.
'401':
$ref: '#/components/responses/Unauthorized'
/available-slots/{id}/confirm:
parameters:
- name: id
in: path
required: true
schema:
type: string
post:
operationId: bookAvailableSlot
tags:
- Scheduling
summary: Book available slot
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
applicant_id:
type: string
responses:
'200':
description: Slot booked.
'401':
$ref: '#/components/responses/Unauthorized'
/booked-slots/{id}/cancel:
parameters:
- name: id
in: path
required: true
schema:
type: string
post:
operationId: cancelBookedSlot
tags:
- Scheduling
summary: Cancel booked slot
responses:
'200':
description: Booking cancelled.
'401':
$ref: '#/components/responses/Unauthorized'
/applicants/{id}/secure-documents:
parameters:
- $ref: '#/components/parameters/ApplicantId'
get:
operationId: getApplicantFiles
tags:
- Documents
summary: Get applicant files
responses:
'200':
description: The applicant's secure documents.
content:
application/json:
schema:
$ref: '#/components/schemas/DocumentList'
'401':
$ref: '#/components/responses/Unauthorized'
/applicants/{id}/secure-documents-upload:
parameters:
- $ref: '#/components/parameters/ApplicantId'
post:
operationId: uploadApplicantFileToS3
tags:
- Documents
summary: Upload file to S3
description: Requests a pre-signed URL to upload a secure document directly to S3.
responses:
'200':
description: Upload URL details.
'401':
$ref: '#/components/responses/Unauthorized'
/applicants/{id}/secure-documents-link-upload:
parameters:
- $ref: '#/components/parameters/ApplicantId'
post:
operationId: linkApplicantS3Files
tags:
- Documents
summary: Link applicant to S3 files
responses:
'200':
description: Files linked to applicant.
'401':
$ref: '#/components/responses/Unauthorized'
/applicants/{id}/secure-documents-approve:
parameters:
- $ref: '#/components/parameters/ApplicantId'
post:
operationId: approveApplicantDocuments
tags:
- Documents
summary: Approve applicant documents
responses:
'200':
description: Documents approved.
'401':
$ref: '#/components/responses/Unauthorized'
/webhook-settings:
get:
operationId: listWebhookSettings
tags:
- Webhooks
summary: List webhook settings
responses:
'200':
description: A list of webhook settings.
content:
application/json:
schema:
$ref: '#/components/schemas/WebhookSettingList'
'401':
$ref: '#/components/responses/Unauthorized'
post:
operationId: createWebhookSetting
tags:
- Webhooks
summary: Create webhook setting
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/WebhookSetting'
responses:
'201':
description: The created webhook setting.
content:
application/json:
schema:
$ref: '#/components/schemas/WebhookSetting'
'401':
$ref: '#/components/responses/Unauthorized'
/webhook-settings/{id}:
parameters:
- name: id
in: path
required: true
schema:
type: string
get:
operationId: getWebhookSetting
tags:
- Webhooks
summary: Retrieve webhook setting
responses:
'200':
description: The webhook setting.
content:
application/json:
schema:
$ref: '#/components/schemas/WebhookSetting'
'401':
$ref: '#/components/responses/Unauthorized'
delete:
operationId: deleteWebhookSetting
tags:
- Webhooks
summary: Delete webhook setting
responses:
'204':
description: Webhook setting deleted.
'401':
$ref: '#/components/responses/Unauthorized'
/workers:
get:
operationId: listWorkers
tags:
- Workers
summary: List workers
responses:
'200':
description: A list of workers.
content:
application/json:
schema:
$ref: '#/components/schemas/WorkerList'
'401':
$ref: '#/components/responses/Unauthorized'
/workers/{id}:
parameters:
- name: id
in: path
required: true
schema:
type: string
get:
operationId: getWorker
tags:
- Workers
summary: Get worker info
responses:
'200':
description: The worker.
content:
application/json:
schema:
$ref: '#/components/schemas/Worker'
'401':
$ref: '#/components/responses/Unauthorized'
patch:
operationId: updateWorker
tags:
- Workers
summary: Update worker
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/Worker'
responses:
'200':
description: The updated worker.
content:
application/json:
schema:
$ref: '#/components/schemas/Worker'
'401':
$ref: '#/components/responses/Unauthorized'
/workers/{id}/activate:
parameters:
- name: id
in: path
required: true
schema:
type: string
post:
operationId: activateWorker
tags:
- Workers
summary: Activate worker
responses:
'200':
description: Worker activated.
'401':
$ref: '#/components/responses/Unauthorized'
/workers/{id}/deactivate:
parameters:
- name: id
in: path
required: true
schema:
type: string
post:
operationId: deactivateWorker
tags:
- Workers
summary: Deactivate worker
responses:
'200':
description: Worker deactivated.
'401':
$ref: '#/components/responses/Unauthorized'
components:
securitySchemes:
AccessToken:
type: apiKey
in: header
name: X-ACCESS-TOKEN
description: >-
Your Fountain API token. Request API access by emailing
support@fountain.com; find your token in your Fountain account settings.
parameters:
ApplicantId:
name: id
in: path
required: true
description: The applicant ID.
schema:
type: string
FunnelId:
name: id
in: path
required: true
description: The opening (funnel) ID.
schema:
type: string
PositionId:
name: id
in: path
required: true
description: The position ID.
schema:
type: string
StageId:
name: id
in: path
required: true
description: The stage ID.
schema:
type: string
responses:
Unauthorized:
description: Missing or invalid X-ACCESS-TOKEN.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
schemas:
Applicant:
type: object
properties:
id:
type: string
name:
type: string
email:
type: string
format: email
phone_number:
type: string
funnel_id:
type: string
stage_id:
type: string
status:
type: string
data:
type: object
additionalProperties: true
created_at:
type: string
format: date-time
updated_at:
type: string
format: date-time
ApplicantCreate:
type: object
required:
- name
- funnel_id
properties:
name:
type: string
email:
type: string
format: email
phone_number:
type: string
funnel_id:
type: string
data:
type: object
additionalProperties: true
ApplicantUpdate:
type: object
properties:
name:
type: string
email:
type: string
format: email
phone_number:
type: string
data:
type: object
additionalProperties: true
ApplicantList:
type: object
properties:
applicants:
type: array
items:
$ref: '#/components/schemas/Applicant'
pagination:
$ref: '#/components/schemas/Pagination'
Opening:
type: object
properties:
id:
type: string
title:
type: string
position_id:
type: string
location_id:
type: string
active:
type: boolean
created_at:
type: string
format: date-time
OpeningList:
type: object
properties:
funnels:
type: array
items:
$ref: '#/components/schemas/Opening'
pagination:
$ref: '#/components/schemas/Pagination'
Position:
type: object
properties:
id:
type: string
name:
type: string
external_id:
type: string
PositionList:
type: object
properties:
positions:
type: array
items:
$ref: '#/components/schemas/Position'
pagination:
$ref: '#/components/schemas/Pagination'
Stage:
type: object
properties:
id:
type: string
title:
type: string
type:
type: string
position:
type: integer
StageList:
type: object
properties:
stages:
type: array
items:
$ref: '#/components/schemas/Stage'
Slot:
type: object
properties:
id:
type: string
stage_id:
type: string
start_time:
type: string
format: date-time
end_time:
type: string
format: date-time
capacity:
type: integer
booked_count:
type: integer
location:
type: string
SlotList:
type: object
properties:
available_slots:
type: array
items:
$ref: '#/components/schemas/Slot'
Label:
type: object
properties:
title:
type: string
color:
type: string
LabelList:
type: object
properties:
labels:
type: array
items:
$ref: '#/components/schemas/Label'
Document:
type: object
properties:
id:
type: string
name:
type: string
status:
type: string
url:
type: string
format: uri
created_at:
type: string
format: date-time
DocumentList:
type: object
properties:
secure_documents:
type: array
items:
$ref: '#/components/schemas/Document'
WebhookSetting:
type: object
properties:
id:
type: string
url:
type: string
format: uri
event:
type: string
funnel_id:
type: string
stage_id:
type: string
WebhookSettingList:
type: object
properties:
webhook_settings:
type: array
items:
$ref: '#/components/schemas/WebhookSetting'
Worker:
type: object
properties:
id:
type: string
name:
type: string
email:
type: string
format: email
status:
type: string
position_id:
type: string
location_id:
type: string
WorkerList:
type: object
properties:
workers:
type: array
items:
$ref: '#/components/schemas/Worker'
pagination:
$ref: '#/components/schemas/Pagination'
Pagination:
type: object
properties:
next_cursor:
type: string
per_page:
type: integer
total:
type: integer
Error:
type: object
properties:
error:
type: string
message:
type: string