---
title: "List candidate activities"
method: GET
path: "/candidates/{id}/activities"
tags: ["Candidates"]
---

# List candidate activities

`GET /candidates/{id}/activities`

## Request

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

Returns timeline activities for a candidate with pagination. Use `?event_type=comment,copilot_response` to filter by specific event types, and `?since=…&until=…` (Unix timestamp in seconds) to constrain the time window.

## Path parameters

- `id` string, required

## Query parameters

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

## Response `200`

Candidate activities

- ActivityListResponse
  - `activities` Activity[], required: Array of activity events.
    - `event_id` integer, required: Unique ID of the timeline event
    - `candidate_id` integer, required: ID of the candidate this event belongs to
    - `application_id` integer, nullable, required: ID of the job application this event is linked to, if any
    - `user_id` integer, nullable, required: ID of the user who triggered this event, if applicable
    - `event` union, required: Event payload. The shape depends on the event `type`. Text-bubble events (assign_job, candidate_rate, assign_sources, assign_tags, qualification, profile_mutation, validate_emails, stage_moved, enrichment, automation_action_triggered) all share the same structure. Special events (call, comment, copilot_response) have their own shape. When event data is unavailable (e.g. referenced record was deleted), `type` is `missed`.
      - ActivityEventTextBubble: Shared structure for all text-bubble events: assign_job, candidate_rate, assign_sources, assign_tags, qualification, profile_mutation, validate_emails, stage_moved, enrichment, automation_action_triggered.
        - `type` 'assign_job' | 'candidate_rate' | 'assign_sources' | 'assign_tags' | 'qualification' | 'profile_mutation' | 'validate_emails' | 'stage_moved' | 'enrichment' | 'automation_action_triggered', required: Event type identifier.
        - `is_text_bubble` true, required: Always true for text bubble events.
        - `data` object, required: Event data payload.
          - `text` string, required: HTML-formatted description of the event
          - `date` string, required: Short formatted date (e.g. "Jan 1")
          - `relative_time` string, required: Human-readable relative time (e.g. "2 days ago")
          - `full_time` string, required: Full formatted datetime string
          - `from_stage_id` integer, nullable: Pipeline stage ID the candidate was in before qualification/disqualification. Only present for `qualification` events.
          - `from_stage_name` string, nullable: Pipeline stage name the candidate was in before qualification/disqualification. Only present for `qualification` events.
      - ActivityEventCall: Voice call event
        - `type` 'call', required: Event type identifier.
        - `call` object, required: Call details.
          - `from` object, required: Caller who initiated the call
            - `label` string, nullable, required: Display name or formatted phone number
            - `photo` string, nullable, required: URL of the caller's photo
          - `to` object, required: Caller who received the call
            - `label` string, nullable, required
            - `photo` string, nullable, required
          - `status` string, required: Human-readable call status (e.g. "Completed", "No answer")
          - `datetime` string, required: Full formatted datetime of the call
          - `relative_datetime` string, required: Relative time string
          - `duration` string, required: Formatted call duration (e.g. "2 minutes")
          - `attachment` ApiAttachment: Unified attachment shape returned by apiV2 endpoints (resumes, candidate files, application attachments, message attachments, call recordings, voicemail audio in nurture campaigns). `url` is an absolute URL served by the API host (`https://api.100hires.com/v2/attachments/{category}/{uuid}/{file_name}`) and serves the raw file bytes with `Authorization: Bearer <API_KEY>`. The response on `url` sets `Content-Disposition: attachment; filename="..."` with the human-readable filename. Use `uuid` to reference the attachment in other endpoints (e.g. nurture voicemail step).
            - `uuid` string, uuid, required: Unique attachment identifier. Stable across API calls; use in referencing endpoints.
            - `url` string, uri, nullable, required: Absolute download URL (e.g. `https://api.100hires.com/v2/attachments/application/{uuid}/{file_name}`). Hit with `Authorization: Bearer <API_KEY>`.
            - `relative_time` string, required: Human-readable time since upload (e.g. `"2 days ago"`).
            - `file` AttachmentFile, required
              - …
          - `transcription` object, nullable: Transcription details. Null when no transcription is available for this call.
            - `status` string: Transcription status (e.g. "completed", "pending", "failed").
            - `text` string, nullable: Full transcribed call text as HTML paragraphs, each prefixed with an English speaker label — `<p><strong>Speaker 1:</strong> …</p>` (Speaker 1 is the user who made or took the call, Speaker 2 the other party). Present only when `view=full` (default); replaced with `text_preview` when `view=summary`. Long calls can produce 5-50 KB of transcript and dominate the response budget.
            - `text_preview` string, nullable: First 200 UTF-8 characters of the transcription text with `...` suffix when truncated. Present only when `view=summary`.
            - `language` string, nullable: Detected/configured language code.
            - `is_billing_error` boolean: True when transcription failed due to insufficient AI credits.
      - ActivityEventComment: Candidate comment event
        - `type` 'comment', required: Event type identifier.
        - `comment` object, required: Comment details.
          - `id` integer, required
          - `candidate_id` integer, required
          - `user_id` integer, required
          - `author` string, required: Full name of the comment author
          - `photo` string, required: URL of the author's profile photo
          - `text` string: Comment text (may contain HTML). Present only when `view=full` (default); replaced with `text_preview` when `view=summary`.
          - `text_preview` string: First 200 UTF-8 characters of the comment text with `...` suffix when truncated. Present only when `view=summary`.
          - `date` string, required: Short formatted date
          - `datetime` string, required: Full formatted datetime
          - `relative_time` string, required
          - `visible` 'all' | 'owner' | 'private', required: Visibility scope of the comment
          - `is_edit` boolean, required: Whether the comment is currently being edited
          - `attachments` ApiAttachment[], required
            - `uuid` string, uuid, required: Unique attachment identifier. Stable across API calls; use in referencing endpoints.
            - `url` string, uri, nullable, required: Absolute download URL (e.g. `https://api.100hires.com/v2/attachments/application/{uuid}/{file_name}`). Hit with `Authorization: Bearer <API_KEY>`.
            - `relative_time` string, required: Human-readable time since upload (e.g. `"2 days ago"`).
            - `file` AttachmentFile, required
              - …
      - ActivityEventCopilotResponse: AI Copilot response event
        - `type` 'copilot_response', required: Event type identifier.
        - `copilot_response` object, required: AI copilot response details.
          - `id` integer, required
          - `user_prompt` string: The question the user asked the AI. Present only when `view=full` (default); replaced with `user_prompt_preview` when `view=summary`.
          - `user_prompt_preview` string, nullable: First 200 UTF-8 characters of `user_prompt` with `...` suffix when truncated. Present only when `view=summary`.
          - `response` string, nullable: The AI-generated answer, null if not yet completed. Present only when `view=full` (default); replaced with `response_preview` when `view=summary`.
          - `response_preview` string, nullable: First 200 UTF-8 characters of `response` with `...` suffix when truncated. Present only when `view=summary` — LLM answers can run into tens of KB and blow the agent context budget.
          - `status` 'pending' | 'processing' | 'completed' | 'failed', required
          - `error` string, nullable, required: Error message if status is failed
          - `can_retry` boolean, required: Whether this response can be retried
          - `is_billing_error` boolean, required: Whether the failure was due to insufficient AI credits
          - `relative_time` string, required
          - `datetime` string, required: Formatted datetime (Y-m-d H:i:s)
          - `user` object, nullable, required: User who requested the AI response
            - `id` integer
            - `name` string
            - `photo` string
      - ActivityEventMissed: Returned when event data is unavailable (e.g. referenced record was deleted)
        - `type` 'missed', required: Event type identifier.
    - `created_at` integer, required: Unix timestamp (seconds)
  - `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.
  - `page_size` integer, required: Items per page. Duplicated at top level for backward compatibility (also available in `pagination.page_size`).

## Other responses

- `400`: Validation error
- `401`: Unauthorized
- `403`: Forbidden
- `404`: Not found
- `415`: Content-Type must be application/json
- `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)
