---
title: "Get your channels"
method: GET
path: "/v3/channels"
tags: ["Channels"]
---

# Get your channels

`GET /v3/channels`

## Request

- Base URL: `https://api.sent.dm`
- URL: `https://api.sent.dm/v3/channels`
- Auth: one of:
  - API key in header `x-api-key`
  - HTTP bearer

Every market you send SMS in, your WhatsApp account, your RCS agent and the numbers you carry phone calls on — with each one's status, and what each market has supplied.

**Status lives on the channel, never on you or your brand.** An identity has no lifecycle; what has one is the registration of a sender in a market and the approval of a channel. So a customer live in one country and mid-registration in another reports exactly that, rather than one flattened answer.

`sms[n].compliance` carries what each market holds: `brand` and `campaign` for markets that register with a compliance regime such as US TEN_DLC, and `documents` for markets that pre-register an alphanumeric or similar sender. Absent means the market registers with nobody and nothing has been supplied. `GET /v3/compliance/requirements` says what a market demands of any new customer; this says what you gave it.

Send `x-profile-id` with an organization key to read one of your profiles' channels.

## Headers

- `x-profile-id` string, uuid

## Response `200`

The channels you send on

- SentDmServicesEndpointsCustomerAPIv3SharedApiResponseOfSenderProfileChannelsState: Standard API response envelope for all v3 endpoints
  - `success` boolean: Indicates whether the request was successful
  - `data` SentDmServicesCommonChannelsContractsSenderProfileChannelsState: The channels a profile sends on. SMS is a list because a profile can send in several markets; WhatsApp and RCS are single, because a profile has one business account and one agent.
    - `customer_id` string, uuid, nullable: Which customer these channels belong to — the key's own, or the profile named in x-profile-id. Same reason the brand carries one: as the response to /v3/channels there is no other id in the document, and under x-profile-id this is the profile the call resolved to rather than the caller. Absent when nested inside a sender profile, whose own id already says whose they are.
    - `sms` SentDmServicesCommonChannelsContractsSmsMarketState[]
      - `country` string, nullable
      - `number_type` string, nullable
      - `sender_value` string, nullable: The sender itself. Null until a carrier-assigned number is procured. For a market holding several numbers, the first active one (the first assigned while none is active) — every number is in numbers.
      - `numbers` SentDmServicesCommonChannelsContractsSmsNumberState[]: Every number this market holds or is still owed, each with its area code and its own status (ACTIVE once it can send, PROVISIONING while it is still to be assigned, INACTIVE once it could send and no longer can). One entry for a market holding one number. US 10DLC numbers are assigned when the campaign is approved, so they read as owed until then. Read-only.
        - `sender_value` string, nullable: The number, or null while it is still to be assigned.
        - `area_code` string, nullable: The number's area code, e.g. 212. While the number is still to be assigned, the area code it was asked for, or null when it was asked for in any area code.
        - `status` string, nullable: ACTIVE once the number can send; PROVISIONING while it is still to be assigned; INACTIVE once it could send and no longer can.
      - `status` 'PROVISIONING' | 'ACTION_NEEDED' | 'PENDING_REVIEW' | 'ACTIVE' | 'INACTIVE', nullable: Where this market's sender stands, in terms of who is holding it up — PROVISIONING, ACTION_NEEDED, PENDING_REVIEW or ACTIVE. Read-only. Resolved rather than reported raw: a live sender reads ACTIVE whatever it still owes, a market with outstanding requirements or an open resubmission request reads ACTION_NEEDED, and a market that registers with a regime reads PENDING_REVIEW once its brand exists — filing to The Campaign Registry is ours to do and need not have happened yet, so a dedicated brand created through this API reads PENDING_REVIEW from the moment it is stored. Describes whether the market can send, not each number: a market holding several numbers reads ACTIVE as soon as one of them is, whatever the others are doing. Each number's own status is in numbers.
      - `reason_code` string, nullable: Why the market is not ACTIVE, as a stable code: an ErrorCodes CHANNEL_xxx value such as CHANNEL_001 (something you owe) or CHANNEL_009 (under review). Switch on this rather than on reason. Omitted while ACTIVE. Read-only; when nothing more specific is known it is the generic reason for the status.
      - `reason` string, nullable: A sentence for reason_code: this market's own explanation, naming what is outstanding where that is you. Omitted while ACTIVE.
      - `compliance` SentDmServicesCommonChannelsContractsSuppliedComplianceState: What a market has been given: the identity it registers under, its programme, and any documents attached. What it does not carry is what the market asks for. That is the subject of GET /v3/compliance/requirements, and it is the same answer for every caller — a description of what a compliance regime wants, not a record of one customer's progress through it. It was reported here as well for a while, which put the same array in six response shapes and left a caller deciding which of two sources to believe. Present on a list read for markets that register (carrying brand and campaign), but with documents absent — documents are not fetched for a list, because a catalog lookup and a document read per market would multiply across a page. Absent documents is distinct from an empty list: absent says they were not fetched; empty says the market has been given none. The parent object is null only when the market registers with nobody and compliance was not computed — nothing to show at all.
        - `brand` object, nullable: The identity this market registers under, with inherit saying whose it is. Reported here rather than on the profile because it belongs to the registration this market files, and only one market files one. It was a top-level block for a while, which put a per-registration value beside a list of markets and left a caller to work out which market it belonged to. Absent for a market that registers with nobody — such a market asks for no identity, so there is none to report. Absent and null mean different things: absent says this market does not ask, null would say it asks and nothing was supplied. Untyped, like the request side, because its members are declared by the market's own schema rather than by a C# class. A typed pair here would be a second definition of what a market wants, free to drift from the one that validates.
        - `campaign` object, nullable: The programme this market registers, with inherit saying whose it is. One, not a list. TcrCampaigns permits several and an account built on the admin side may hold them, but this surface offers one — which is what lets the market's PATCH be an upsert rather than a collection with an addressable create behind it. An account holding several is reported as its first and refused on write, rather than half-edited. Carries no id. Nothing addresses a campaign, and an undeclared key would be refused if the caller sent this object back — which it is meant to be able to do.
        - `documents` SentDmServicesCommonChannelsContractsSuppliedDocument[], nullable: What has been supplied for this market. Files, not values — the declared halves above carry the values. A document cannot be a JSON value, so it is sent as multipart on the channel call and reported here as a reference. Absent on a list read, which fetches identity but does not compute compliance documents per market. Absent and empty mean different things: absent says the documents were not fetched; empty says the market has been given none.
          - `key` string: The catalog's name for this document, matching the requirement it satisfies.
          - `file_name` string, nullable
          - `document_id` string, uuid, nullable: Identifier of the upload, for fetching it back through the documents endpoints.
    - `whatsapp` SentDmServicesCommonChannelsContractsWhatsappChannelState: The profile's WhatsApp account. Its status is Meta's verification state.
      - `waba_id` string, nullable
      - `phone_number_id` string, nullable: The Meta phone-number id the profile sends from, or null when the account is connected but no number has been named yet — which is what a provisioning status means here.
      - `solution_id` string, nullable: Derived, not echoed. The request no longer accepts this — it is read off the organization's shared-account listing at connect time and reported back so a caller can see which partnership the account actually arrived through.
      - `owner_business_id` string, nullable: Derived from the organization's shared-account listing, like SolutionId.
      - `status` 'PROVISIONING' | 'ACTION_NEEDED' | 'PENDING_REVIEW' | 'ACTIVE' | 'INACTIVE', nullable: Read-only. Never carries a token — the row holds that and it is not returned. ACTION_NEEDED when no account is connected or the account has no phone number: both are yours to do.
      - `reason_code` string, nullable: Why the account is not ACTIVE, as a stable code: an ErrorCodes CHANNEL_xxx value such as CHANNEL_001 (something you owe) or CHANNEL_009 (under review). Switch on this rather than on reason. Omitted while ACTIVE. Read-only; when nothing more specific is known it is the generic reason for the status.
      - `reason` string, nullable: A sentence for reason_code, saying what to do where it is yours. Omitted while ACTIVE.
    - `rcs` SentDmServicesCommonChannelsContractsRcsAgentState: An RCS agent as its owner sees it: the order form back, plus where the submission stands. Not RcsSenderResponse. That one is the admin projection and carries the pipeline we track about a customer's request — internalStatus, statusReason, isLaunched — and the S3 keys behind the assets. None of that is the customer's to read: an internal status is a note to ourselves, and an S3 key is a storage detail that would become a contract the moment it was published. What is here is what the caller sent, in the names it sent them under, plus the three things only we can answer: the record's id, its status, and the number it sends from. So a read after a write shows the form as stored rather than as echoed.
      - `id` string, uuid, nullable: The agent record. Stable across the whole approval, and what support will ask for. Nullable and omitted when absent: a sender profile with RCS intent records the channel but has no agent until the order form is submitted, so no id exists to report. A zero GUID is not a valid id and is worse than the field being absent.
      - `status` 'PROVISIONING' | 'ACTION_NEEDED' | 'PENDING_REVIEW' | 'ACTIVE' | 'INACTIVE', nullable: Where the agent stands, in terms of who is holding it up — PROVISIONING, ACTION_NEEDED, PENDING_REVIEW or ACTIVE. Resolved from both of the provider's axes rather than reported raw: an agent whose resubmission we have asked for reads ACTION_NEEDED however its carrier status still reads, and an agent not yet handed over reads PROVISIONING rather than pending a review nobody has started.
      - `reason_code` string, nullable: Why the agent is not ACTIVE, as a stable code: an ErrorCodes CHANNEL_xxx value such as CHANNEL_001 (something you owe) or CHANNEL_009 (under review). Switch on this rather than on reason. Omitted while ACTIVE. Read-only; when nothing more specific is known it is the generic reason for the status.
      - `reason` string, nullable: A sentence for reason_code, saying what to do where it is yours. Omitted while ACTIVE.
      - `phone_number` string, nullable: The number the agent sends from, derived from brand_phone_number.
      - `display_name` string, nullable
      - `description` string, nullable
      - `agent_use_case` string, nullable
      - `brand_name` string, nullable
      - `privacy_policy_url` string, nullable
      - `terms_and_conditions_url` string, nullable
      - `website_url` string, nullable
      - `brand_color` string, nullable
      - `brand_phone_number` string, nullable
      - `customer_support_phone_number` string, nullable
      - `brand_email` string, nullable
      - `customer_support_email` string, nullable
      - `contact_name_and_title` string, nullable
      - `company_ein` string, nullable
      - `entity_type` string, nullable
      - `official_address` SentDmServicesCommonChannelsContractsRcsAddress: The registered address of the company behind the agent.
        - `street` string, nullable
        - `city` string, nullable
        - `state` string, nullable
        - `postal_code` string, nullable
        - `country` string, nullable
      - `brief_company_description` string, nullable
      - `opt_in_process_description` string, nullable
      - `start_message` string, nullable
      - `help_message` string, nullable
      - `stop_message` string, nullable
      - `sample_messages` string[], nullable
      - `created_at` string, date-time, nullable: Omitted when no real agent record exists — the intent-only path has no creation timestamp.
    - `mms` SentDmServicesCommonChannelsContractsMmsMarketState[]: The markets this profile can send MMS in, one entry per country, or empty when none. Appears alongside sms rather than replacing an entry in it: the two are separate senders on the same number and a caller needs to see both — a market can be live for SMS while its MMS row is still provisioning, or MMS-incapable entirely because the market's sender-type SKU does not carry it.
      - `country` string, nullable: ISO-3166 alpha-2 of the market.
      - `number_type` string, nullable: The sender type the market sends from, mirroring the SMS sender.
      - `sender_value` string, nullable: The sending number. Null while the market is still being provisioned.
      - `status` string, nullable: Where this market's MMS sender stands. Read-only.
    - `voice` SentDmServicesCommonChannelsContractsVoiceNumberState[]: The numbers this profile carries phone calls on, one entry per number, or empty when none. Voice is per number like an SMS market is per country: each number is its own channel row, turned on and off on its own, and one of them is the line app-originated calls fall back to.
      - `number` string: The number, in E.164.
      - `status` string: ACTIVE while the number carries calls, INACTIVE once it was turned off. Nothing provisions: a number the customer holds can carry calls the moment voice is turned on for it.
      - `default_for_app_calls` boolean: Whether this is the line app-originated calls are placed from when a voice token names no number. Exactly one active voice number carries it while the profile has any.
      - `callback_url` string, nullable: Where Sent asks what to do with each call on this number: a signed question is POSTed here when a call arrives or a caller presses a key, and the answer decides the call. The signing secret is not on this read; it is shown when voice is turned on and by the rotate endpoint.
      - `agent_id` string, nullable: The voice agent calls to this number go to, such as agent_9f2ab000-0000-4000-8000-000000000001. It wins over callback_url for calls to the number; calls your app places from the number still follow your app. Null when no agent answers the number.
      - `routes_to` string: Who answers calls to this number: agent, the voice agent in agent_id; agent_pending, that agent once the number has finished moving to it, with calls possibly unanswered until then; callback, your callback_url; or none, in which case calls to it are declined.
      - `created_at` string, date-time
      - `updated_at` string, date-time
  - `error` SentDmServicesEndpointsCustomerAPIv3SharedApiError: Error information
    - `code` string: Machine-readable error code (e.g., "RESOURCE_001")
    - `message` string: Human-readable error message
    - `details` object, nullable: Additional validation error details (field-level errors)
    - `doc_url` string, nullable: URL to documentation about this error
  - `meta` SentDmServicesEndpointsCustomerAPIv3SharedApiMeta: Request and response metadata
    - `request_id` string: Unique identifier for this request (for tracing and support)
    - `timestamp` string, date-time: Server timestamp when the response was generated
    - `version` string: API version used for this request

## Other responses

- `401`: Unauthorized
- `403`: Forbidden
- `404`: The customer could not be read
- `500`: Server Error

## Changes

- **2026-10-28** `41acb2ceb84d`: 2 info
  - added the optional property `data/allOf[#/components/schemas/SentDmServicesCommonChannelsContractsSenderProfileChannelsState]/voice/items/agent_id` to the response with the `200` status
  - added the optional property `data/allOf[#/components/schemas/SentDmServicesCommonChannelsContractsSenderProfileChannelsState]/voice/items/routes_to` to the response with the `200` status
- **2026-10-16** `6c829543a93e`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/sentdm/apis/sent-dm-api-v3/changes/v3/channels/get.md)

---

[API](https://skmtc.dev/sentdm/apis/sent-dm-api-v3.md) - [All operations](https://skmtc.dev/sentdm/apis/sent-dm-api-v3/llms.txt) - [OpenAPI document](https://skmtc.dev/sentdm/apis/sent-dm-api-v3/revisions/bdcca958cac7?raw)
