Skip to content
Hardcount
Run it locally
Pre-1.0 · one maintainer · Stripe and cards only · no SDKs (client libraries) yet · no production users yet. Docs describe v0.9.1 (29 Oct 2026) · What’s new →

Get customer

GET
/v1/customers/{id}
curl --request GET \
--url http://localhost:8080/v1/customers/example \
--header 'Authorization: Bearer <token>'
id
required
string

The customer.

Media typeapplication/json
object
id
required
string
external_id
required
string
display_name
required
string
email
string
additional_emails

CC’d on billing documents and billing-state emails (invoice, receipt, dunning, payment failed, credit note) — never on credential-bearing emails (setup links, resets, invites). Normalized to lowercase bare addresses, deduped, capped at 10, never equal to the primary email. Stored encrypted at rest.

Array<string>
<= 10 items
status
required
string
Allowed values: active archived
created_at
required
string format: date-time
test_clock_id

Test clock this customer is pinned to (test mode only). When set, the customer — and any invoices/subscriptions created for it — run on the clock’s simulated time. Empty for live customers. The dashboard reads it to show the “test clock” badge + simulated-time banner on the customer and its invoices.

string
tenant_id
string
email_status

Deliverability of email, learned from bounce and complaint reports.

string
Allowed values: unknown ok bounced complained
email_last_bounced_at
string format: date-time
email_bounce_reason
string
dunning_policy_id

Assigned dunning policy; absent means the tenant default.

string
stripe_customer_id

The Stripe customer. Absent until the first payment-method action.

string
livemode
boolean
updated_at
required
string format: date-time

Example

{
"id": "hc_cus_42014438d82ddf33",
"status": "active",
"email_status": "unknown"
}

No customer with this ID in this tenant and mode.

Media typeapplication/json
object
error
object
type

One of invalid_request_error, authentication_error, rate_limit_error or api_error. Every error the API answers has this shape, including an unknown path (404, code route_not_found) and a method the path does not take (405, code method_not_allowed, with an Allow header). The few exceptions are listed in docs/api-surface.md.

string
code
string
message
string
request_id
string
param

The request field the error is about. Sent only when the error names one. A request body may hold only the fields its operation lists, spelled and cased as listed: any other field, or one the server sets (such as id), is refused with 422 and param naming it. An operation with no request body lists no fields: send no body, {} or null. The Stripe and Postmark webhooks and the LiteLLM callback take their sender’s body as it comes.

string

Example

{
"error": {
"type": "invalid_request_error"
}
}