---
title: "Get compliance requirements for a market"
method: GET
path: "/v3/compliance/requirements"
tags: ["Compliance"]
---

# Get compliance requirements for a market

`GET /v3/compliance/requirements`

## Request

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

**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.

## Query parameters

- `channel` string, nullable
- `country` string, nullable
- `type` string, nullable

## Headers

- `x-profile-id` string, uuid

## Response `200`

Requirements for the requested market

- SentDmServicesEndpointsCustomerAPIv3SharedApiResponseOfComplianceRequirementsResponse: Standard API response envelope for all v3 endpoints
  - `success` boolean: Indicates whether the request was successful
  - `data` SentDmServicesEndpointsCustomerAPIv3ComplianceResponsesComplianceRequirementsResponse: Everything a market expects of a sender, for one channel, country and sender type.
    - `channel` string: Channel the requirements apply to — sms, whatsapp or rcs. Echoed so the document says which channel it describes. It always described one: setup's last step is a specific channel path, and every type is an SMS sender type — but a caller reading the payload had to infer that from the path to know it.
    - `country` string: ISO 3166-1 alpha-2 country the requirements apply to.
    - `type` string: Sender type the requirements apply to. Non-nullable while sms is the only channel answered here, because it is the only channel whose senders have a type — the day another one is answered, this becomes nullable along with it. Not nullable in advance: nothing can emit null today, and publishing a shape the API never sends is the same mistake as publishing a field it does not have.
    - `required` boolean: Whether this market demands anything before a sender can be registered. When false, the compliance array may be omitted entirely and the profile is ready once provisioned.
    - `sender_id_pattern` string, nullable: Pattern the sender's own value must match, where the market dictates one — alphanumeric sender ids and short codes. Null when the value is carrier-assigned.
    - `requirements` SentDmServicesEndpointsCustomerAPIv3ComplianceResponsesComplianceRequirementResponse[]: Values to supply in compliance. Empty when the market demands nothing. Values Sent supplies on your behalf are never listed, and neither are ones it derives from what you send.
      - `key` string: Key to use in the compliance map.
      - `type` string: Value type: string, number, boolean, date, enum, object, array or document.
      - `format` string, nullable: Refinement of type where the market demands a specific shape, e.g. e164, url, email, iso3166_alpha2, csv_keywords.
      - `required` boolean: Whether the market always demands this value.
      - `required_when` string, nullable: Condition that makes this value required, when it is only required in some cases — e.g. brand.entity_type == PUBLIC_PROFIT. Evaluate it against your own payload to know whether to collect the field.
      - `options` string[], nullable: Accepted values, when the type is an enum or a constrained array.
      - `min_length` integer, nullable: Shortest acceptable value, where the market sets one. TCR refuses a consent narrative under 40 characters, and finding that out at submission time is the round trip this exists to save.
      - `max_items` integer, nullable: Most entries this value accepts, where the market caps it.
      - `item_fields` SentDmServicesEndpointsCustomerAPIv3ComplianceResponsesComplianceRequirementResponse[], nullable: Shape of each entry, when this requirement is a list of objects rather than of scalars. The compliance value stays null in the setup body like every other blank — a body that carries a half-filled object is one the endpoint refuses, which would break the promise that the published body can be sent as it stands. So the shape is described here instead, and each entry the caller composes has these keys.
      - `label` string, nullable: Human label, suitable for a form field.
      - `notes` string, nullable: Why the market asks for this.
    - `setup` SentDmServicesEndpointsCustomerAPIv3ComplianceResponsesComplianceSetupStep[]: The calls that set this market up, in the order they have to be made, each carrying a body that can be sent as it stands. This is the answer to "what do I actually do". Requirements describes each value the market wants; this assembles those descriptions into the requests that supply them, so a caller — or an agent acting for one — copies a body out and sends it rather than building one from a table. The last step is always the channel itself, and it is where the regime's own values are supplied. The one before it, where there is one, is the brand a registering market files against — so it is a step of its own and the channel call refuses until it exists. A market that registers with nobody has one step.
      - `step` integer: Position in the sequence, from 1. Steps must be performed in this order.
      - `resource` string: What this call sets up: brand or channel.
      - `method` string
      - `path` string: Path to call. Add the x-profile-id header with an organization key to make the same call for one of your sender profiles — there is no separate path for that.
      - `why` string: Why this market needs this call, in one sentence.
      - `body` unknown
      - `attachments` SentDmServicesEndpointsCustomerAPIv3ComplianceResponsesComplianceAttachmentTemplate[], nullable: Files to attach as multipart, when this call takes any. Absent when it does not.
        - `field_name` string: The multipart field name to attach the file under.
        - `label` string, nullable
        - `required` boolean
  - `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

- `400`: Missing or unrecognised channel, country or sender type
- `401`: Unauthorized - Invalid API credentials
- `403`: Forbidden
- `500`: Internal server error
- `501`: That channel's requirements are not published here yet
- `503`: The market exists but its configuration is incomplete, so nothing can be sent there yet

## Changes

- **2026-10-16** `6c829543a93e`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/sentdm/apis/sent-dm-api-v3/changes/v3/compliance/requirements/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)
