---
title: "Log in an end customer to a product"
method: POST
path: "/v1/customer-identity/login"
tags: ["Customer sign-in"]
---

# Log in an end customer to a product

`POST /v1/customer-identity/login`

## Request

- Base URL: `https://hyperscale0.ai`
- URL: `https://hyperscale0.ai/v1/customer-identity/login`
- Auth: none required

Verifies an end customer's password against the company's own customer credentials and mints a session bound to the named Product. The lookup is by email within the company, so the same address at two companies is two unrelated customers by design. A customer with no enrollment in that Product cannot sign in to it, and a suspended or closed enrollment is refused; a pending one succeeds, because completing verification is something the customer does while signed in. The session token is a one-time secret surfaced only in this response, never in receipts or replays.

## Headers

- `X-Hyperscale-Environment` 'sandbox' | 'live'
- `Idempotency-Key` string, required

## Request body

- object
  - `productId` string, required: The Product to sign in to. One credential spans the company; each session is minted for exactly one of its Products.
  - `email` string, email, required
  - `password` string, required

## Response `200`

Success

- CustomerLoginOutput
  - `tenantId` string, required: Organization tenant ID
  - `productId` string, required: Hyperscale product ID
  - `environment` 'sandbox' | 'live', required
  - `customerId` string, required: Tenant-local customer ID
  - `entityId` string, required: Hyperscale entity ID
  - `email` string, email, required
  - `customerAccessId` string, required: Hyperscale customer access ID
  - `customerAccessStatus` 'pending' | 'active' | 'suspended' | 'closed', required: The Product enrollment this session was minted against. Signing in is allowed while enrollment is pending so the customer can complete verification; the Product's own actions stay refused until it is active.
  - `customerSessionId` string, required: Hyperscale end-customer session ID
  - `sessionToken` string: One-time session token surfaced only in the first response; receipts and replays omit it
  - `sessionExpiresAt` string, date-time, required

## Other responses

- `default`: ErrorResponse. See x-error-codes and x-errors for codes, HTTP statuses and retry guidance.

---

[API](https://skmtc.dev/hyperscale0/apis/hyperscale-product-api.md) · [All operations](https://skmtc.dev/hyperscale0/apis/hyperscale-product-api/llms.txt) · [OpenAPI document](https://skmtc.dev/hyperscale0/apis/hyperscale-product-api/revisions/e9e8faa044d5?raw)
