> ## Documentation Index
> Fetch the complete documentation index at: https://www.courier.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

> ## Agent Instructions
> Install the Courier skill before writing code: `npx skills add trycourier/courier-skills`. It carries the verified SDK shapes and the rules you cannot get wrong.
> Authenticate every request with `Authorization: Bearer <API_KEY>`. A workspace has several environments and each has its own keys, which are plain `pk_` strings with no environment prefix. Start with Test.
> Send with `client.send.message`, the default import of the v7 Node SDK. Reference a template by its `nt_` id or its alias.
> A send accepts a bare Elemental element list, but storing content on a template requires the top-level elements wrapped in a channel element.
> Templates and journeys can be built in the Courier app or created through the API. Either way they live in the workspace and are referenced by ID when you send.
> The hosted MCP server is https://mcp.courier.com. For a briefing on what Courier is and when to use it, read https://www.courier.com/llms.txt.
> Prefer the Guides tab for how-do-I questions and the Docs tab for how-does-it-behave questions. The API reference lives under /api-reference.

# Security and compliance

> US and EU data regions, encryption, and Courier's SOC 2, HIPAA, and GDPR posture.

export const Endpoint = ({method, path, name, href, children, bare}) => {
  const verb = String(method || "").toUpperCase();
  const title = verb + " " + path;
  const label = children || name || path;
  if (bare) {
    return href ? <a href={href}><code>{title}</code></a> : <code>{title}</code>;
  }
  if (!href) {
    return <span className="cx-endpoint" data-method={verb} title={title}>
        <span className="cx-endpoint-label">{label}</span>
        <span className="cx-endpoint-method">{verb}</span>
      </span>;
  }
  return <a className="cx-endpoint" data-method={verb} href={href} title={title}>
      <span className="cx-endpoint-label">{label}</span>
      <span className="cx-endpoint-method">{verb}</span>
    </a>;
};

export const Doc = ({href, children, name, bare}) => {
  const label = children || name || href;
  if (bare) {
    return <a href={href}>{label}</a>;
  }
  return <a className="cx-endpoint" data-kind="doc" href={href}>
      <span className="cx-endpoint-label">{label}</span>
      <span className="cx-endpoint-method">DOC</span>
    </a>;
};

Courier stores your data in a US or EU region, and you choose which.

## Certifications and compliance

Courier maintains **SOC 2**, **HIPAA**, and **PCI DSS** programs, and supports **GDPR** and **CCPA** obligations.

The [Security Portal](https://security.courier.com/) is the authoritative source and holds the current reports, including the SOC 2 report, the HIPAA report, and the most recent penetration test. Request them there for a vendor review. It also covers product, data, application, access, infrastructure, endpoint, and network security practices.

<Note>
  Courier is a managed cloud platform, so there is no self-hosted or on-premise deployment. If you are asking because of data residency requirements, the [EU region](#regions-and-data-residency) keeps notification data inside European borders.
</Note>

## How it works

### Regions and data residency

Courier runs in two regions: **US** (the default, `us-east-1`) and **EU** (`eu-west-1`, Ireland). The EU region stores and processes your notification data inside European borders, for data residency and GDPR (RGPD) compliance. The same workspace and API key work in both regions. Only the base URL differs.

| Surface             | EU endpoint                     |
| ------------------- | ------------------------------- |
| API                 | `https://api.eu.courier.com`    |
| Dashboard           | `https://app.eu.courier.com`    |
| Inbox (client SDKs) | `https://inbox.eu.courier.io/q` |

To keep data in the EU region, point your server SDK's `baseURL` and your client SDK's API URLs at the EU endpoints. The EU region is provisioned by arrangement. [Contact Courier](https://www.courier.com/request-demo) to enable it for your workspace.

<Warning>
  The Courier console cannot create a tenant in `eu-west-1` and rejects the request. <Endpoint method="PUT" path="/tenants/{tenant_id}" name="Create or replace a Tenant" href="/docs/api-reference/tenants/create-or-replace-a-tenant" /> is not region-gated, so create tenants over the API or from a US-region workspace.
</Warning>

### Personal data in logs

Message logs can contain personal data. A message's "request received" view shows whatever you sent, which may be PII (a profile's email or phone) or PHI (data in your payload). <Doc href="/docs/workspaces/team-access#roles-and-permissions">Role log levels</Doc> control who sees it: Level 2 and Full expose request data, Level 1 does not. Restrict those roles, and keep data you do not want retained out of your payload.

### GDPR and RGPD requests

Handle data-subject requests through the API in the region that holds the data.

**Access or export.** <Endpoint method="GET" path="/profiles/{user_id}" name="Get a Profile" href="/docs/api-reference/user-profiles/get-a-profile" /> returns the stored profile for a subject access request.

**Deletion takes more than one call.** <Endpoint method="DELETE" path="/profiles/{user_id}" name="Delete a Profile" href="/docs/api-reference/user-profiles/delete-a-profile" /> removes the profile, its stored contact details, and the user's tenant memberships. It does **not** reach list subscriptions or device tokens, which are separate resources. Work the list in order:

| What it holds                                | Call                                                                                                                                                         |
| :------------------------------------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Profile, contact details, tenant memberships | <Endpoint method="DELETE" path="/profiles/{user_id}" name="Delete a Profile" href="/docs/api-reference/user-profiles/delete-a-profile" />                         |
| List subscriptions                           | <Endpoint method="DELETE" path="/profiles/{user_id}/lists" name="Delete List subscriptions" href="/docs/api-reference/user-profiles/delete-list-subscriptions" /> |
| A device token                               | <Endpoint method="DELETE" path="/users/{user_id}/tokens/{token}" name="Delete user token" href="/docs/api-reference/device-tokens/delete-user-token" />           |

Device tokens delete one at a time, so read them back with <Endpoint method="GET" path="/users/{user_id}/tokens" name="List tokens" href="/docs/api-reference/device-tokens/list-tokens" /> first and delete each one.

<Warning>
  **Preferences have no delete.** <Endpoint method="PUT" path="/users/{user_id}/preferences" name="Replace user Preferences in bulk" href="/docs/api-reference/user-preferences/replace-user-preferences-in-bulk" /> replaces a user's override set, so the way to clear stored choices is to replace them with an empty set. Confirm that satisfies your own retention policy before you rely on it.
</Warning>

For an EU-region workspace, call the EU endpoint (`https://api.eu.courier.com`) so you act on the EU-resident copy. Courier's data-processing terms are on the [Security Portal](https://security.courier.com/).

## Limits & behavior

* **Region is fixed per workspace deployment.** A workspace's data lives in the region it was provisioned in. You reach a region by targeting its endpoints, not by a per-request flag.
* **EU blocks tenant creation in the console.** `eu-west-1` rejects console-created tenants. <Endpoint method="PUT" path="/tenants/{tenant_id}" name="Create or replace a Tenant" href="/docs/api-reference/tenants/create-or-replace-a-tenant" /> is not region-gated, so provisioning over the API still works.
* **The same API key works in both regions.** Residency comes from the base URL you call, so double-check `baseURL` in EU deployments.

## FAQ

<AccordionGroup>
  <Accordion title="How do I keep my data in the EU?">
    For an EU-provisioned workspace, use the EU endpoints (`https://api.eu.courier.com`, `https://app.eu.courier.com`). The same API key works in both regions, so the base URL your SDK and clients target decides residency.
  </Accordion>

  <Accordion title="Can I create tenants in the EU region?">
    Not from the console: `eu-west-1` rejects the request. <Endpoint method="PUT" path="/tenants/{tenant_id}" name="Create or replace a Tenant" href="/docs/api-reference/tenants/create-or-replace-a-tenant" /> has no region gate, so create tenants over the API, or provision them from a US-region workspace.
  </Accordion>

  <Accordion title="How do I fulfill a GDPR deletion request?">
    A deletion request takes several calls, not one. <Endpoint method="DELETE" path="/profiles/{user_id}" name="Delete a Profile" href="/docs/api-reference/user-profiles/delete-a-profile" /> removes the profile and its contact details, and subscriptions, tenant memberships, and device tokens are separate resources you delete too. See [GDPR and RGPD requests](#gdpr-and-rgpd-requests) for the full list. Use the EU endpoint for an EU workspace.
  </Accordion>
</AccordionGroup>
