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.
Authorization
apiKey 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
Header Parameters
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.
1 <= length <= 255Request 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"
}POSTOpen the member portal for a member
Mints a short-lived link that signs this member into the Arcalotl member portal, scoped to your community, where they can change plan, cancel, update their card, and see invoices. Redirect your signed-in user to `url`; it expires after ten minutes. Pass `return_url` so the portal offers a way back to your app. Requires the `members:write` scope.
GETList a member's entitlements
Returns the member's active entitlements, each resolved to its tier, plan, status, and the platform grants it confers.