ArcalotlArcalotl
Members

Attach your user id to a member

Maps an operator-owned `{namespace, external_user_id}` onto an existing member, for example a buyer who first subscribed through a bot and later signed into your app. Each active entitlement is republished as `member.entitlement.updated` carrying the new subject. Re-sending the identical mapping is a no-op; a subject already mapped to another member, or a member that already has a subject in that namespace, answers `409 conflict`. Requires the `members:write` scope.

Serverhttps://api.arcalotl.com
POST
/v1/members/{id}/external-subjects
AuthorizationBearer <token>

Community-scoped API key. Send it as Authorization: Bearer arclt_live_.... Keys carry scopes; endpoints that need a specific scope answer 403 missing_scope when the key lacks it.

In: header

Path Parameters

id*string

Header Parameters

Idempotency-Key?string

Opaque client-generated key (1-255 chars) that makes a write safe to retry for 24h. A replay of the same key and body returns the original response with Idempotent-Replayed: true. Reusing the key with a different body returns 422 idempotency_key_reuse; an in-flight duplicate returns 409 request_in_flight.

Length1 <= length <= 255

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

application/json

application/problem+json

application/problem+json

application/problem+json

application/problem+json

application/problem+json

application/problem+json

application/problem+json

curl -X POST "https://example.com/v1/members/string/external-subjects" \  -H "Idempotency-Key: 6f8a2c1e-4b3d-4e9a-9c21-2f0a1b7d5e44" \  -H "Content-Type: application/json" \  -d '{    "namespace": "production",    "external_user_id": "usr_7f921"  }'
{
  "id": "mem_01JMZX1Z7D",
  "created_at": "2026-05-01T12:00:00Z",
  "identities": [
    {
      "platform": "discord",
      "platform_uid": "218421075025461248",
      "username": "ari"
    }
  ],
  "external_subjects": [
    {
      "namespace": "production",
      "external_user_id": "usr_7f921"
    }
  ]
}
{
  "type": "https://docs.arcalotl.com/api/errors#invalid_request",
  "title": "Bad Request",
  "status": 400,
  "detail": "The 'cursor' parameter is not a valid cursor from a previous response.",
  "code": "invalid_request"
}
{
  "type": "https://docs.arcalotl.com/api/errors#unauthorized",
  "title": "Unauthorized",
  "status": 401,
  "detail": "A valid API key is required. Provide it as 'Authorization: Bearer arclt_live_...'.",
  "code": "unauthorized"
}
{
  "type": "https://docs.arcalotl.com/api/errors#missing_scope",
  "title": "Forbidden",
  "status": 403,
  "detail": "This API key is missing the required scope: subscriptions:read.",
  "code": "missing_scope"
}
{
  "type": "https://docs.arcalotl.com/api/errors#not_found",
  "title": "Not Found",
  "status": 404,
  "detail": "The requested resource was not found.",
  "code": "not_found"
}
{
  "type": "https://docs.arcalotl.com/api/errors#request_in_flight",
  "title": "Conflict",
  "status": 409,
  "detail": "Another request with this Idempotency-Key is still in flight.",
  "code": "request_in_flight"
}
{
  "type": "https://docs.arcalotl.com/api/errors#invalid_request",
  "title": "Unprocessable Entity",
  "status": 422,
  "detail": "One or more request values are invalid.",
  "code": "invalid_request"
}
{
  "type": "https://docs.arcalotl.com/api/errors#rate_limited",
  "title": "Too Many Requests",
  "status": 429,
  "detail": "Rate limit exceeded. Retry after the interval in the Retry-After header.",
  "code": "rate_limited"
}