Skip to main content

Lookup Subscriptions

GET/subscriptions/lookup
Returns the subscriptions a given end user has with your store, filtered to the ones that currently grant access (status active or trialing) by default. This is the hot-path endpoint for SaaS paywalls — the typical integration asks “does this user have an active subscription?” on every protected request. The response includes a convenience has_active boolean so you can gate access with a single field check.

Authentication

Headers

Rate Limit

This endpoint is throttled to 120 requests per minute per API token — higher than the rest of the subscription endpoints because it is intended to be called on every paywalled request. If you expect higher volume, cache results briefly on your side (e.g. 60 seconds per user).

Query Parameters

You must provide at least one of the following user identifiers:
  • external_customer_id, or
  • email, or
  • phone (together with country_code).
If none of these are supplied the request is rejected with a 422.
The lookup is always scoped to your store — you will never see subscriptions that belong to another merchant, even if the same customer email exists across stores.

Example Requests

Paywall check by external ID (most common)

Lookup by email, restricted to a specific product

Lookup by phone, including historical subscriptions

Success Response

Response Fields

Empty result

When no subscription matches, the endpoint still returns 200 OK with an empty array — there is no 404:

Common Integration Pattern

A minimal SaaS paywall middleware:
Pass external_customer_id when you create the checkout session (see Create Checkout Session). That ID is stored on the subscription itself, so the lookup is a direct indexed read instead of a customers table join.

Error Responses

Example 422 — no identifier supplied

Example 422 — invalid parameter