---
title: "Update a sender"
method: PATCH
path: "/sender-profiles/{profile_id}/"
tags: ["senders"]
---

# Update a sender

`PATCH /sender-profiles/{profile_id}/`

## 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/sender-profiles/{profile_id}/`
- Auth: one of:
  - API key in header `X-API-Key`
  - HTTP bearer

Change who a sender is and how their messages go out. The first name, last name and signature are the identity messages are sent as, and the display name follows the two names. The job title and booking link fill the {{Sender title}} and {{Sender booking link}} variables. `send_mode` decides whether the messages the agent writes for this sender go out on their own or wait for a person. `email_approval_mode` pins whether this sender's emails wait in the approval queue; null hands the choice back to the workspace default. Only a person signed in to Oneprofile can change the send mode, email approval, job title or booking link; an API key can change the name and signature. Only a workspace admin can choose Always send, and only with `confirm` set to true. Every change to the send mode, job title or booking link is recorded with who made it. A looser send mode releases the emails already waiting for approval that it alone held, on every sequence the sender is on, unless another sender on that sequence still asks.

## Path parameters

- `profile_id` string, uuid, required

## Request body

- SenderProfileUpdateSchema: A field omitted from the request is left unchanged.
  - `booking_url` union: The link people use to book a meeting with this sender. It has to be a full web address starting with http:// or https://. Null or an empty string removes it. Only a person signed in to Oneprofile can change it.
    - string
    - unknown
  - `confirm` boolean: Set to true to confirm that this sender's messages may go out without anyone reading them first. Required when `send_mode` is `always_send`; ignored otherwise.
  - `email_approval_mode` union: manual | auto to override the workspace's email approval mode for this sender; null to inherit it again. Only a person signed in to Oneprofile can change it; an API key cannot.
    - 'manual' | 'auto': Whether a sender's email steps wait in the approval queue or send on their own. The per-sender override of the workspace's email approval mode. The workspace setting lives in the outreach-task domain, a layer above this one, so this enum names only the two overrides a sender can carry; the absence of one (``SenderProfileDTO.email_approval_mode`` is None) means the sender follows the workspace.
    - unknown
  - `first_name` union
    - string
    - unknown
  - `last_name` union
    - string
    - unknown
  - `send_mode` union: Whether the messages the agent writes for this sender go out on their own or wait for a person, replies included. Always send (`always_send`): the agent's messages go out on their own unless something is wrong with the words. Send when confident (`send_when_confident`, the default): they go out when the agent was confident and nothing is wrong, and wait for a person otherwise. Always ask (`always_ask`): a person approves every one. A sequence set to ask first still asks, whichever mode its senders are on. Only a person signed in to Oneprofile can change it; an API key can read it but not change it. Only a workspace admin can choose Always send, and only with `confirm` set to true. Moving to Send when confident or Always ask needs neither. Leave it out of the request unless you are changing it.
    - 'always_send' | 'send_when_confident' | 'always_ask': How much of this sender's agent-written email leaves without a person. ``ALWAYS_SEND``: agent-written email steps and replies go out unattended unless a defect is found in the message itself. ``SEND_WHEN_CONFIDENT``: they go out when the agent's confidence rule holds, and a person is asked when it does not. ``ALWAYS_ASK``: every agent-written email waits for a person, whatever the agent thinks of it. The three are ordered by strictness (ALWAYS_ASK strictest, then SEND_WHEN_CONFIDENT, then ALWAYS_SEND loosest), and that order is what ``service.strictest_send_mode`` folds a cadence's assigned senders down with. The order is the point: everything that combines two modes must resolve towards asking, never towards sending. Replaces ``EmailApprovalMode``'s two-way choice, which cannot express "send the ones the agent stands behind". That enum and its column stay until a release backfills this one; do not read both in one decision.
    - unknown
  - `signature_text` union: Plain-text signature appended to every send.
    - string
    - unknown
  - `timezone` union: The sender's IANA timezone, such as America/New_York, as a person chooses it: their daily limits reset at its midnight and sequences send in its hours. Once chosen, nothing detected replaces it. Null returns the sender to the detected zone. Sending the zone it already has changes nothing.
    - string
    - unknown
  - `title` union: The sender's job title, one line of up to 120 characters, as their messages introduce them. An empty string removes it. Only a person signed in to Oneprofile can change it.
    - string
    - unknown

## Response `200`

Successful Response

- SenderProfileReadSchema
  - `booking_url` string, nullable, required: The link people use to book a meeting with this sender, such as a Calendly or Cal.com page. It is what the {{Sender booking link}} variable is replaced with. Null when none is set.
  - `created_at` string, date-time, required
  - `daily_limit` integer
  - `email_approval_mode` 'manual' | 'auto': Whether a sender's email steps wait in the approval queue or send on their own. The per-sender override of the workspace's email approval mode. The workspace setting lives in the outreach-task domain, a layer above this one, so this enum names only the two overrides a sender can carry; the absence of one (``SenderProfileDTO.email_approval_mode`` is None) means the sender follows the workspace.
  - `first_name` string
  - `id` string, uuid, required
  - `last_name` string
  - `linkedin_checkpoint` boolean: True while LinkedIn is asking this sender to verify the account.
  - `linkedin_connection_request_cap` integer
  - `linkedin_connection_requests_today` integer
  - `linkedin_identity` string, nullable
  - `linkedin_last_seen_at` string, date-time, nullable: When a browser for this sender last checked in.
  - `linkedin_photo_url` string, nullable
  - `linkedin_presence` 'active' | 'idle' | 'not_seen': How recently ANY browser connected to this sender checked in. Three states, not two, because two different questions are asked of a connection. ``ACTIVE`` answers "can a step run right now": a browser is open and heartbeating. ``IDLE`` answers "is this still set up": the laptop was closed for the evening. ``NOT_SEEN`` is the one that needs a person: nothing has checked in for a day, and queued work is silently waiting.
  - `linkedin_run_mode` 'manual' | 'auto': Whether a person approves a sender's LinkedIn steps before they run, or they run on their own. The sender's own LinkedIn setting, kept on the sender beside their email modes so the approval queue reads one home for both. The absence of one (``SenderProfileDTO.linkedin_approval_mode`` is None) reads as MANUAL: nothing runs on somebody's LinkedIn unattended until they have said so. The approval queue still tells "never set" apart from "chose manual", which is the level its settings surfaces name.
  - `linkedin_usage` SenderLinkedInUsageSchema[]: Today's LinkedIn steps against each kind's daily limit.
    - `daily_limit` integer, required
    - `kind` 'profile_view' | 'connection_request' | 'send_message' | 'inmail' | 'withdraw_connection_request' | 'follow_contact' | 'like_latest_post' | 'check_sent_invitations' | 'check_connections' | 'check_inbox' | 'read_conversation', required: What the browser agent is being asked to do. The four ``CHECK_*``/``READ_*`` kinds are housekeeping: they read our own outbound invitations, our own newest connections and our own conversations to detect what the contact did, so they are free and deliberately excluded from the priced kinds below. ``CHECK_CONNECTIONS`` reads the first batch of the sender's connections list, newest first: a person found there has accepted, whenever the invitation went out. It is how an acceptance is noticed at all once an invitation has fallen out of the ten rows the sent list shows a background tab. ``CHECK_INBOX`` scans the conversation list for threads with new inbound activity; ``READ_CONVERSATION`` opens one of them and reads it in full. The split keeps LinkedIn activity proportional to real replies: the cheap scan runs on every sweep, the expensive read only where the scan saw a change. ``LIKE_LATEST_POST`` targets the contact's most recent post at the moment the browser runs it. A contact with no posts is not a failure: the driver reports the action ``SKIPPED``, and the sequence advances either way. Every profile-targeted outcome carries the facts the browser read off the profile, including the three-state Premium "Open Profile" reading; see the section comment above the outcome models.
    - `used_today` integer, required
  - `mailbox_count` integer, required
  - `name` string, required
  - `send_mode` 'always_send' | 'send_when_confident' | 'always_ask', required: How much of this sender's agent-written email leaves without a person. ``ALWAYS_SEND``: agent-written email steps and replies go out unattended unless a defect is found in the message itself. ``SEND_WHEN_CONFIDENT``: they go out when the agent's confidence rule holds, and a person is asked when it does not. ``ALWAYS_ASK``: every agent-written email waits for a person, whatever the agent thinks of it. The three are ordered by strictness (ALWAYS_ASK strictest, then SEND_WHEN_CONFIDENT, then ALWAYS_SEND loosest), and that order is what ``service.strictest_send_mode`` folds a cadence's assigned senders down with. The order is the point: everything that combines two modes must resolve towards asking, never towards sending. Replaces ``EmailApprovalMode``'s two-way choice, which cannot express "send the ones the agent stands behind". That enum and its column stay until a release backfills this one; do not read both in one decision.
  - `sent_today` integer
  - `signature_text` string
  - `status` 'draft' | 'active', required: Lifecycle of a sender. A sender is DRAFT from the moment it is created and becomes ACTIVE once at least one mailbox is attached. The status is derived from attachment, never stored, so it cannot drift.
  - `timezone` string, nullable: The sender's IANA timezone, such as America/New_York. Their daily limits reset at its midnight, and a sequence sending in each sender's timezone sends in its hours. Null until it is detected or chosen.
  - `timezone_source` 'guessed' | 'browser' | 'person': Where a sender's timezone came from, which decides what may replace it. ``GUESSED``: from whoever created the sender, or from the sequences it already sent for. ``BROWSER``: reported by the browser driving the sender's LinkedIn, which fills a sender that had none. ``PERSON``: chosen on the Senders page or through the AI Assistant. Since 2026-10-09 nothing detected moves a zone a sender has, whatever its source: only a person does, and a zone a person clears is filled again by detection.
  - `title` string, required: The sender's job title, as their messages introduce them. It is what the {{Sender title}} variable is replaced with. Empty when none is set.
  - `updated_at` string, date-time, required

## Other responses

- `401`: Unauthorized
- `403`: The caller may not make this change: an API key changing the send mode, email approval, job title or booking link, or anyone but a workspace admin choosing Always send.
- `404`: Not found.
- `422`: Validation failed.
- `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/4a6bd71e3f02?raw)
