---
title: "Get user's activity feed"
method: GET
path: "/users/{id}/activities"
tags: ["Users"]
---

# Get user's activity feed

`GET /users/{id}/activities`

## Request

- Base URL: `https://api.100hires.com/v2`
- URL: `https://api.100hires.com/v2/users/{id}/activities`
- Auth: HTTP bearer

Chronological feed (newest first) of the actions the user PERFORMED over a period — created candidates/jobs, notes (full body), stage moves (from/to stage names), disqualifications (reason), manually sent emails (subject + full body), manually sent SMS (full body) and logged Twilio calls (duration, status, transcription when available). Bodies and names are embedded — no follow-up requests needed for a full audit. Automation-originated emails/SMS (nurture campaigns, scheduled sends) are excluded: the feed reflects manual work only. Interviews the user HELD are NOT part of this feed (the event store carries no interviewer attribution) — use `GET /interviews?interviewer_user_id={id}&date=...` for those; a weekly audit is exactly these two requests. Requires the `companyManageSettings` permission (Administrator/Recruiter roles) — the same audience as the in-app Activity Log report. `company_id` disambiguates multi-company API keys; without it the first accessible company the user belongs to is used. Content referencing hard-deleted source records degrades to `null` with `content: missed` — the activity row itself always stays. New activity reaches the feed with a few minutes' ingestion lag.

## Path parameters

- `id` integer, required

## Query parameters

- `company_id` integer
- `since` union, required
  - integer
  - string
- `until` union
  - integer
  - string
- `event_type` string
- `page` integer
- `size` integer
- `view` 'full' | 'summary'

## Response `200`

User activity feed

- UserActivityListResponse
  - `activities` UserActivity[], required: Activity feed items, newest first.
    - union: One user-activity feed item (#3980). `event_id`/`type`/`occurred_at` are always present; the rest of the object is the per-type payload. `candidate`/`job` references are the STANDARD summary payloads (the same objects /candidates and /jobs return). With `view=summary` the heavy bodies (email body, SMS body, note text, call transcription text) are replaced by 200-character `*_preview` twins. When the source record behind `email`/`sms`/`note`/`call` was hard-deleted, that key is `null` and `content: missed` marks the degradation — the item itself is never dropped.
      - UserActivityCandidateAdded: The user created a candidate.
        - `event_id` string, required: Deterministic event UUID from the reporting event store.
        - `type` 'candidate_added', required: Activity type identifier.
        - `occurred_at` integer, required: Unix timestamp (seconds, UTC) of when the action happened.
        - `candidate` union, required: The STANDARD candidate object in summary view — the same shape /candidates returns (the Candidate schema without `profile`). An {id}-only stub when the candidate is hard-deleted; null when the event carries no candidate.
          - Candidate
            - `id` integer, required: Unique identifier
            - `alias` string, nullable: Short alphanumeric alias used in profile URLs. Use this to build candidate profile links — `https://app.100hires.com/candidate/{alias}`. Also accepted as `{id}` in API requests.
            - `url_backoffice` string, uri: Absolute backoffice URL of the candidate in the 100Hires recruiter app. Use to render deep-links in agent UIs.
            - `company_id` integer, required: ID of the company this candidate belongs to
            - `first_name` string, nullable: Candidate's first name
            - `last_name` string, nullable: Candidate's last name
            - `emails` string[], nullable: List of candidate email addresses
            - `phones` string[], nullable: List of candidate phone numbers
            - `source` IdName
              - …
            - `origin` IdName
              - …
            - `profile` ProfileAnswer[]: Candidate profile field answers (application form responses). Present only when `view=full` (default); omitted entirely when `view=summary` to keep list responses inside the agent context budget — a single candidate can carry dozens of free-form answers.
              - …
            - `ip` string, nullable: IP address from which the candidate applied
            - `applications` CandidateApplicationSummary[]: Summary of all applications this candidate has across jobs
              - …
            - `created_at` integer, required: Unix timestamp (seconds)
            - `updated_at` integer, required: Unix timestamp (seconds)
            - `last_message_at` integer, nullable: Unix timestamp (seconds) of the most recent message (email or SMS) sent to or received from this candidate. Null if no messages exist.
            - `days_since_last_message` integer, nullable: Number of whole days since the last message. Computed at request time. Null if no messages exist.
          - object: Hard-deleted candidate stub.
            - `id` integer, required
      - UserActivityJobCreated: The user created a job.
        - `event_id` string, required: Deterministic event UUID from the reporting event store.
        - `type` 'job_created', required: Activity type identifier.
        - `occurred_at` integer, required: Unix timestamp (seconds, UTC) of when the action happened.
        - `job` union, required: The STANDARD job object in summary view — the same shape /jobs returns (the Job schema without `description`). An {id}-only stub when the job is hard-deleted; null when the event carries no job.
          - Job
            - `id` integer, required: Unique identifier
            - `alias` string, nullable: Short alphanumeric alias used in UI URLs. Use this to build job links — `https://app.100hires.com/job/{alias}/candidates/pipeline`. Also accepted as `{id}` in API requests.
            - `company_id` integer, required: ID of the company this job belongs to
            - `title` string, required: Public job title shown to candidates
            - `internal_title` string, nullable: Internal job title visible only to the hiring team
            - `internal_job_id` string, nullable: Company's internal job identifier (e.g. requisition number)
            - `description` string: Job description (HTML). Present only when `view=full` (default); omitted entirely when `view=summary` to keep list responses inside the agent context budget. Use `GET /jobs/{id}` or `view=full` to retrieve.
            - `resume_field_status` 'required' | 'optional' | 'hidden', nullable: Whether resume upload is required, optional, or hidden on the application form
            - `location` JobLocation
              - …
            - `url` string, required: Public URL of the job posting page
            - `url_backoffice` string: Backoffice URL — opens the job's pipeline view inside the recruiter app (`https://app.100hires.com/job/{alias}/candidates/pipeline`). Use this to link agent widgets / UI to the in-app job page rather than the public career page.
            - `is_remote` boolean, required: Whether this is a remote position
            - `is_hybrid` boolean, required: Whether this is a hybrid position: office days plus remote days at the job address. Never true together with is_remote.
            - `job_board_remote_scope` 'city' | 'statewide' | 'nationwide', nullable: How a remote job is listed on Indeed: city, statewide or nationwide. Null when the job is not remote.
            - `status` string, required: Job status: open, closed, draft, or archived
            - `department` IdName
              - …
            - `category` IdName
              - …
            - `employment_type` IdName
              - …
            - `education_level` IdName
              - …
            - `experience_level` IdName
              - …
            - `workflow_id` integer, nullable: ID of the hiring workflow (pipeline) assigned to this job
            - `workflow` IdName
              - …
            - `form_id` integer, nullable: ID of the application form candidates fill in for this job — the form attached to the job, or the company default form when the job has none attached yet (the same rule the public apply page follows). `null` only when the company has no forms. Fetch the questions with `GET /forms/{id}`. Present in both `view=full` and `view=summary`.
            - `pipeline_stages` object[], nullable: Pipeline stages for this job's workflow. Only included when `include=pipeline_stages` is specified. Suppressed when `view=summary` even if the include was requested.
              - …
            - `salary_min` number, nullable: Minimum salary
            - `salary_max` number, nullable: Maximum salary
            - `salary_currency` string, nullable: Salary currency code (e.g. USD, EUR)
            - `salary_period` 'annually' | 'monthly' | 'daily' | 'hourly', nullable: Salary period
            - `hours_per_week_min` integer, nullable: Minimum hours per week
            - `hours_per_week_max` integer, nullable: Maximum hours per week
            - `indeed_posting_data` object: Indeed job board posting metadata. Present only when `view=full` (default); omitted entirely when `view=summary`.
            - `hiring_team` JobHiringTeamMember[]: Team members assigned to this job. Embedded via `include=hiring_team`. Suppressed when `view=summary` even if the include was requested.
              - …
            - `is_satellite` boolean: Whether this job is a satellite (child) of a canonical job. Satellite jobs share the candidate pipeline of their parent.
            - `parent_job_id` integer, nullable: ID of the canonical (parent) job. Null for canonical jobs. Recruiting operations should target the canonical job.
            - `language` string, nullable: Locale this job's public page renders in, overriding the career site language. Null means the page follows the career site language (`GET /companies/career-site-settings`), which in turn falls back to en-US. This is the override, not the effective language. Present in both `view=full` and `view=summary`.
            - `created_at` integer, required: Unix timestamp (seconds)
            - `updated_at` integer, required: Unix timestamp (seconds)
            - `ai_scoring_criteria` AiScoringCriterion[]: AI scoring criteria configured for this job, ordered by `position` ASC. Returned as an empty array when none are configured. Present only when `view=full` (default); omitted entirely when `view=summary`.
              - …
          - object: Hard-deleted job stub.
            - `id` integer, required
      - UserActivityStageMoved: The user moved a candidate between pipeline stages. `type: hired` is the same shape — a move into the hired stage.
        - `event_id` string, required: Deterministic event UUID from the reporting event store.
        - `type` 'stage_moved' | 'hired', required: Activity type identifier.
        - `occurred_at` integer, required: Unix timestamp (seconds, UTC) of when the action happened.
        - `candidate` union, required: The STANDARD candidate object in summary view — the same shape /candidates returns (the Candidate schema without `profile`). An {id}-only stub when the candidate is hard-deleted; null when the event carries no candidate.
          - Candidate
            - `id` integer, required: Unique identifier
            - `alias` string, nullable: Short alphanumeric alias used in profile URLs. Use this to build candidate profile links — `https://app.100hires.com/candidate/{alias}`. Also accepted as `{id}` in API requests.
            - `url_backoffice` string, uri: Absolute backoffice URL of the candidate in the 100Hires recruiter app. Use to render deep-links in agent UIs.
            - `company_id` integer, required: ID of the company this candidate belongs to
            - `first_name` string, nullable: Candidate's first name
            - `last_name` string, nullable: Candidate's last name
            - `emails` string[], nullable: List of candidate email addresses
            - `phones` string[], nullable: List of candidate phone numbers
            - `source` IdName
              - …
            - `origin` IdName
              - …
            - `profile` ProfileAnswer[]: Candidate profile field answers (application form responses). Present only when `view=full` (default); omitted entirely when `view=summary` to keep list responses inside the agent context budget — a single candidate can carry dozens of free-form answers.
              - …
            - `ip` string, nullable: IP address from which the candidate applied
            - `applications` CandidateApplicationSummary[]: Summary of all applications this candidate has across jobs
              - …
            - `created_at` integer, required: Unix timestamp (seconds)
            - `updated_at` integer, required: Unix timestamp (seconds)
            - `last_message_at` integer, nullable: Unix timestamp (seconds) of the most recent message (email or SMS) sent to or received from this candidate. Null if no messages exist.
            - `days_since_last_message` integer, nullable: Number of whole days since the last message. Computed at request time. Null if no messages exist.
          - object: Hard-deleted candidate stub.
            - `id` integer, required
        - `application_id` integer, nullable, required
        - `job` union, required: The STANDARD job object in summary view — the same shape /jobs returns (the Job schema without `description`). An {id}-only stub when the job is hard-deleted; null when the event carries no job.
          - Job
            - `id` integer, required: Unique identifier
            - `alias` string, nullable: Short alphanumeric alias used in UI URLs. Use this to build job links — `https://app.100hires.com/job/{alias}/candidates/pipeline`. Also accepted as `{id}` in API requests.
            - `company_id` integer, required: ID of the company this job belongs to
            - `title` string, required: Public job title shown to candidates
            - `internal_title` string, nullable: Internal job title visible only to the hiring team
            - `internal_job_id` string, nullable: Company's internal job identifier (e.g. requisition number)
            - `description` string: Job description (HTML). Present only when `view=full` (default); omitted entirely when `view=summary` to keep list responses inside the agent context budget. Use `GET /jobs/{id}` or `view=full` to retrieve.
            - `resume_field_status` 'required' | 'optional' | 'hidden', nullable: Whether resume upload is required, optional, or hidden on the application form
            - `location` JobLocation
              - …
            - `url` string, required: Public URL of the job posting page
            - `url_backoffice` string: Backoffice URL — opens the job's pipeline view inside the recruiter app (`https://app.100hires.com/job/{alias}/candidates/pipeline`). Use this to link agent widgets / UI to the in-app job page rather than the public career page.
            - `is_remote` boolean, required: Whether this is a remote position
            - `is_hybrid` boolean, required: Whether this is a hybrid position: office days plus remote days at the job address. Never true together with is_remote.
            - `job_board_remote_scope` 'city' | 'statewide' | 'nationwide', nullable: How a remote job is listed on Indeed: city, statewide or nationwide. Null when the job is not remote.
            - `status` string, required: Job status: open, closed, draft, or archived
            - `department` IdName
              - …
            - `category` IdName
              - …
            - `employment_type` IdName
              - …
            - `education_level` IdName
              - …
            - `experience_level` IdName
              - …
            - `workflow_id` integer, nullable: ID of the hiring workflow (pipeline) assigned to this job
            - `workflow` IdName
              - …
            - `form_id` integer, nullable: ID of the application form candidates fill in for this job — the form attached to the job, or the company default form when the job has none attached yet (the same rule the public apply page follows). `null` only when the company has no forms. Fetch the questions with `GET /forms/{id}`. Present in both `view=full` and `view=summary`.
            - `pipeline_stages` object[], nullable: Pipeline stages for this job's workflow. Only included when `include=pipeline_stages` is specified. Suppressed when `view=summary` even if the include was requested.
              - …
            - `salary_min` number, nullable: Minimum salary
            - `salary_max` number, nullable: Maximum salary
            - `salary_currency` string, nullable: Salary currency code (e.g. USD, EUR)
            - `salary_period` 'annually' | 'monthly' | 'daily' | 'hourly', nullable: Salary period
            - `hours_per_week_min` integer, nullable: Minimum hours per week
            - `hours_per_week_max` integer, nullable: Maximum hours per week
            - `indeed_posting_data` object: Indeed job board posting metadata. Present only when `view=full` (default); omitted entirely when `view=summary`.
            - `hiring_team` JobHiringTeamMember[]: Team members assigned to this job. Embedded via `include=hiring_team`. Suppressed when `view=summary` even if the include was requested.
              - …
            - `is_satellite` boolean: Whether this job is a satellite (child) of a canonical job. Satellite jobs share the candidate pipeline of their parent.
            - `parent_job_id` integer, nullable: ID of the canonical (parent) job. Null for canonical jobs. Recruiting operations should target the canonical job.
            - `language` string, nullable: Locale this job's public page renders in, overriding the career site language. Null means the page follows the career site language (`GET /companies/career-site-settings`), which in turn falls back to en-US. This is the override, not the effective language. Present in both `view=full` and `view=summary`.
            - `created_at` integer, required: Unix timestamp (seconds)
            - `updated_at` integer, required: Unix timestamp (seconds)
            - `ai_scoring_criteria` AiScoringCriterion[]: AI scoring criteria configured for this job, ordered by `position` ASC. Returned as an empty array when none are configured. Present only when `view=full` (default); omitted entirely when `view=summary`.
              - …
          - object: Hard-deleted job stub.
            - `id` integer, required
        - `from_stage` UserActivityStageRef, nullable, required: Pipeline stage reference. Null when absent; hard-deleted stages render as "Stage
          - `id` integer, required
          - `name` string, required
        - `to_stage` UserActivityStageRef, nullable, required: Pipeline stage reference. Null when absent; hard-deleted stages render as "Stage
          - `id` integer, required
          - `name` string, required
      - UserActivityDisqualified: The user disqualified a candidate.
        - `event_id` string, required: Deterministic event UUID from the reporting event store.
        - `type` 'disqualified', required: Activity type identifier.
        - `occurred_at` integer, required: Unix timestamp (seconds, UTC) of when the action happened.
        - `candidate` union, required: The STANDARD candidate object in summary view — the same shape /candidates returns (the Candidate schema without `profile`). An {id}-only stub when the candidate is hard-deleted; null when the event carries no candidate.
          - Candidate
            - `id` integer, required: Unique identifier
            - `alias` string, nullable: Short alphanumeric alias used in profile URLs. Use this to build candidate profile links — `https://app.100hires.com/candidate/{alias}`. Also accepted as `{id}` in API requests.
            - `url_backoffice` string, uri: Absolute backoffice URL of the candidate in the 100Hires recruiter app. Use to render deep-links in agent UIs.
            - `company_id` integer, required: ID of the company this candidate belongs to
            - `first_name` string, nullable: Candidate's first name
            - `last_name` string, nullable: Candidate's last name
            - `emails` string[], nullable: List of candidate email addresses
            - `phones` string[], nullable: List of candidate phone numbers
            - `source` IdName
              - …
            - `origin` IdName
              - …
            - `profile` ProfileAnswer[]: Candidate profile field answers (application form responses). Present only when `view=full` (default); omitted entirely when `view=summary` to keep list responses inside the agent context budget — a single candidate can carry dozens of free-form answers.
              - …
            - `ip` string, nullable: IP address from which the candidate applied
            - `applications` CandidateApplicationSummary[]: Summary of all applications this candidate has across jobs
              - …
            - `created_at` integer, required: Unix timestamp (seconds)
            - `updated_at` integer, required: Unix timestamp (seconds)
            - `last_message_at` integer, nullable: Unix timestamp (seconds) of the most recent message (email or SMS) sent to or received from this candidate. Null if no messages exist.
            - `days_since_last_message` integer, nullable: Number of whole days since the last message. Computed at request time. Null if no messages exist.
          - object: Hard-deleted candidate stub.
            - `id` integer, required
        - `application_id` integer, nullable, required
        - `job` union, required: The STANDARD job object in summary view — the same shape /jobs returns (the Job schema without `description`). An {id}-only stub when the job is hard-deleted; null when the event carries no job.
          - Job
            - `id` integer, required: Unique identifier
            - `alias` string, nullable: Short alphanumeric alias used in UI URLs. Use this to build job links — `https://app.100hires.com/job/{alias}/candidates/pipeline`. Also accepted as `{id}` in API requests.
            - `company_id` integer, required: ID of the company this job belongs to
            - `title` string, required: Public job title shown to candidates
            - `internal_title` string, nullable: Internal job title visible only to the hiring team
            - `internal_job_id` string, nullable: Company's internal job identifier (e.g. requisition number)
            - `description` string: Job description (HTML). Present only when `view=full` (default); omitted entirely when `view=summary` to keep list responses inside the agent context budget. Use `GET /jobs/{id}` or `view=full` to retrieve.
            - `resume_field_status` 'required' | 'optional' | 'hidden', nullable: Whether resume upload is required, optional, or hidden on the application form
            - `location` JobLocation
              - …
            - `url` string, required: Public URL of the job posting page
            - `url_backoffice` string: Backoffice URL — opens the job's pipeline view inside the recruiter app (`https://app.100hires.com/job/{alias}/candidates/pipeline`). Use this to link agent widgets / UI to the in-app job page rather than the public career page.
            - `is_remote` boolean, required: Whether this is a remote position
            - `is_hybrid` boolean, required: Whether this is a hybrid position: office days plus remote days at the job address. Never true together with is_remote.
            - `job_board_remote_scope` 'city' | 'statewide' | 'nationwide', nullable: How a remote job is listed on Indeed: city, statewide or nationwide. Null when the job is not remote.
            - `status` string, required: Job status: open, closed, draft, or archived
            - `department` IdName
              - …
            - `category` IdName
              - …
            - `employment_type` IdName
              - …
            - `education_level` IdName
              - …
            - `experience_level` IdName
              - …
            - `workflow_id` integer, nullable: ID of the hiring workflow (pipeline) assigned to this job
            - `workflow` IdName
              - …
            - `form_id` integer, nullable: ID of the application form candidates fill in for this job — the form attached to the job, or the company default form when the job has none attached yet (the same rule the public apply page follows). `null` only when the company has no forms. Fetch the questions with `GET /forms/{id}`. Present in both `view=full` and `view=summary`.
            - `pipeline_stages` object[], nullable: Pipeline stages for this job's workflow. Only included when `include=pipeline_stages` is specified. Suppressed when `view=summary` even if the include was requested.
              - …
            - `salary_min` number, nullable: Minimum salary
            - `salary_max` number, nullable: Maximum salary
            - `salary_currency` string, nullable: Salary currency code (e.g. USD, EUR)
            - `salary_period` 'annually' | 'monthly' | 'daily' | 'hourly', nullable: Salary period
            - `hours_per_week_min` integer, nullable: Minimum hours per week
            - `hours_per_week_max` integer, nullable: Maximum hours per week
            - `indeed_posting_data` object: Indeed job board posting metadata. Present only when `view=full` (default); omitted entirely when `view=summary`.
            - `hiring_team` JobHiringTeamMember[]: Team members assigned to this job. Embedded via `include=hiring_team`. Suppressed when `view=summary` even if the include was requested.
              - …
            - `is_satellite` boolean: Whether this job is a satellite (child) of a canonical job. Satellite jobs share the candidate pipeline of their parent.
            - `parent_job_id` integer, nullable: ID of the canonical (parent) job. Null for canonical jobs. Recruiting operations should target the canonical job.
            - `language` string, nullable: Locale this job's public page renders in, overriding the career site language. Null means the page follows the career site language (`GET /companies/career-site-settings`), which in turn falls back to en-US. This is the override, not the effective language. Present in both `view=full` and `view=summary`.
            - `created_at` integer, required: Unix timestamp (seconds)
            - `updated_at` integer, required: Unix timestamp (seconds)
            - `ai_scoring_criteria` AiScoringCriterion[]: AI scoring criteria configured for this job, ordered by `position` ASC. Returned as an empty array when none are configured. Present only when `view=full` (default); omitted entirely when `view=summary`.
              - …
          - object: Hard-deleted job stub.
            - `id` integer, required
        - `reason` object, nullable, required: Disqualification reason — the same {id, name} shape /rejection-reasons returns; `name` is null when the reason is hard-gone; the whole object is null when none was recorded.
          - `id` integer, required
          - `name` string, nullable, required
      - UserActivityEmailSent: The user manually sent an email (automation/nurture sends are excluded from the feed).
        - `event_id` string, required: Deterministic event UUID from the reporting event store.
        - `type` 'email_sent', required: Activity type identifier.
        - `occurred_at` integer, required: Unix timestamp (seconds, UTC) of when the action happened.
        - `candidate` union, required: The STANDARD candidate object in summary view — the same shape /candidates returns (the Candidate schema without `profile`). An {id}-only stub when the candidate is hard-deleted; null when the event carries no candidate.
          - Candidate
            - `id` integer, required: Unique identifier
            - `alias` string, nullable: Short alphanumeric alias used in profile URLs. Use this to build candidate profile links — `https://app.100hires.com/candidate/{alias}`. Also accepted as `{id}` in API requests.
            - `url_backoffice` string, uri: Absolute backoffice URL of the candidate in the 100Hires recruiter app. Use to render deep-links in agent UIs.
            - `company_id` integer, required: ID of the company this candidate belongs to
            - `first_name` string, nullable: Candidate's first name
            - `last_name` string, nullable: Candidate's last name
            - `emails` string[], nullable: List of candidate email addresses
            - `phones` string[], nullable: List of candidate phone numbers
            - `source` IdName
              - …
            - `origin` IdName
              - …
            - `profile` ProfileAnswer[]: Candidate profile field answers (application form responses). Present only when `view=full` (default); omitted entirely when `view=summary` to keep list responses inside the agent context budget — a single candidate can carry dozens of free-form answers.
              - …
            - `ip` string, nullable: IP address from which the candidate applied
            - `applications` CandidateApplicationSummary[]: Summary of all applications this candidate has across jobs
              - …
            - `created_at` integer, required: Unix timestamp (seconds)
            - `updated_at` integer, required: Unix timestamp (seconds)
            - `last_message_at` integer, nullable: Unix timestamp (seconds) of the most recent message (email or SMS) sent to or received from this candidate. Null if no messages exist.
            - `days_since_last_message` integer, nullable: Number of whole days since the last message. Computed at request time. Null if no messages exist.
          - object: Hard-deleted candidate stub.
            - `id` integer, required
        - `application_id` integer, nullable
        - `message_id` integer, nullable, required: Mail message ID.
        - `email` object, nullable, required: The full message object (same shape as the messages API: subject, body, from, to, date, …). With `view=summary` the `body` is replaced by a 200-character `body_preview`. Null with `content: missed` when the message was hard-deleted.
        - `content` 'missed': Present only when the source message no longer exists.
      - UserActivitySmsSent: The user manually sent an SMS (automation/nurture sends are excluded from the feed).
        - `event_id` string, required: Deterministic event UUID from the reporting event store.
        - `type` 'sms_sent', required: Activity type identifier.
        - `occurred_at` integer, required: Unix timestamp (seconds, UTC) of when the action happened.
        - `candidate` union, required: The STANDARD candidate object in summary view — the same shape /candidates returns (the Candidate schema without `profile`). An {id}-only stub when the candidate is hard-deleted; null when the event carries no candidate.
          - Candidate
            - `id` integer, required: Unique identifier
            - `alias` string, nullable: Short alphanumeric alias used in profile URLs. Use this to build candidate profile links — `https://app.100hires.com/candidate/{alias}`. Also accepted as `{id}` in API requests.
            - `url_backoffice` string, uri: Absolute backoffice URL of the candidate in the 100Hires recruiter app. Use to render deep-links in agent UIs.
            - `company_id` integer, required: ID of the company this candidate belongs to
            - `first_name` string, nullable: Candidate's first name
            - `last_name` string, nullable: Candidate's last name
            - `emails` string[], nullable: List of candidate email addresses
            - `phones` string[], nullable: List of candidate phone numbers
            - `source` IdName
              - …
            - `origin` IdName
              - …
            - `profile` ProfileAnswer[]: Candidate profile field answers (application form responses). Present only when `view=full` (default); omitted entirely when `view=summary` to keep list responses inside the agent context budget — a single candidate can carry dozens of free-form answers.
              - …
            - `ip` string, nullable: IP address from which the candidate applied
            - `applications` CandidateApplicationSummary[]: Summary of all applications this candidate has across jobs
              - …
            - `created_at` integer, required: Unix timestamp (seconds)
            - `updated_at` integer, required: Unix timestamp (seconds)
            - `last_message_at` integer, nullable: Unix timestamp (seconds) of the most recent message (email or SMS) sent to or received from this candidate. Null if no messages exist.
            - `days_since_last_message` integer, nullable: Number of whole days since the last message. Computed at request time. Null if no messages exist.
          - object: Hard-deleted candidate stub.
            - `id` integer, required
        - `message_id` integer, nullable, required: Texting message ID.
        - `sms` object, nullable, required: The STANDARD texting message object — the same inner `message` object the candidate messages API returns for `type: texting` (id, body, date, delivery/error state, recipient). With `view=summary` `body` becomes a 200-character `body_preview`. Null with `content: missed` when the message was hard-deleted.
        - `content` 'missed': Present only when the source message no longer exists.
      - UserActivityCallLogged: The user placed an outbound Twilio call.
        - `event_id` string, required: Deterministic event UUID from the reporting event store.
        - `type` 'call_logged', required: Activity type identifier.
        - `occurred_at` integer, required: Unix timestamp (seconds, UTC) of when the action happened.
        - `candidate` union, required: The STANDARD candidate object in summary view — the same shape /candidates returns (the Candidate schema without `profile`). An {id}-only stub when the candidate is hard-deleted; null when the event carries no candidate.
          - Candidate
            - `id` integer, required: Unique identifier
            - `alias` string, nullable: Short alphanumeric alias used in profile URLs. Use this to build candidate profile links — `https://app.100hires.com/candidate/{alias}`. Also accepted as `{id}` in API requests.
            - `url_backoffice` string, uri: Absolute backoffice URL of the candidate in the 100Hires recruiter app. Use to render deep-links in agent UIs.
            - `company_id` integer, required: ID of the company this candidate belongs to
            - `first_name` string, nullable: Candidate's first name
            - `last_name` string, nullable: Candidate's last name
            - `emails` string[], nullable: List of candidate email addresses
            - `phones` string[], nullable: List of candidate phone numbers
            - `source` IdName
              - …
            - `origin` IdName
              - …
            - `profile` ProfileAnswer[]: Candidate profile field answers (application form responses). Present only when `view=full` (default); omitted entirely when `view=summary` to keep list responses inside the agent context budget — a single candidate can carry dozens of free-form answers.
              - …
            - `ip` string, nullable: IP address from which the candidate applied
            - `applications` CandidateApplicationSummary[]: Summary of all applications this candidate has across jobs
              - …
            - `created_at` integer, required: Unix timestamp (seconds)
            - `updated_at` integer, required: Unix timestamp (seconds)
            - `last_message_at` integer, nullable: Unix timestamp (seconds) of the most recent message (email or SMS) sent to or received from this candidate. Null if no messages exist.
            - `days_since_last_message` integer, nullable: Number of whole days since the last message. Computed at request time. Null if no messages exist.
          - object: Hard-deleted candidate stub.
            - `id` integer, required
        - `call_id` integer, nullable, required
        - `duration_seconds` integer, nullable, required: Call duration in seconds.
        - `call` object, nullable, required: Call details (same shape as the candidate activities call event: from/to labels, human-readable status like "Completed", formatted duration, recording attachment and transcription when available). With `view=summary` the transcription text becomes `text_preview`. Null with `content: missed` when the call record was hard-deleted.
        - `content` 'missed': Present only when the source call no longer exists.
      - UserActivityNoteAdded: The user added a note (comment) on a candidate.
        - `event_id` string, required: Deterministic event UUID from the reporting event store.
        - `type` 'note_added', required: Activity type identifier.
        - `occurred_at` integer, required: Unix timestamp (seconds, UTC) of when the action happened.
        - `candidate` union, required: The STANDARD candidate object in summary view — the same shape /candidates returns (the Candidate schema without `profile`). An {id}-only stub when the candidate is hard-deleted; null when the event carries no candidate.
          - Candidate
            - `id` integer, required: Unique identifier
            - `alias` string, nullable: Short alphanumeric alias used in profile URLs. Use this to build candidate profile links — `https://app.100hires.com/candidate/{alias}`. Also accepted as `{id}` in API requests.
            - `url_backoffice` string, uri: Absolute backoffice URL of the candidate in the 100Hires recruiter app. Use to render deep-links in agent UIs.
            - `company_id` integer, required: ID of the company this candidate belongs to
            - `first_name` string, nullable: Candidate's first name
            - `last_name` string, nullable: Candidate's last name
            - `emails` string[], nullable: List of candidate email addresses
            - `phones` string[], nullable: List of candidate phone numbers
            - `source` IdName
              - …
            - `origin` IdName
              - …
            - `profile` ProfileAnswer[]: Candidate profile field answers (application form responses). Present only when `view=full` (default); omitted entirely when `view=summary` to keep list responses inside the agent context budget — a single candidate can carry dozens of free-form answers.
              - …
            - `ip` string, nullable: IP address from which the candidate applied
            - `applications` CandidateApplicationSummary[]: Summary of all applications this candidate has across jobs
              - …
            - `created_at` integer, required: Unix timestamp (seconds)
            - `updated_at` integer, required: Unix timestamp (seconds)
            - `last_message_at` integer, nullable: Unix timestamp (seconds) of the most recent message (email or SMS) sent to or received from this candidate. Null if no messages exist.
            - `days_since_last_message` integer, nullable: Number of whole days since the last message. Computed at request time. Null if no messages exist.
          - object: Hard-deleted candidate stub.
            - `id` integer, required
        - `note_id` integer, nullable, required
        - `note` Note, required
          - `id` integer, required: Unique identifier
          - `candidate_id` integer, required: ID of the candidate this note belongs to
          - `user_id` integer, required: Author user ID (always present)
          - `url_backoffice` string, uri: Absolute backoffice URL to the candidate's discussion tab where this note appears in the 100Hires recruiter app. Use to render deep-links in agent UIs.
          - `body` string: Note content (may contain HTML). Mentioned users are wrapped in `<span class="mention-area">` markup. Present only when `view=full` (default); replaced with `body_preview` when `view=summary`.
          - `body_preview` string: First 200 UTF-8 characters of the note content with a `...` suffix when truncated. Present only when `view=summary`; replaces `body` to keep list responses inside the agent context budget.
          - `visibility` string, required: Visibility: 'all' (visible to team) or 'private' (author only)
          - `created_at` integer, required: Unix timestamp (seconds)
          - `updated_at` integer, required: Unix timestamp (seconds)
          - `user` NoteUser
            - `id` integer, required: User ID.
            - `full_name` string, required: User full name.
            - `photo` string, nullable: Profile photo URL.
          - `candidate` Candidate
            - `id` integer, required: Unique identifier
            - `alias` string, nullable: Short alphanumeric alias used in profile URLs. Use this to build candidate profile links — `https://app.100hires.com/candidate/{alias}`. Also accepted as `{id}` in API requests.
            - `url_backoffice` string, uri: Absolute backoffice URL of the candidate in the 100Hires recruiter app. Use to render deep-links in agent UIs.
            - `company_id` integer, required: ID of the company this candidate belongs to
            - `first_name` string, nullable: Candidate's first name
            - `last_name` string, nullable: Candidate's last name
            - `emails` string[], nullable: List of candidate email addresses
            - `phones` string[], nullable: List of candidate phone numbers
            - `source` IdName
              - …
            - `origin` IdName
              - …
            - `profile` ProfileAnswer[]: Candidate profile field answers (application form responses). Present only when `view=full` (default); omitted entirely when `view=summary` to keep list responses inside the agent context budget — a single candidate can carry dozens of free-form answers.
              - …
            - `ip` string, nullable: IP address from which the candidate applied
            - `applications` CandidateApplicationSummary[]: Summary of all applications this candidate has across jobs
              - …
            - `created_at` integer, required: Unix timestamp (seconds)
            - `updated_at` integer, required: Unix timestamp (seconds)
            - `last_message_at` integer, nullable: Unix timestamp (seconds) of the most recent message (email or SMS) sent to or received from this candidate. Null if no messages exist.
            - `days_since_last_message` integer, nullable: Number of whole days since the last message. Computed at request time. Null if no messages exist.
        - `application_id` integer, nullable, required: Application the note was left in the context of, when any.
        - `job` union, required: The STANDARD job object in summary view — the same shape /jobs returns (the Job schema without `description`). An {id}-only stub when the job is hard-deleted; null when the event carries no job.
          - Job
            - `id` integer, required: Unique identifier
            - `alias` string, nullable: Short alphanumeric alias used in UI URLs. Use this to build job links — `https://app.100hires.com/job/{alias}/candidates/pipeline`. Also accepted as `{id}` in API requests.
            - `company_id` integer, required: ID of the company this job belongs to
            - `title` string, required: Public job title shown to candidates
            - `internal_title` string, nullable: Internal job title visible only to the hiring team
            - `internal_job_id` string, nullable: Company's internal job identifier (e.g. requisition number)
            - `description` string: Job description (HTML). Present only when `view=full` (default); omitted entirely when `view=summary` to keep list responses inside the agent context budget. Use `GET /jobs/{id}` or `view=full` to retrieve.
            - `resume_field_status` 'required' | 'optional' | 'hidden', nullable: Whether resume upload is required, optional, or hidden on the application form
            - `location` JobLocation
              - …
            - `url` string, required: Public URL of the job posting page
            - `url_backoffice` string: Backoffice URL — opens the job's pipeline view inside the recruiter app (`https://app.100hires.com/job/{alias}/candidates/pipeline`). Use this to link agent widgets / UI to the in-app job page rather than the public career page.
            - `is_remote` boolean, required: Whether this is a remote position
            - `is_hybrid` boolean, required: Whether this is a hybrid position: office days plus remote days at the job address. Never true together with is_remote.
            - `job_board_remote_scope` 'city' | 'statewide' | 'nationwide', nullable: How a remote job is listed on Indeed: city, statewide or nationwide. Null when the job is not remote.
            - `status` string, required: Job status: open, closed, draft, or archived
            - `department` IdName
              - …
            - `category` IdName
              - …
            - `employment_type` IdName
              - …
            - `education_level` IdName
              - …
            - `experience_level` IdName
              - …
            - `workflow_id` integer, nullable: ID of the hiring workflow (pipeline) assigned to this job
            - `workflow` IdName
              - …
            - `form_id` integer, nullable: ID of the application form candidates fill in for this job — the form attached to the job, or the company default form when the job has none attached yet (the same rule the public apply page follows). `null` only when the company has no forms. Fetch the questions with `GET /forms/{id}`. Present in both `view=full` and `view=summary`.
            - `pipeline_stages` object[], nullable: Pipeline stages for this job's workflow. Only included when `include=pipeline_stages` is specified. Suppressed when `view=summary` even if the include was requested.
              - …
            - `salary_min` number, nullable: Minimum salary
            - `salary_max` number, nullable: Maximum salary
            - `salary_currency` string, nullable: Salary currency code (e.g. USD, EUR)
            - `salary_period` 'annually' | 'monthly' | 'daily' | 'hourly', nullable: Salary period
            - `hours_per_week_min` integer, nullable: Minimum hours per week
            - `hours_per_week_max` integer, nullable: Maximum hours per week
            - `indeed_posting_data` object: Indeed job board posting metadata. Present only when `view=full` (default); omitted entirely when `view=summary`.
            - `hiring_team` JobHiringTeamMember[]: Team members assigned to this job. Embedded via `include=hiring_team`. Suppressed when `view=summary` even if the include was requested.
              - …
            - `is_satellite` boolean: Whether this job is a satellite (child) of a canonical job. Satellite jobs share the candidate pipeline of their parent.
            - `parent_job_id` integer, nullable: ID of the canonical (parent) job. Null for canonical jobs. Recruiting operations should target the canonical job.
            - `language` string, nullable: Locale this job's public page renders in, overriding the career site language. Null means the page follows the career site language (`GET /companies/career-site-settings`), which in turn falls back to en-US. This is the override, not the effective language. Present in both `view=full` and `view=summary`.
            - `created_at` integer, required: Unix timestamp (seconds)
            - `updated_at` integer, required: Unix timestamp (seconds)
            - `ai_scoring_criteria` AiScoringCriterion[]: AI scoring criteria configured for this job, ordered by `position` ASC. Returned as an empty array when none are configured. Present only when `view=full` (default); omitted entirely when `view=summary`.
              - …
          - object: Hard-deleted job stub.
            - `id` integer, required
        - `content` 'missed': Present only when the source comment no longer exists.
  - `pagination` Pagination, required
    - `page_size` integer, required: Items per page.
    - `page_count` integer, required: Total number of pages.
    - `page` integer, required: Current page number.
    - `total_count` integer, required: Total number of items.

## Other responses

- `400`: Bad request
- `401`: Unauthorized
- `403`: Forbidden
- `404`: Not found
- `429`: Too many requests

---

[API](https://skmtc.dev/100hires/apis/100hires-api.md) · [All operations](https://skmtc.dev/100hires/apis/100hires-api/llms.txt) · [OpenAPI document](https://skmtc.dev/100hires/apis/100hires-api/revisions/e63e2d3115f7?raw)
