Skip to main content
All webhook deliveries are sent as POST requests with Content-Type: application/json. Your endpoint must return a 2xx response within 10 seconds for the delivery to be considered successful. Every payload includes:
FieldTypeDescription
eventstringThe event type identifier
occurred_atstringISO 8601 timestamp of when the event occurred

candidate.applied

Sent when a candidate submits a self-serve application.
This event only fires for candidates who apply directly (via your careers page or application form). Candidates created through the API or other intake methods do not trigger this event.Specifically, it requires application_source = self_apply and lead_type = applied.

Payload

{
  "event": "candidate.applied",
  "occurred_at": "2026-03-11T00:00:00.000Z",
  "candidate": {
    "id": 123,
    "name": "Jane Doe",
    "email": "jane@example.com",
    "phone": "+61400000000",
    "fit_score": 82,
    "applied_at": "2026-03-11T00:00:00.000Z",
    "resume_url": "https://...",
    "resume_data": {},
    "url": "https://app.outhire.ai/leads/123"
  },
  "job": {
    "id": 456,
    "title": "Account Executive"
  },
  "company": {
    "id": 789
  }
}

Fields

candidate.id
integer
Unique candidate identifier.
candidate.name
string
Full name of the candidate.
candidate.email
string
Email address.
candidate.phone
string
Phone number in E.164 format.
candidate.fit_score
integer | null
AI-generated fit score (0–100). May be null if scoring has not completed.
candidate.applied_at
string
ISO 8601 timestamp of when the candidate applied.
candidate.resume_url
string | null
Signed URL to the candidate’s resume file, if one was uploaded. Expires after 24 hours.
candidate.resume_data
object | null
Parsed resume data, if available.
candidate.url
string
Direct link to the candidate’s profile in the Outhire app.
job.id
integer
ID of the job the candidate applied to.
job.title
string
Title of the job.
company.id
integer
ID of the company that owns the job.

candidate.stage_changed

Sent when a candidate moves from one pipeline stage to another. The event is not fired if the previous and new stage are the same.

Trigger sources

Stage changes can originate from:
  • A user moving a candidate in the UI (single or bulk)
  • Joel (Outhire’s AI agent) updating a candidate’s stage
  • The public API (PATCH /api/v1/candidates/:id)

Payload

{
  "event": "candidate.stage_changed",
  "occurred_at": "2026-03-11T00:00:00.000Z",
  "candidate": {
    "id": 123,
    "public_id": "cand_abc123",
    "name": "Jane Doe",
    "email": "jane@example.com",
    "url": "https://app.outhire.ai/leads/123"
  },
  "job": {
    "id": 456,
    "title": "Account Executive"
  },
  "company": {
    "id": 789
  },
  "stage_change": {
    "previous_stage": "applied",
    "new_stage": "interview",
    "changed_by": "user",
    "changed_by_user_id": "uuid-or-null"
  }
}

Fields

candidate.id
integer
Unique candidate identifier.
candidate.public_id
string
Public-facing candidate ID (prefixed with cand_).
candidate.name
string
Full name of the candidate.
candidate.email
string
Email address.
candidate.url
string
Direct link to the candidate’s profile in the Outhire app.
job.id
integer
ID of the job the candidate is associated with.
job.title
string
Title of the job.
company.id
integer
ID of the company.
stage_change.previous_stage
string
The stage the candidate was in before the change.
stage_change.new_stage
string
The stage the candidate moved to.
stage_change.changed_by
string
Who initiated the change. One of: user, joel, or api.
stage_change.changed_by_user_id
string | null
UUID of the user who made the change, when applicable. null for non-user actors.