---
title: "Read one contact's conversation with the agent"
method: GET
path: "/outbound-agents/{agent_id}/conversations/"
tags: ["outbound-agents"]
---

# Read one contact's conversation with the agent

`GET /outbound-agents/{agent_id}/conversations/`

## Request

- Base URL: `https://api.getoneprofile.ai` (the document declares no server; this is the origin it was published from)
- URL: `https://api.getoneprofile.ai/outbound-agents/{agent_id}/conversations/`
- Auth: one of:
  - API key in header `X-API-Key`
  - HTTP bearer

What the agent found out about one contact and every message it has written them, oldest first. The contact is named by the key the sequence gave it.

## Path parameters

- `agent_id` string, uuid, required

## Query parameters

- `subject_key` string, required: The caller's key for the contact, e.g. sequence:<id>:record:<id>.
- `missing_ok` boolean: True answers null, rather than 404, for a contact the agent has written nothing to yet, as a step's Preview reads every contact it shows. An agent that does not exist is still 404.

## Response `200`

Successful Response

- OutboundConversationReadSchema: One contact's running conversation with the agent, and what it has written.
  - `company_key` string, nullable, required
  - `id` string, uuid, required
  - `last_turn_at` string, date-time, nullable, required
  - `messages` OutboundMessageReadSchema[], required
    - `agent_version` integer, required
    - `angle` string, nullable, required
    - `body` string, required
    - `confidence` 'high' | 'medium' | 'low', required: The writer's own read on whether its message is ready to send unedited.
    - `confidence_score` integer, nullable, required
    - `confident` boolean, nullable, required
    - `conversation_id` string, uuid, required
    - `created_at` string, date-time, required
    - `credits_charged` integer, required
    - `error` string, nullable, required
    - `facts_used` string[], required
    - `findings` OutboundFindingReadSchema[], required
      - `code` string, required
      - `excerpt` string, nullable, required
      - `message` string, required
      - `severity` string, required
    - `generated_body` string, required
    - `generated_subject` string, nullable, required
    - `id` string, uuid, required
    - `insufficient_data` boolean, required
    - `is_preview` boolean, required
    - `judge_verdict` OutboundJudgeVerdictReadSchema, required: What the independent judge said about a written message.
      - `grounded` boolean, required
      - `language_ok` boolean, required
      - `on_topic` boolean, required
      - `quality_score` integer, required
      - `reasons` string[], required
      - `safe` boolean, required
    - `kind` 'email' | 'linkedin_connection_note' | 'linkedin_message' | 'linkedin_inmail' | 'reply_email' | 'reply_linkedin', required: What one written message is, which decides its rules, its length and its channel.
    - `model_key` string, required
    - `opens_thread` boolean, required
    - `price_tenths` integer, required
    - `profile_read` boolean: Whether the agent read the contact's LinkedIn profile for this message.
    - `quality_score` integer, nullable, required
    - `reach` 'none' | 'mcp' | 'web', required: How far a Use AI run may reach beyond the table's own data. The price lever and the budget lever both key on this. ``NONE`` is one plain completion; ``MCP`` runs the research loop against ONLY the org's attached MCP tools (no web-read fees, no page summaries); ``WEB`` is the full web research loop. A run that has both web and MCP executes (and bills) as ``WEB``.
    - `reasoning` string, nullable, required
    - `sent_at` string, date-time, nullable, required
    - `slot_key` string, nullable, required
    - `status` 'writing' | 'written' | 'unpaid' | 'queued' | 'sent' | 'edited' | 'rejected' | 'superseded' | 'failed', required: Where one written message stands. WRITING is a lease: the model is being asked. WRITTEN, QUEUED (a person is looking at it) and EDITED (a person changed it) are the three sendable states. UNPAID is written but not fully charged, so it is not sendable until the remainder is collected. SENT, REJECTED, SUPERSEDED and FAILED are terminal.
    - `subject` string, nullable, required
  - `profile` OutboundProfileReadSchema: What person research kept of the contact's LinkedIn profile.
    - `about` string, nullable, required
    - `company_name` string, nullable, required
    - `education` string[], required
    - `followers` integer, nullable, required
    - `headline` string, nullable, required
    - `job_title` string, nullable, required
    - `location` string, nullable, required
    - `profile_url` string, nullable, required
    - `work_history` OutboundProfileRoleReadSchema[], required
      - `employer` string, nullable, required
      - `end` string, nullable, required
      - `start` string, nullable, required
      - `title` string, nullable, required
  - `profile_read_at` string, date-time, nullable: When the profile was read; null until an opener read one.
  - `research_brief` OutboundResearchFactReadSchema[], required
    - `category` 'role' | 'company' | 'product' | 'news' | 'hiring' | 'funding' | 'technology' | 'content' | 'other', required: The kinds of fact a research brief may hold; anything else the opener found is dropped.
    - `fact` string, required
    - `source_title` string, nullable, required
    - `source_url` string, nullable, required
  - `researched_at` string, date-time, nullable, required
  - `sources` string[], required
  - `subject_key` string, required

## Other responses

- `401`: Unauthorized
- `403`: Forbidden
- `404`: Outbound agent not found.
- `422`: Invalid request made to the API.
- `500`: Internal server error.
- `502`: Bad gateway error.
- `503`: Service unavailable.

---

[API](https://skmtc.dev/getoneprofile/apis/api-reference-oneprofile.md) · [All operations](https://skmtc.dev/getoneprofile/apis/api-reference-oneprofile/llms.txt) · [OpenAPI document](https://skmtc.dev/getoneprofile/apis/api-reference-oneprofile/revisions/dc5ac3c84444?raw)
