List profiles in organization

Deprecated. This endpoint is replaced by /v3/sender-profiles and will be removed in a future release. It still behaves exactly as before, so nothing needs to change today — but new integrations should use /v3/sender-profiles, which models a profile's markets, compliance, brand, campaigns and billing explicitly.

Retrieves all sender profiles within an organization, including brand information for each profile. Profiles represent different brands, departments, or use cases within an organization, each with their own messaging configuration.

GET
/v3/profiles

Response Body

application/json

application/json

application/json

curl -X GET "https://example.com/v3/profiles"
{
  "success": true,
  "data": {
    "profiles": [
      {
        "id": "660e8400-e29b-41d4-a716-446655440001",
        "organization_id": "550e8400-e29b-41d4-a716-446655440000",
        "name": "Marketing Team",
        "email": "team@acme.com",
        "icon": "https://example.com/marketing-icon.png",
        "description": "Marketing department sender profile",
        "short_name": "MKT",
        "status": "approved",
        "created_at": "2026-06-11T11:33:06.088194+00:00",
        "updated_at": "2026-09-06T11:33:06.0881957+00:00",
        "allow_contact_sharing": false,
        "allow_template_sharing": false,
        "inherit_contacts": false,
        "inherit_templates": false,
        "inherit_tcr_brand": false,
        "inherit_tcr_campaign": false,
        "billing_model": "profile",
        "sending_phone_number_profile_id": null,
        "sending_whatsapp_number_profile_id": null,
        "sending_phone_number": null,
        "whatsapp_phone_number": null,
        "allow_number_change_during_onboarding": null,
        "waba_id": null,
        "billing_contact": null,
        "brand": {
          "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
          "tcr_brand_id": null,
          "status": null,
          "identity_status": null,
          "universal_ein": null,
          "csp_id": null,
          "submitted_to_tcr": false,
          "submitted_at": null,
          "is_inherited": false,
          "created_at": "2026-06-11T11:33:06.0881972+00:00",
          "updated_at": null,
          "contact": {
            "name": "John Smith",
            "business_name": "Acme Corp",
            "role": null,
            "phone": null,
            "email": "john@acmecorp.com",
            "phone_country_code": null
          },
          "business": {
            "legal_name": "Acme Corporation LLC",
            "tax_id": null,
            "tax_id_type": null,
            "entity_type": null,
            "street": null,
            "city": null,
            "state": null,
            "postal_code": null,
            "country": "US",
            "url": null,
            "country_of_registration": null
          },
          "compliance": {
            "vertical": "PROFESSIONAL",
            "brand_relationship": "SMALL_ACCOUNT",
            "is_tcr_application": true,
            "phone_number_prefix": null,
            "destination_countries": [],
            "notes": null,
            "primary_use_case": null
          }
        }
      }
    ],
    "pagination": null
  },
  "error": null,
  "meta": {
    "request_id": "req_7X9zKp2jDw",
    "timestamp": "2026-09-11T11:33:06.0882147+00:00",
    "version": "v3"
  }
}
Empty
Empty
{
  "success": false,
  "data": null,
  "error": {
    "code": "RESOURCE_005",
    "message": "Organization not found",
    "details": null,
    "doc_url": "https://docs.sent.dm/reference/api/error-catalog"
  },
  "meta": {
    "request_id": "req_7X9zKp2jDw",
    "timestamp": "2026-09-11T11:33:06.0882196+00:00",
    "version": "v3"
  }
}
{
  "success": false,
  "data": null,
  "error": {
    "code": "INTERNAL_001",
    "message": "Failed to retrieve profiles. Please contact support with request ID: req_7X9zKp2jDw",
    "details": null,
    "doc_url": "https://docs.sent.dm/reference/api/error-catalog"
  },
  "meta": {
    "request_id": "req_7X9zKp2jDw",
    "timestamp": "2026-09-11T11:33:06.0882212+00:00",
    "version": "v3"
  }
}

Get compliance requirements for a market GET

**Call this first.** It returns what a channel, country and sender type demand before you can send there — and `setup[]`, the calls that satisfy those demands, in order, each with a body you can copy and send as it stands. You never have to track forty countries' rules yourself. ## Channel `channel` is `sms`, `whatsapp` or `rcs`, and **defaults to `sms`** — so a caller that omits it gets exactly what this endpoint has always returned. `sms` is the only one answered today; the other two are `501` until their requirements are declared. They are refused rather than answered with an empty requirement set, because empty would say the channel demands nothing, and both demand plenty — WhatsApp a business verification and a display name review, RCS a carrier approval. Saying "not yet" is the true answer and the same one `POST /v3/sender-profiles` gives for `channels.whatsapp`. `type` is an SMS sender type, and SMS is the only channel whose senders have one. Requirements vary enormously. US `TEN_DLC` registers a brand and a campaign with The Campaign Registry and asks for a substantial set of values. An alphanumeric sender in one country pre-registers with supporting documents; in another it needs nothing at all. This is the authoritative answer for whichever market you are asking about, and it is the same declaration used to validate the calls themselves — so it can never drift from what is actually enforced. ## `setup[]` — what to do **One step.** `POST /v3/channels/sms` adds the market and records everything it registers with — the identity in `compliance.brand`, the programme in `compliance.campaign`. There were three, in a load-bearing order, while the identity and the campaign were resources of their own; they are members of this call's body now, so there is nothing to sequence. Correct any of it afterwards with `PATCH /v3/channels/sms/{country}/{type}`, which takes the same `compliance` object one key at a time. Each step's `body` has every key that market wants already present, with the values left **blank**. Blank rather than filled with placeholders, because the body is meant to be sent: a null value counts as not supplied, so posting a step verbatim comes back naming every blank you left. `attachments[]` lists files to send as multipart on the channel call, each under the field name given — a file cannot be a JSON value, so documents are never listed in `compliance[]`. Every step is a call for whoever holds the key. To set a **sender profile** up instead, send the same requests with the `x-profile-id` header naming it; there is no separate path. ## `requirements[]` — what each value means Each entry names a key for the `compliance` array, its value type, and whether it is required. `required_when` marks values needed only in certain cases — evaluate it against your own payload, e.g. `brand.entity_type == PUBLIC_PROFIT`. `options` lists accepted values where the market constrains them, and `label` is suitable for rendering a form field. Values Sent supplies on your behalf are never listed: correlation ids, environment flags, carrier elections, and booleans derivable from what you already send. ## When nothing is required `required` is `false` and `requirements` is empty, and the single `setup` step carries no `compliance` array at all. A `sender_id_pattern` may still be present — many markets constrain the sender string without registering anything.

Get profile by ID GET

**Deprecated.** This endpoint is replaced by `/v3/sender-profiles` and will be removed in a future release. It still behaves exactly as before, so nothing needs to change today — but new integrations should use `/v3/sender-profiles`, which models a profile's markets, compliance, brand, campaigns and billing explicitly. Retrieves detailed information about a specific sender profile within an organization, including brand and KYC information if a brand has been configured.