---
title: "Subscribe a fan"
method: POST
path: "/v1/fans/subscriptions"
tags: ["fans"]
---

# Subscribe a fan

`POST /v1/fans/subscriptions`

## Request body

- union
  - object
    - `consentGrantedAt` string, date-time, required — When consent was granted, in ISO 8601 with an explicit UTC offset.
    - `email` string, email — Fan email address.
    - `emailMarketingConsent` boolean — Whether email marketing consent was granted.
    - `externalId` string, required — Integration-owned, customer-scoped fan identifier.
    - `phone` string — E.164 phone number including the national code, for example +12025550100.
    - `smsMarketingConsent` boolean — Whether SMS marketing consent was granted.
  - object
    - `consentGrantedAt` string, date-time, required — When consent was granted, in ISO 8601 with an explicit UTC offset.
    - `email` string, email, required — Fan email address.
    - `emailMarketingConsent` boolean — Whether email marketing consent was granted.
    - `externalId` string — Integration-owned, customer-scoped fan identifier.
    - `phone` string — E.164 phone number including the national code, for example +12025550100.
    - `smsMarketingConsent` boolean — Whether SMS marketing consent was granted.
  - object
    - `consentGrantedAt` string, date-time, required — When consent was granted, in ISO 8601 with an explicit UTC offset.
    - `email` string, email — Fan email address.
    - `emailMarketingConsent` boolean — Whether email marketing consent was granted.
    - `externalId` string — Integration-owned, customer-scoped fan identifier.
    - `phone` string, required — E.164 phone number including the national code, for example +12025550100.
    - `smsMarketingConsent` boolean — Whether SMS marketing consent was granted.

## Response `200`

The resulting consent-safe subscription state.

- object
  - `fan` object, required — A customer-scoped fan representation. Contact information is never returned by the public API.
    - `id` string, required — Opaque Laylo fan identifier.
    - `inferredDisplayName` string — Optional non-contact display name inferred by Laylo.
    - `joinedAt` string, date-time — When the fan first joined, in ISO 8601 with an explicit UTC offset.
    - `location` object — Optional non-contact location.
      - `city` string — City name.
      - `country` string — Country name or code.
      - `state` string — State or region.
  - `subscribed` boolean, required — Whether the fan is now subscribed.

## Other responses

- `400` — The request body is malformed.
- `401` — The integrator credential or customer API key is invalid.
- `403` — The customer account behind the API key has no paid Laylo plan.
- `404` — No route matches the requested path.
- `405` — The path exists, but the HTTP method is not supported.
- `409` — The request conflicts with the current resource state.
- `429` — The per-integrator rate limit for this operation is exceeded.
- `500` — An unexpected server error occurred.

---

[API](https://skmtc.dev/laylo/apis/laylo-api.md) · [All operations](https://skmtc.dev/laylo/apis/laylo-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/laylo/laylo-api/revisions/000d81a01b74/schema)
