Customer identity and access
Connect customer identities and summarize access from purchases.
Use external_id to join a SellApp customer to your own system. It is unique and immutable inside a store. Email addresses are normalized before uniqueness checks; locale uses BCP 47; metadata accepts only a small map of scalar values.
Entitlements summarize access from purchases, licenses, subscriptions, bookings, and community grants. They do not establish current membership at an external provider. The summary omits license keys, serials, files, fulfillment payloads, and seller-only metadata.
A subscription_access entitlement follows the subscription's access. A past-due
subscription keeps access while its payment is being collected, and an unpaid one
loses it until it is paid. So state is active while the subscription is active,
trialing, or past due, and suspended while it is unpaid, paused, or on hold for an
unpaid renewal. A cancelled subscription reads revoked, an incomplete one
pending, and one whose first payment expired expired. See
Failed payments.
For SDK/REST calls, use an API key with the invoice ability and matching store
permission. Official CLI/MCP connections use their admin grant and current
permissions. Send X-STORE for this store.
Use PUT /v2/customers/external/{externalId} to create or update one identity.
Send email every time. Omitted name, locale, and metadata stay unchanged;
supplying metadata replaces the complete object. The URL supplies the immutable
external ID (1–255 characters, URL-encoded as one path segment). Creation
returns 201; an update returns 200. An email owned by another customer
returns 422; a concurrent identity collision can return 409. Retrieve the
customer and check its identity before retrying. No customers are merged.
Provide your SellApp API key as a bearer token.
In: header
Header Parameters
Reuse this key only for an identical retry. A replay returns Idempotent-Replayed: true.
8 <= length <= 255Store slug. Required for OAuth access tokens. API keys may omit it to use their current store, or the first accessible store when no current store is selected.
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
Response Body
application/json
application/json
application/json
application/json
application/json
application/json
application/json
application/json
application/json
application/json
curl -X POST "https://sell.app/api/v2/customers" \ -H "Idempotency-Key: project-library-2026-09-04" \ -H "X-STORE: launch-lab" \ -H "Content-Type: application/json" \ -d '{ "id": 314, "email": "maya.chen@example.com", "external_id": "crm_maya_314", "name": "Maya Chen", "locale": "en-GB", "metadata": { "plan": "standard", "seats": 3 } }'{
"data": {
"id": 314,
"email": "maya.chen@example.com",
"external_id": "crm_maya_314",
"name": "Maya Chen",
"locale": "en-GB",
"metadata": {
"plan": "standard",
"seats": 3
},
"insights": {
"orders_count": 0,
"line_items_count": 0,
"completed_line_items_count": 0,
"pending_line_items_count": 0,
"voided_line_items_count": 0,
"subscriptions_count": 0,
"revenue_usd_cents": 0,
"first_purchase_at": null,
"last_purchase_at": null,
"favorite_payment_method": null
},
"created_at": "2026-08-24T10:00:00.000000Z",
"updated_at": "2026-08-24T10:00:00.000000Z"
}
}{
"type": "invalid_request_error",
"code": "bad_request",
"message": "The request could not be understood.",
"status": 400,
"param": null,
"request_id": "01992a65-e064-71ba-b38f-902b7966a6be",
"docs_url": "https://sell.app/docs/api/errors#bad-request"
}{
"type": "authentication_error",
"code": "unauthenticated",
"message": "Unauthenticated.",
"status": 401,
"param": null,
"request_id": "01992a65-e064-71ba-b38f-902b7966a6be",
"docs_url": "https://sell.app/docs/api/errors#unauthenticated"
}{
"type": "authorization_error",
"code": "forbidden",
"message": "This action is unauthorized.",
"status": 403,
"param": null,
"request_id": "01992a65-e064-71ba-b38f-902b7966a6be",
"docs_url": "https://sell.app/docs/api/errors#forbidden"
}{
"type": "not_found_error",
"code": "resource_not_found",
"message": "Not Found.",
"status": 404,
"param": null,
"request_id": "01992a65-e064-71ba-b38f-902b7966a6be",
"docs_url": "https://sell.app/docs/api/errors#resource-not-found"
}{
"type": "conflict_error",
"code": "conflict",
"message": "The resource state changed before this request.",
"status": 409,
"param": null,
"request_id": "01992a65-e064-71ba-b38f-902b7966a6be",
"docs_url": "https://sell.app/docs/api/errors#conflict"
}{
"type": "invalid_request_error",
"code": "cursor_expired",
"message": "This cursor has expired. Start again without a cursor.",
"status": 410,
"param": "cursor",
"request_id": "01992a65-e064-71ba-b38f-902b7966a6be",
"docs_url": "https://sell.app/docs/api/errors#cursor-expired"
}{
"type": "validation_error",
"code": "validation_failed",
"message": "The selected product variant id is invalid.",
"status": 422,
"param": "product_variant_id",
"request_id": "01992a65-e064-71ba-b38f-902b7966a6be",
"docs_url": "https://sell.app/docs/api/errors#validation-failed",
"errors": {
"product_variant_id": [
"The selected product variant id is invalid."
]
}
}{
"type": "rate_limit_error",
"code": "rate_limit_exceeded",
"message": "Too Many Attempts.",
"status": 429,
"param": null,
"request_id": "01992a65-e064-71ba-b38f-902b7966a6be",
"docs_url": "https://sell.app/docs/api/errors#rate-limit-exceeded"
}{
"type": "api_error",
"code": "api_error",
"message": "Server Error",
"status": 500,
"param": null,
"request_id": "01992a65-e064-71ba-b38f-902b7966a6be",
"docs_url": "https://sell.app/docs/api/errors#api-error"
}Provide your SellApp API key as a bearer token.
In: header
Path Parameters
The customer identifier.
Header Parameters
Reuse this key only for an identical retry. A replay returns Idempotent-Replayed: true.
8 <= length <= 255Store slug. Required for OAuth access tokens. API keys may omit it to use their current store, or the first accessible store when no current store is selected.
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
Response Body
application/json
application/json
application/json
application/json
application/json
application/json
application/json
application/json
application/json
application/json
curl -X PATCH "https://sell.app/api/v2/customers/314" \ -H "Idempotency-Key: project-library-2026-09-04" \ -H "X-STORE: launch-lab" \ -H "Content-Type: application/json" \ -d '{ "locale": "en-US" }'{
"data": {
"id": 314,
"email": "maya.chen@example.com",
"external_id": "crm_maya_314",
"name": "Maya Chen",
"locale": "en-US",
"metadata": {
"plan": "standard",
"seats": 3
},
"insights": {
"orders_count": 0,
"line_items_count": 0,
"completed_line_items_count": 0,
"pending_line_items_count": 0,
"voided_line_items_count": 0,
"subscriptions_count": 0,
"revenue_usd_cents": 0,
"first_purchase_at": null,
"last_purchase_at": null,
"favorite_payment_method": null
},
"created_at": "2026-08-24T10:00:00.000000Z",
"updated_at": "2026-08-24T10:00:00.000000Z"
}
}{
"type": "invalid_request_error",
"code": "bad_request",
"message": "The request could not be understood.",
"status": 400,
"param": null,
"request_id": "01992a65-e064-71ba-b38f-902b7966a6be",
"docs_url": "https://sell.app/docs/api/errors#bad-request"
}{
"type": "authentication_error",
"code": "unauthenticated",
"message": "Unauthenticated.",
"status": 401,
"param": null,
"request_id": "01992a65-e064-71ba-b38f-902b7966a6be",
"docs_url": "https://sell.app/docs/api/errors#unauthenticated"
}{
"type": "authorization_error",
"code": "forbidden",
"message": "This action is unauthorized.",
"status": 403,
"param": null,
"request_id": "01992a65-e064-71ba-b38f-902b7966a6be",
"docs_url": "https://sell.app/docs/api/errors#forbidden"
}{
"type": "not_found_error",
"code": "resource_not_found",
"message": "Not Found.",
"status": 404,
"param": null,
"request_id": "01992a65-e064-71ba-b38f-902b7966a6be",
"docs_url": "https://sell.app/docs/api/errors#resource-not-found"
}{
"type": "conflict_error",
"code": "conflict",
"message": "The resource state changed before this request.",
"status": 409,
"param": null,
"request_id": "01992a65-e064-71ba-b38f-902b7966a6be",
"docs_url": "https://sell.app/docs/api/errors#conflict"
}{
"type": "invalid_request_error",
"code": "cursor_expired",
"message": "This cursor has expired. Start again without a cursor.",
"status": 410,
"param": "cursor",
"request_id": "01992a65-e064-71ba-b38f-902b7966a6be",
"docs_url": "https://sell.app/docs/api/errors#cursor-expired"
}{
"type": "validation_error",
"code": "validation_failed",
"message": "The selected product variant id is invalid.",
"status": 422,
"param": "product_variant_id",
"request_id": "01992a65-e064-71ba-b38f-902b7966a6be",
"docs_url": "https://sell.app/docs/api/errors#validation-failed",
"errors": {
"product_variant_id": [
"The selected product variant id is invalid."
]
}
}{
"type": "rate_limit_error",
"code": "rate_limit_exceeded",
"message": "Too Many Attempts.",
"status": 429,
"param": null,
"request_id": "01992a65-e064-71ba-b38f-902b7966a6be",
"docs_url": "https://sell.app/docs/api/errors#rate-limit-exceeded"
}{
"type": "api_error",
"code": "api_error",
"message": "Server Error",
"status": 500,
"param": null,
"request_id": "01992a65-e064-71ba-b38f-902b7966a6be",
"docs_url": "https://sell.app/docs/api/errors#api-error"
}Provide your SellApp API key as a bearer token.
In: header
Path Parameters
The externalId identifier.
Header Parameters
Store slug. Required for OAuth access tokens. API keys may omit it to use their current store, or the first accessible store when no current store is selected.
Response Body
application/json
application/json
application/json
application/json
application/json
application/json
application/json
application/json
application/json
application/json
curl -X GET "https://sell.app/api/v2/customers/external/314" \ -H "X-STORE: launch-lab"{
"data": {
"id": 314,
"email": "maya.chen@example.com",
"external_id": "crm_maya_314",
"name": "Maya Chen",
"locale": "en-GB",
"metadata": {
"plan": "standard",
"seats": 3
},
"insights": {
"orders_count": 0,
"line_items_count": 0,
"completed_line_items_count": 0,
"pending_line_items_count": 0,
"voided_line_items_count": 0,
"subscriptions_count": 0,
"revenue_usd_cents": 0,
"first_purchase_at": null,
"last_purchase_at": null,
"favorite_payment_method": null
},
"created_at": "2026-08-24T10:00:00.000000Z",
"updated_at": "2026-08-24T10:00:00.000000Z"
}
}{
"type": "invalid_request_error",
"code": "bad_request",
"message": "The request could not be understood.",
"status": 400,
"param": null,
"request_id": "01992a65-e064-71ba-b38f-902b7966a6be",
"docs_url": "https://sell.app/docs/api/errors#bad-request"
}{
"type": "authentication_error",
"code": "unauthenticated",
"message": "Unauthenticated.",
"status": 401,
"param": null,
"request_id": "01992a65-e064-71ba-b38f-902b7966a6be",
"docs_url": "https://sell.app/docs/api/errors#unauthenticated"
}{
"type": "authorization_error",
"code": "forbidden",
"message": "This action is unauthorized.",
"status": 403,
"param": null,
"request_id": "01992a65-e064-71ba-b38f-902b7966a6be",
"docs_url": "https://sell.app/docs/api/errors#forbidden"
}{
"type": "not_found_error",
"code": "resource_not_found",
"message": "Not Found.",
"status": 404,
"param": null,
"request_id": "01992a65-e064-71ba-b38f-902b7966a6be",
"docs_url": "https://sell.app/docs/api/errors#resource-not-found"
}{
"type": "conflict_error",
"code": "conflict",
"message": "The resource state changed before this request.",
"status": 409,
"param": null,
"request_id": "01992a65-e064-71ba-b38f-902b7966a6be",
"docs_url": "https://sell.app/docs/api/errors#conflict"
}{
"type": "invalid_request_error",
"code": "cursor_expired",
"message": "This cursor has expired. Start again without a cursor.",
"status": 410,
"param": "cursor",
"request_id": "01992a65-e064-71ba-b38f-902b7966a6be",
"docs_url": "https://sell.app/docs/api/errors#cursor-expired"
}{
"type": "validation_error",
"code": "validation_failed",
"message": "The selected product variant id is invalid.",
"status": 422,
"param": "product_variant_id",
"request_id": "01992a65-e064-71ba-b38f-902b7966a6be",
"docs_url": "https://sell.app/docs/api/errors#validation-failed",
"errors": {
"product_variant_id": [
"The selected product variant id is invalid."
]
}
}{
"type": "rate_limit_error",
"code": "rate_limit_exceeded",
"message": "Too Many Attempts.",
"status": 429,
"param": null,
"request_id": "01992a65-e064-71ba-b38f-902b7966a6be",
"docs_url": "https://sell.app/docs/api/errors#rate-limit-exceeded"
}{
"type": "api_error",
"code": "api_error",
"message": "Server Error",
"status": 500,
"param": null,
"request_id": "01992a65-e064-71ba-b38f-902b7966a6be",
"docs_url": "https://sell.app/docs/api/errors#api-error"
}Provide your SellApp API key as a bearer token.
In: header
Path Parameters
The externalId identifier.
Header Parameters
Reuse this key only for an identical retry. A replay returns Idempotent-Replayed: true.
8 <= length <= 255Store slug. Required for OAuth access tokens. API keys may omit it to use their current store, or the first accessible store when no current store is selected.
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
Response Body
application/json
application/json
application/json
application/json
application/json
application/json
application/json
application/json
application/json
application/json
curl -X PATCH "https://sell.app/api/v2/customers/external/314" \ -H "Idempotency-Key: project-library-2026-09-04" \ -H "X-STORE: launch-lab" \ -H "Content-Type: application/json" \ -d '{ "locale": "en-US" }'{
"data": {
"id": 314,
"email": "maya.chen@example.com",
"external_id": "crm_maya_314",
"name": "Maya Chen",
"locale": "en-US",
"metadata": {
"plan": "standard",
"seats": 3
},
"insights": {
"orders_count": 0,
"line_items_count": 0,
"completed_line_items_count": 0,
"pending_line_items_count": 0,
"voided_line_items_count": 0,
"subscriptions_count": 0,
"revenue_usd_cents": 0,
"first_purchase_at": null,
"last_purchase_at": null,
"favorite_payment_method": null
},
"created_at": "2026-08-24T10:00:00.000000Z",
"updated_at": "2026-08-24T10:00:00.000000Z"
}
}{
"type": "invalid_request_error",
"code": "bad_request",
"message": "The request could not be understood.",
"status": 400,
"param": null,
"request_id": "01992a65-e064-71ba-b38f-902b7966a6be",
"docs_url": "https://sell.app/docs/api/errors#bad-request"
}{
"type": "authentication_error",
"code": "unauthenticated",
"message": "Unauthenticated.",
"status": 401,
"param": null,
"request_id": "01992a65-e064-71ba-b38f-902b7966a6be",
"docs_url": "https://sell.app/docs/api/errors#unauthenticated"
}{
"type": "authorization_error",
"code": "forbidden",
"message": "This action is unauthorized.",
"status": 403,
"param": null,
"request_id": "01992a65-e064-71ba-b38f-902b7966a6be",
"docs_url": "https://sell.app/docs/api/errors#forbidden"
}{
"type": "not_found_error",
"code": "resource_not_found",
"message": "Not Found.",
"status": 404,
"param": null,
"request_id": "01992a65-e064-71ba-b38f-902b7966a6be",
"docs_url": "https://sell.app/docs/api/errors#resource-not-found"
}{
"type": "conflict_error",
"code": "conflict",
"message": "The resource state changed before this request.",
"status": 409,
"param": null,
"request_id": "01992a65-e064-71ba-b38f-902b7966a6be",
"docs_url": "https://sell.app/docs/api/errors#conflict"
}{
"type": "invalid_request_error",
"code": "cursor_expired",
"message": "This cursor has expired. Start again without a cursor.",
"status": 410,
"param": "cursor",
"request_id": "01992a65-e064-71ba-b38f-902b7966a6be",
"docs_url": "https://sell.app/docs/api/errors#cursor-expired"
}{
"type": "validation_error",
"code": "validation_failed",
"message": "The selected product variant id is invalid.",
"status": 422,
"param": "product_variant_id",
"request_id": "01992a65-e064-71ba-b38f-902b7966a6be",
"docs_url": "https://sell.app/docs/api/errors#validation-failed",
"errors": {
"product_variant_id": [
"The selected product variant id is invalid."
]
}
}{
"type": "rate_limit_error",
"code": "rate_limit_exceeded",
"message": "Too Many Attempts.",
"status": 429,
"param": null,
"request_id": "01992a65-e064-71ba-b38f-902b7966a6be",
"docs_url": "https://sell.app/docs/api/errors#rate-limit-exceeded"
}{
"type": "api_error",
"code": "api_error",
"message": "Server Error",
"status": 500,
"param": null,
"request_id": "01992a65-e064-71ba-b38f-902b7966a6be",
"docs_url": "https://sell.app/docs/api/errors#api-error"
}Provide your SellApp API key as a bearer token.
In: header
Path Parameters
Store-local external ID, 1–255 characters; whitespace-only values are invalid. URL-encode it as one path segment.
1 <= length <= 255Header Parameters
Reuse this key only for an identical retry. A replay returns Idempotent-Replayed: true.
8 <= length <= 255Store slug. Required for OAuth access tokens. API keys may omit it to use their current store, or the first accessible store when no current store is selected.
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
Response Body
application/json
application/json
application/json
application/json
application/json
application/json
application/json
application/json
application/json
curl -X PUT "https://sell.app/api/v2/customers/external/crm_maya_314" \ -H "Idempotency-Key: project-library-2026-09-04" \ -H "X-STORE: launch-lab" \ -H "Content-Type: application/json" \ -d '{ "email": "maya.chen@example.com", "name": "Maya Chen" }'{
"data": {
"id": 314,
"email": "maya.chen@example.com",
"external_id": "crm_maya_314",
"name": "Maya Chen",
"locale": "en-US",
"metadata": {
"plan": "standard",
"seats": 3
},
"insights": {
"orders_count": 0,
"line_items_count": 0,
"completed_line_items_count": 0,
"pending_line_items_count": 0,
"voided_line_items_count": 0,
"subscriptions_count": 0,
"revenue_usd_cents": 0,
"first_purchase_at": null,
"last_purchase_at": null,
"favorite_payment_method": null
},
"created_at": "2026-08-24T10:00:00.000000Z",
"updated_at": "2026-08-24T10:00:00.000000Z"
}
}{
"data": {
"id": 314,
"email": "maya.chen@example.com",
"external_id": "crm_maya_314",
"name": "Maya Chen",
"locale": "en-US",
"metadata": {
"plan": "standard",
"seats": 3
},
"insights": {
"orders_count": 0,
"line_items_count": 0,
"completed_line_items_count": 0,
"pending_line_items_count": 0,
"voided_line_items_count": 0,
"subscriptions_count": 0,
"revenue_usd_cents": 0,
"first_purchase_at": null,
"last_purchase_at": null,
"favorite_payment_method": null
},
"created_at": "2026-08-24T10:00:00.000000Z",
"updated_at": "2026-08-24T10:00:00.000000Z"
}
}{
"type": "invalid_request_error",
"code": "bad_request",
"message": "The request could not be understood.",
"status": 400,
"param": null,
"request_id": "01992a65-e064-71ba-b38f-902b7966a6be",
"docs_url": "https://sell.app/docs/api/errors#bad-request"
}{
"type": "authentication_error",
"code": "unauthenticated",
"message": "Unauthenticated.",
"status": 401,
"param": null,
"request_id": "01992a65-e064-71ba-b38f-902b7966a6be",
"docs_url": "https://sell.app/docs/api/errors#unauthenticated"
}{
"type": "authorization_error",
"code": "forbidden",
"message": "This action is unauthorized.",
"status": 403,
"param": null,
"request_id": "01992a65-e064-71ba-b38f-902b7966a6be",
"docs_url": "https://sell.app/docs/api/errors#forbidden"
}{
"type": "not_found_error",
"code": "resource_not_found",
"message": "Not Found.",
"status": 404,
"param": null,
"request_id": "01992a65-e064-71ba-b38f-902b7966a6be",
"docs_url": "https://sell.app/docs/api/errors#resource-not-found"
}{
"type": "validation_error",
"code": "validation_failed",
"message": "The selected product variant id is invalid.",
"status": 422,
"param": "product_variant_id",
"request_id": "01992a65-e064-71ba-b38f-902b7966a6be",
"docs_url": "https://sell.app/docs/api/errors#validation-failed",
"errors": {
"product_variant_id": [
"The selected product variant id is invalid."
]
}
}{
"type": "rate_limit_error",
"code": "rate_limit_exceeded",
"message": "Too Many Attempts.",
"status": 429,
"param": null,
"request_id": "01992a65-e064-71ba-b38f-902b7966a6be",
"docs_url": "https://sell.app/docs/api/errors#rate-limit-exceeded"
}{
"type": "api_error",
"code": "api_error",
"message": "Server Error",
"status": 500,
"param": null,
"request_id": "01992a65-e064-71ba-b38f-902b7966a6be",
"docs_url": "https://sell.app/docs/api/errors#api-error"
}Provide your SellApp API key as a bearer token.
In: header
Path Parameters
The customer identifier.
Header Parameters
Store slug. Required for OAuth access tokens. API keys may omit it to use their current store, or the first accessible store when no current store is selected.
Response Body
application/json
application/json
application/json
application/json
application/json
application/json
application/json
application/json
application/json
application/json
curl -X GET "https://sell.app/api/v2/customers/42/entitlements" \ -H "X-STORE: launch-lab"{
"data": [
{
"id": "subscription_access:991",
"kind": "subscription_access",
"state": "active",
"customer_id": 314,
"subject": {
"type": "product_variant",
"id": 84,
"name": "Design kit — monthly"
}
}
]
}{
"type": "invalid_request_error",
"code": "bad_request",
"message": "The request could not be understood.",
"status": 400,
"param": null,
"request_id": "01992a65-e064-71ba-b38f-902b7966a6be",
"docs_url": "https://sell.app/docs/api/errors#bad-request"
}{
"type": "authentication_error",
"code": "unauthenticated",
"message": "Unauthenticated.",
"status": 401,
"param": null,
"request_id": "01992a65-e064-71ba-b38f-902b7966a6be",
"docs_url": "https://sell.app/docs/api/errors#unauthenticated"
}{
"type": "authorization_error",
"code": "forbidden",
"message": "This action is unauthorized.",
"status": 403,
"param": null,
"request_id": "01992a65-e064-71ba-b38f-902b7966a6be",
"docs_url": "https://sell.app/docs/api/errors#forbidden"
}{
"type": "not_found_error",
"code": "resource_not_found",
"message": "Not Found.",
"status": 404,
"param": null,
"request_id": "01992a65-e064-71ba-b38f-902b7966a6be",
"docs_url": "https://sell.app/docs/api/errors#resource-not-found"
}{
"type": "conflict_error",
"code": "conflict",
"message": "The resource state changed before this request.",
"status": 409,
"param": null,
"request_id": "01992a65-e064-71ba-b38f-902b7966a6be",
"docs_url": "https://sell.app/docs/api/errors#conflict"
}{
"type": "invalid_request_error",
"code": "cursor_expired",
"message": "This cursor has expired. Start again without a cursor.",
"status": 410,
"param": "cursor",
"request_id": "01992a65-e064-71ba-b38f-902b7966a6be",
"docs_url": "https://sell.app/docs/api/errors#cursor-expired"
}{
"type": "validation_error",
"code": "validation_failed",
"message": "The selected product variant id is invalid.",
"status": 422,
"param": "product_variant_id",
"request_id": "01992a65-e064-71ba-b38f-902b7966a6be",
"docs_url": "https://sell.app/docs/api/errors#validation-failed",
"errors": {
"product_variant_id": [
"The selected product variant id is invalid."
]
}
}{
"type": "rate_limit_error",
"code": "rate_limit_exceeded",
"message": "Too Many Attempts.",
"status": 429,
"param": null,
"request_id": "01992a65-e064-71ba-b38f-902b7966a6be",
"docs_url": "https://sell.app/docs/api/errors#rate-limit-exceeded"
}{
"type": "api_error",
"code": "api_error",
"message": "Server Error",
"status": 500,
"param": null,
"request_id": "01992a65-e064-71ba-b38f-902b7966a6be",
"docs_url": "https://sell.app/docs/api/errors#api-error"
}Provide your SellApp API key as a bearer token.
In: header
Path Parameters
The externalId identifier.
Header Parameters
Store slug. Required for OAuth access tokens. API keys may omit it to use their current store, or the first accessible store when no current store is selected.
Response Body
application/json
application/json
application/json
application/json
application/json
application/json
application/json
application/json
application/json
application/json
curl -X GET "https://sell.app/api/v2/customers/external/externalId_01K4CUSTOMER/entitlements" \ -H "X-STORE: launch-lab"{
"data": [
{
"id": "subscription_access:991",
"kind": "subscription_access",
"state": "active",
"customer_id": 314,
"subject": {
"type": "product_variant",
"id": 84,
"name": "Design kit — monthly"
}
}
]
}{
"type": "invalid_request_error",
"code": "bad_request",
"message": "The request could not be understood.",
"status": 400,
"param": null,
"request_id": "01992a65-e064-71ba-b38f-902b7966a6be",
"docs_url": "https://sell.app/docs/api/errors#bad-request"
}{
"type": "authentication_error",
"code": "unauthenticated",
"message": "Unauthenticated.",
"status": 401,
"param": null,
"request_id": "01992a65-e064-71ba-b38f-902b7966a6be",
"docs_url": "https://sell.app/docs/api/errors#unauthenticated"
}{
"type": "authorization_error",
"code": "forbidden",
"message": "This action is unauthorized.",
"status": 403,
"param": null,
"request_id": "01992a65-e064-71ba-b38f-902b7966a6be",
"docs_url": "https://sell.app/docs/api/errors#forbidden"
}{
"type": "not_found_error",
"code": "resource_not_found",
"message": "Not Found.",
"status": 404,
"param": null,
"request_id": "01992a65-e064-71ba-b38f-902b7966a6be",
"docs_url": "https://sell.app/docs/api/errors#resource-not-found"
}{
"type": "conflict_error",
"code": "conflict",
"message": "The resource state changed before this request.",
"status": 409,
"param": null,
"request_id": "01992a65-e064-71ba-b38f-902b7966a6be",
"docs_url": "https://sell.app/docs/api/errors#conflict"
}{
"type": "invalid_request_error",
"code": "cursor_expired",
"message": "This cursor has expired. Start again without a cursor.",
"status": 410,
"param": "cursor",
"request_id": "01992a65-e064-71ba-b38f-902b7966a6be",
"docs_url": "https://sell.app/docs/api/errors#cursor-expired"
}{
"type": "validation_error",
"code": "validation_failed",
"message": "The selected product variant id is invalid.",
"status": 422,
"param": "product_variant_id",
"request_id": "01992a65-e064-71ba-b38f-902b7966a6be",
"docs_url": "https://sell.app/docs/api/errors#validation-failed",
"errors": {
"product_variant_id": [
"The selected product variant id is invalid."
]
}
}{
"type": "rate_limit_error",
"code": "rate_limit_exceeded",
"message": "Too Many Attempts.",
"status": 429,
"param": null,
"request_id": "01992a65-e064-71ba-b38f-902b7966a6be",
"docs_url": "https://sell.app/docs/api/errors#rate-limit-exceeded"
}{
"type": "api_error",
"code": "api_error",
"message": "Server Error",
"status": 500,
"param": null,
"request_id": "01992a65-e064-71ba-b38f-902b7966a6be",
"docs_url": "https://sell.app/docs/api/errors#api-error"
}