canonical: https://jentic.com/apis/breezy.hr/breezy

# Breezy HR API

Jentic publishes the only available OpenAPI specification for Breezy HR API, keeping it validated and agent-ready. Breezy HR is an applicant tracking system whose v3 API exposes 28 endpoints across companies, positions (jobs), candidates, conversations, documents, resumes, and webhook endpoints. Recruiters use it to publish and update positions, source and update candidates, move candidates through pipeline stages, exchange messages with candidates, and attach resumes and supporting documents. Webhook endpoints let downstream systems react to candidate or position changes in near real time. Authentication is a bearer token obtained from POST /signin or generated in the Breezy dashboard.

## For AI agents

Manage positions, candidates, pipeline stages, conversations, and documents in the Breezy HR applicant tracking system through 28 v3 endpoints behind a bearer token.

## Scope

Does not handle payroll, benefits administration, or background checks - use for applicant tracking (positions, candidates, pipeline stages, conversations, and documents) only.

## Capabilities

- Create and update job positions via POST /positions and PUT /position/{positionId}, including changing live/draft state
- Source new candidates via POST /candidates and search them via GET /candidates/search
- Move a candidate to a new pipeline stage via PUT /candidate/{candidateId}/stage
- Read or post messages on a candidate's conversation thread via /candidate/{candidateId}/conversation
- Upload and retrieve resumes and supporting documents via /candidate/{candidateId}/resume and /candidate/{candidateId}/documents
- Register webhook endpoints to react to ATS events via /v3/company/{companyId}/webhook_endpoints
- Mint a bearer token at POST /signin and inspect company pipelines and questionnaires for stage and form metadata

## Use cases

### Sync external job board applications into Breezy

Capture candidates that apply through external sources (LinkedIn, Indeed, careers page) and push them into Breezy as new candidates against the right position. The integration calls POST /candidates with the parsed application data and the positionId, then POST /candidate/{candidateId}/resume to attach the CV. This keeps the recruiter's pipeline canonical without manual data entry.

Example prompt: POST /candidates with the parsed applicant fields and positionId, capture the candidateId, then POST /candidate/{candidateId}/resume with the uploaded CV file.

### Pipeline automation by stage transitions

Move candidates through pipeline stages automatically based on assessment results, scheduler outcomes, or interviewer feedback. PUT /candidate/{candidateId}/stage sets the new stage; combined with webhook endpoints registered through POST /v3/company/{companyId}/webhook_endpoints, downstream tools (calendar, payroll, BGC) react in near real time.

Example prompt: On a passing assessment score, PUT /candidate/{candidateId}/stage with the next stage_id, and rely on the registered webhook endpoint to notify the scheduler service.

### Candidate conversation and document collection

Drive candidate communication through a single API surface - read the conversation thread on a candidate via GET /candidate/{candidateId}/conversation and append recruiter messages with POST. Use POST /candidate/{candidateId}/documents to attach signed offer letters or NDAs and GET /candidate/{candidateId}/documents to inspect what is on file.

Example prompt: POST /candidate/{candidateId}/conversation with a recruiter message, then POST /candidate/{candidateId}/documents with the offer letter PDF and metadata.

### Position publishing and team assignment

Publish new roles and configure the hiring team without leaving the source-of-truth HRIS. POST /positions creates the role; PUT /position/{positionId}/state moves it from draft to live or pauses it; GET /position/{positionId}/team and the matching update operations align hiring managers and interviewers with each role.

Example prompt: POST /positions with title, description, and category, then PUT /position/{positionId}/state with state='live' to publish the role.

### AI agent integration via Jentic

An agent that triages incoming applications can discover Breezy HR through Jentic, load the create-candidate and stage-change operations, and execute them without holding the company's bearer token in prompt context. Jentic injects the token at execution time and returns typed candidate records the agent can act on.

Example prompt: Through Jentic, search 'add a candidate to a position', load the POST /candidates operation, and execute with positionId and parsed applicant fields supplied by the inbound integration.

## Key endpoints

| Method | Path | Description |
| --- | --- | --- |
| POST | /signin | Authenticate and retrieve a bearer token |
| GET | /positions | List job positions at the company |
| POST | /positions | Create a new job position |
| POST | /candidates | Create a new candidate against a position |
| PUT | /candidate/{candidateId}/stage | Move a candidate to a different pipeline stage |
| GET | /candidates/search | Search candidates across the company |
| POST | /candidate/{candidateId}/conversation | Post a message in a candidate's conversation |
| POST | /v3/company/{companyId}/webhook_endpoints | Register a webhook endpoint for ATS events |

## Key resources

- **Companies** — Read company-level metadata, pipelines, and questionnaires via /company/{companyId} endpoints
- **Positions** — Job postings - create, list, update, change state, and view the assigned team via /positions and /position/{positionId} endpoints
- **Candidates** — Applicants - create, update, search, and move through pipeline stages via /candidates and /candidate/{candidateId} endpoints
- **Conversations** — Messages exchanged with a candidate via /candidate/{candidateId}/conversation
- **Documents and resumes** — Per-candidate file attachments via /candidate/{candidateId}/documents and /candidate/{candidateId}/resume
- **Webhook endpoints** — Register and manage ATS webhook subscriptions via /v3/company/{companyId}/webhook_endpoints

## Why Jentic

- **Setup:** Wiring Breezy HR by hand means minting a bearer token at /signin or the dashboard, attaching it as an Authorization header on every call, and tracking positions, candidates, and pipeline stages across separate endpoints yourself. Through Jentic you install once, import Breezy HR from the API Directory, store the token once, and your agent calls it.
- **Permission scoping:** Breezy HR puts the candidate id in the URL path (/candidate/{candidateId}/...), so a rule can pin your agent to one candidate: it can move that candidate through stages and add conversations and nothing else. You choose the operations it may call, so a write like creating positions is not included unless you add it.
- **Credential handling:** Your Breezy HR bearer token is stored once, encrypted, by your own Jentic One instance and injected as the Authorization header at execution time. It never enters the agent's prompt, logs, or context.
- **Discovery method:** Agents search Jentic by intent such as 'add a candidate to a position' or 'move a candidate to a stage', and Jentic returns the matching Breezy HR operation, POST /candidates or PUT /candidate/{candidateId}/stage, with its input schema so the agent calls the right endpoint without browsing the reference docs.

## Related APIs

- **Breeze API** — Spawn Breeze onboarding kanban tasks when a Breezy HR candidate is hired
- **Brandfolder API** — Pull employer-brand assets from Brandfolder into Breezy HR job postings and careers pages
- **Braze Endpoints** — Send candidate nurture messages via Braze using stage events from Breezy HR webhooks

## FAQ

### Why is there no official OpenAPI spec for Breezy HR API?

Breezy HR documents the v3 API in narrative form rather than publishing a downloadable OpenAPI specification. Jentic generates and maintains this spec so that AI agents and developers can call Breezy HR API via structured tooling. It is validated against the live API and kept up to date. Get started with Jentic One, the self-hosted execution layer.

### What authentication does the Breezy HR API use?

The v3 API uses an HTTP bearer token. Mint one with POST /signin (email + password) or generate one in the Breezy dashboard, then send it as Authorization: Bearer {token} on every other call. Through Jentic, the token is held in the encrypted vault and attached at execution time.

### Can I move a candidate to a new pipeline stage with the Breezy HR API?

Yes. PUT /candidate/{candidateId}/stage accepts the target stage_id and updates the candidate's position in the pipeline. Use GET /company/{companyId}/pipelines first to discover the stage_id values for your hiring pipelines.

### What are the rate limits for the Breezy HR API?

Breezy HR does not publish numeric per-endpoint rate limits in the OpenAPI spec - quotas are tied to plan tier. For bulk candidate imports through POST /candidates, throttle client-side and back off when the API returns 429.

### How do I create a candidate in Breezy HR through Jentic?

Install with pip install jentic, then await client.search('add a candidate to a position'), await client.load on the POST /candidates operation, and await client.execute with positionId and the candidate fields. Jentic attaches the bearer token automatically.

### Does the Breezy HR API support webhooks for candidate events?

Yes. POST /v3/company/{companyId}/webhook_endpoints registers a webhook subscription and returns the endpointId. Manage existing subscriptions with GET, PUT, and DELETE on /v3/company/{companyId}/webhook_endpoint/{endpointId}, and react to candidate or position changes in your own service.

### Can I limit what my agent is allowed to do with the Breezy HR API?

Yes. Because you run Jentic One yourself, your own rules decide which Breezy HR operations and credentials the agent may use. Since Breezy HR carries the candidate id in the URL path (/candidate/{candidateId}/...), a rule can pin the agent to a single candidate so it can only move that candidate through pipeline stages with PUT /candidate/{candidateId}/stage and add messages with POST /candidate/{candidateId}/conversation. You choose the operations it may call, so a write like creating positions with POST /positions is excluded unless you add it.
