Scopes Reference
Scopes determine what user data your application can access. Include them as a space-separated list in the scope parameter of your authorization request.
scope=openid+profile+email
Scope Summary
| Scope | Claims Returned | Use When |
|---|---|---|
openid | sub, human_guid | Always (required for OIDC) |
profile | name, given_name, family_name, middle_name, nickname, preferred_username, birthdate, picture, updated_at | Displaying user's name or avatar, or reading their date of birth |
email | email, email_verified | Sending emails or using email as identifier |
phone | phone_number, phone_number_verified | SMS notifications or phone verification |
address | address (object) | Shipping, billing, or location features |
offline_access | (none — issues a refresh token) | Long-lived sessions or background access |
Where the Claims Arrive
Granted claims are available in two places, and both honour the same consent:
- The ID token, decoded directly from the token endpoint response. No extra call.
- The UserInfo endpoint,
GET /oauth/userinfowith the access token.
sub, name, given_name, family_name, email and picture are always present in the ID token. The scope-gated claims — birthdate, phone_number, address — appear only when the matching scope was granted.
A scope your app is not allowed to hold is dropped, not rejected. Per RFC 6749 §3.3 the authorization server narrows the request to the scopes configured for your client and reports the narrowed set back in the token response. Asking for
phonewhen your app has not been granted it produces no error — just a missing claim. Check thescopevalue in the token response against what you asked for, and if a scope is missing, enable it under Scopes in your app settings.
openid
Required. This scope signals that the request is an OpenID Connect authentication request. Without it, the authorization server will not return an ID token.
Claims
| Claim | Type | Description | Example |
|---|---|---|---|
sub | string | Unique subject identifier | "a1b2c3d4-e5f6-7890-abcd-ef1234567890" |
human_guid | string | SingleSign unique user ID (same as sub) | "a1b2c3d4-e5f6-7890-abcd-ef1234567890" |
Example Response
{
"sub": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"human_guid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
}
When to Use
Always include openid. It is the minimum scope required for any SingleSign integration.
profile
Access to the user's basic profile information including their name, date of birth and avatar.
Claims
| Claim | Type | Description | Example |
|---|---|---|---|
name | string | Full name | "Jane Doe" |
given_name | string | First name | "Jane" |
family_name | string | Last name | "Doe" |
middle_name | string | Middle name | "Marie" |
nickname | string | Casual name | "janedoe" |
preferred_username | string | Preferred display name | "jane.doe" |
birthdate | string | Date of birth, YYYY-MM-DD | "1990-04-17" |
picture | string | URL to profile photo | "https://api.singlesign.com/avatars/jane.jpg" |
updated_at | number | Last profile update (Unix timestamp) | 1708099200 |
Example Response
{
"sub": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"human_guid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"name": "Jane Doe",
"given_name": "Jane",
"family_name": "Doe",
"middle_name": "Marie",
"nickname": "janedoe",
"preferred_username": "jane.doe",
"birthdate": "1990-04-17",
"picture": "https://api.singlesign.com/avatars/jane.jpg",
"updated_at": 1708099200
}
When to Use
- Personalizing the UI with the user's name.
- Displaying an avatar or profile picture.
- Pre-filling form fields.
- Reading the user's date of birth at sign-up (age gating, KYC intake). SingleSign requires a date of birth at registration and enforces a minimum age of 16, so
birthdateis present for anyone who signed up through the hosted flow.
Note: Not all claims may be present. If the user has not set a middle name or nickname, those fields will be absent from the response.
email
Access to the user's email address and verification status.
Claims
| Claim | Type | Description | Example |
|---|---|---|---|
email | string | Email address | "jane@example.com" |
email_verified | boolean | Whether the email has been verified by SingleSign | true |
Example Response
{
"sub": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"human_guid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"email": "jane@example.com",
"email_verified": true
}
When to Use
- Sending transactional emails (order confirmations, password resets).
- Using email as a secondary identifier or for account linking.
- Displaying the user's email in their profile.
Best practice: Always check
email_verifiedbefore trusting the email address. An unverified email may not belong to the user.
phone
Access to the user's phone number and verification status.
Claims
| Claim | Type | Description | Example |
|---|---|---|---|
phone_number | string | Phone number in E.164 format | "+15558675309" |
phone_number_verified | boolean | Always true — see the caveat below | true |
Example Response
{
"sub": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"human_guid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"phone_number": "+15558675309",
"phone_number_verified": true
}
When to Use
- Sending SMS notifications.
- Contact information for support or delivery.
- Pre-filling a phone field at sign-up instead of asking for it twice.
phone_number_verifiedis not yet meaningful. SingleSign does not currently verify phone numbers — the number is captured at sign-up and never confirmed by OTP, and the claim is hard-coded totrue. Treatphone_numberas self-reported contact information. Do not use it as a possession factor for two-factor authentication or as KYC evidence until real verification exists.
The phone number is optional at sign-up. Unlike a date of birth, it is not a required registration field, so
phone_numbermay be absent for a legitimately registered user. Handle the missing case rather than assuming it is always present.
address
Access to the user's mailing address as a structured object.
Claims
| Claim | Type | Description | Example |
|---|---|---|---|
address | object | Structured address | (see below) |
address.formatted | string | Full address as a single string | "123 Main St\nAnytown, CA 90210\nUS" |
address.street_address | string | Street address (may include apt/suite) | "123 Main St" |
address.locality | string | City | "Anytown" |
address.region | string | State/province | "CA" |
address.postal_code | string | ZIP / postal code | "90210" |
address.country | string | Country code (ISO 3166-1 alpha-2) | "US" |
Example Response
{
"sub": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"human_guid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"address": {
"formatted": "123 Main St\nAnytown, CA 90210\nUS",
"street_address": "123 Main St",
"locality": "Anytown",
"region": "CA",
"postal_code": "90210",
"country": "US"
}
}
When to Use
- Shipping address for e-commerce.
- Billing address for payments.
- Location-based services.
offline_access
Requests a refresh token so your application can obtain new access tokens without requiring the user to re-authenticate.
Claims
This scope does not add claims to the UserInfo response. Instead, it includes a refresh_token in the token endpoint response.
Token Response with offline_access
{
"access_token": "eyJhbGciOiJIUzUxMiIs...",
"id_token": "eyJhbGciOiJIUzUxMiIs...",
"token_type": "Bearer",
"expires_in": 3600,
"refresh_token": "rt_xxxxxxxxxxxxxxxxxxxxxxxx",
"scope": "openid profile email offline_access"
}
When to Use
- Background sync or data access when the user is away.
- Long-lived sessions where you don't want users to re-authenticate frequently.
- Server-side applications that need ongoing API access.
Important: Refresh tokens are sensitive credentials. Store them securely — in a server-side session, the platform keychain (mobile), or an encrypted store. Never expose them in client-side JavaScript unless absolutely necessary.
Combining Scopes
Request multiple scopes by separating them with spaces (or + in URL encoding):
scope=openid+profile+email+offline_access
The claims from all granted scopes are merged in the UserInfo response:
{
"sub": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"human_guid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"name": "Jane Doe",
"given_name": "Jane",
"family_name": "Doe",
"email": "jane@example.com",
"email_verified": true
}
Next Steps
- Scopes & Consent Guide — Best practices for requesting scopes.
- Tokens & Claims — How claims appear in JWTs.
- Endpoint Reference — Full API documentation.
Last updated: 2026-02-16
Related docs
- SingleSign Developer DocumentationLearn how to integrate SingleSign identity and authentication into your applications using OAuth 2.0 and OpenID Connect.
- the Scopes & Consent docsHow to request scopes, what data each scope grants, the consent UI, and the principle of least privilege.
- free identity providerSingleSign pricing in one line: sign-in is free, with no monthly-active-user meter. See exactly what is included, and what SingleSign Mail costs for businesses.
- Identity provider alternativesIdentity provider alternatives, by the provider you are leaving: what actually has to change in your code, and what does not.
- Auth0 comparisonSingleSign vs Auth0 compared on the difference that matters: who owns the account. A side-by-side table, then the three cases where each one is the right call.
- Okta comparisonSingleSign vs Okta: Okta is built for workforce identity inside a company, SingleSign for consumer sign-in across applications.
- SingleSign vs Firebase AuthenticationSingleSign vs Firebase Authentication on lock-in, portability and consent, plus the cases where staying on Firebase is right.
- Google Sign-In alternativeSingleSign vs Google Sign-In: the same one-tap convenience, without an advertising business behind the identity.