POST
/
auth
/
token
curl --request POST \
  --url http://playground.finhub.cloud:8080/api/v2/auth/token \
  --header 'Content-Type: application/json' \
  --data '{
  "username": "user@example.com",
  "password": "Password123!"
}'
{
  "code": 200,
  "message": "Success",
  "data": {
    "userSessionToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
    "expiresIn": 3600,
    "tokenType": "Bearer",
    "userId": "user-123",
    "customerId": "cust-456",
    "tenantId": "tenant-789"
  }
}

Integration Environment Authentication

This guide explains how to authenticate with the FinHub API in the Integration environment, which uses production-equivalent OAuth2 flows.

Overview

The Integration environment implements the full OAuth2 authentication flow with enhanced security requirements to prepare you for production deployment. This includes certificate validation, stricter token handling, and more comprehensive error responses.

Environment Differences

Integration Environment vs. Playground:

  • Unlike the Playground environment, client credentials (customerId and customerSecret) are pre-configured during onboarding
  • These credentials are not sent in API requests but are securely stored and configured in the Sandbox Backend
  • Authentication uses standard username/password flow similar to production
  • The Integration environment is designed to closely mirror the production security model

Prerequisites

Before you can authenticate with the FinHub Integration APIs, you need:

  1. An integration tenant account with FinHub
  2. Integration environment credentials (username and password)
  3. Client ID and client secret for your integration tenant
  4. X-Tenant-ID header value for multi-tenant operations
  5. Client certificates for mutual TLS authentication (if required)

Authentication Process

Step 1: Request Authentication

To authenticate in the integration environment, make a POST request to the integration token endpoint:

POST /api/v2/auth/token HTTP/1.1
Host: integration.finhub.cloud
Content-Type: application/json
sec-ch-ua-platform: Windows
X-Forwarded-For: 127.0.0.1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)
X-Tenant-ID: 1234567

{
  "username": "integration_user",
  "password": "integration_password",
  "accountType": "b2b",
  "grantType": "password"
}

Note: Unlike the Playground environment, client credentials (customerId and customerSecret) are not included in the request body as they are pre-configured during onboarding.

Request Headers

HeaderDescriptionRequiredExample
Content-TypeMedia type of the request bodyYesapplication/json
sec-ch-ua-platformClient platform informationYesWindows
X-Forwarded-ForClient IP addressYes127.0.0.1
User-AgentClient user agent informationYesMozilla/5.0 (Windows NT 10.0; Win64; x64)
X-Tenant-IDTenant identifier for multi-tenant operationsYes1234567

Request Body Parameters

ParameterDescriptionRequiredSource
usernameIntegration usernameYesProvided in integration onboarding
passwordIntegration passwordYesProvided in integration onboarding
accountTypeType of account (b2b or b2c)YesBased on your integration type
grantTypeOAuth2 grant type (password, client_credentials, etc.)YesBased on your integration flow

Important: Client credentials (customerId and customerSecret) are securely configured during the integration onboarding process and are not included in API requests. These credentials are only shared with authorized company representatives and are used internally by the Sandbox Backend to authenticate with the API Gateway.

Step 2: Receive the Authentication Response

If the credentials are valid, the authorization server will respond with authentication information:

{
  "expires_in": 3600,
  "token_type": "Bearer",
  "scope": "01f0418c-36da-17a0-830a-aca6bf25e007",
  "customerId": "12345678-abcd-1234-efgh-1234567890ab",
  "tenantId": "1234567",
  "userSessionToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
}

Response Parameters

ParameterDescriptionUsage
expires_inToken expiration time in secondsUse to determine when to refresh authentication
token_typeType of token (always “Bearer”)Required for Authorization header format
scopeScope of access grantedIdentifies the permissions granted
customerIdUnique identifier for the customerReference in customer-related operations
tenantIdIdentifier for the tenantUsed for multi-tenant operations
userSessionTokenJWT token for user session validationUsed for session validation and contains user identity claims

Note: The JWT token (userSessionToken) contains an internal cache key that the Sandbox Backend uses to retrieve and cache the actual Bearer token for API Gateway requests. This internal mechanism is transparent to clients and ensures that access tokens are never exposed directly. In the Integration environment, this key is linked to the pre-configured client credentials established during onboarding.

Step 3: Use the Session Token for API Requests

Include the required headers in all subsequent API requests. The Sandbox Backend or integration environment will handle authentication internally using your session token:

GET /api/v2/some-endpoint HTTP/1.1
Host: integration.finhub.cloud
Content-Type: application/json
X-Tenant-ID: 1234567
X-Activity-ID: 550e8400-e29b-41d4-a716-446655440000
X-Session-Active: true
X-User-Session-Token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...

Important Note: When you authenticate, the system generates an access token internally that is used to access backend services. This token has an expiration time specified by the expires_in parameter. If your API requests start receiving 401 Unauthorized errors with a message indicating that the access token has expired, you will need to authenticate again to obtain a new token. The access token is managed by the system and is not directly exposed to clients for security reasons.

Token Refresh

In the Integration environment, you can refresh an existing token without requiring the user to re-enter credentials. The process requires authentication with the current token and uses the internal token key extracted from the JWT token:

POST /api/v2/auth/token/refresh HTTP/1.1
Host: integration.finhub.cloud
Content-Type: application/json
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
X-Tenant-ID: 1234567
X-Session-Active: true
X-User-Session-Token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...

{
  "userSessionToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
  "internalTokenKey": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
}

Note: The internalTokenKey is extracted from the claims in the JWT token (userSessionToken). This key is used by the Sandbox Backend to identify and refresh the associated access token without requiring client credentials to be sent in the request. If the token has more than 10% of its validity time remaining, it will not be refreshed and the current validity will be provided in the response.

Security: Token refresh requires authentication with a valid session token. The user in the authenticated session must match the user associated with the token being refreshed.

Code Examples

    Security Considerations

    Certificate Validation

    In the Integration environment, server certificate validation is mandatory. Your client must validate the server’s SSL certificate against trusted certificate authorities.

    IP Restrictions

    The Integration environment may have IP restrictions. Ensure your client’s IP address is whitelisted for access.

    Token Security

    Store tokens securely and never expose them in client-side code or logs. Use secure storage mechanisms appropriate for your platform.

    Differences from Playground

    FeaturePlaygroundIntegration
    Token ExpirationLonger (10000s)Standard (3600s)
    Grant TypesLimitedFull OAuth2 support
    Error ResponsesBasicDetailed with error codes
    Certificate ValidationOptionalRequired
    Token RefreshNot supportedSupported

    Moving to Production

    When you’re ready to move from the Integration to the Production environment, you’ll need to implement additional security measures. See the Production Authentication guide for details.

    Playground Reference

    For simplified testing and experimentation, you can always return to the Playground Authentication guide.

    Troubleshooting

    Common Authentication Errors

    Error CodeDescriptionSolution
    401 UnauthorizedInvalid credentialsVerify username, password, client ID, and client secret
    403 ForbiddenInsufficient permissionsVerify tenant ID and account permissions
    429 Too Many RequestsRate limit exceededReduce authentication frequency
    400 Bad RequestInvalid request formatCheck request format and parameters
    500 Internal Server ErrorServer-side errorContact support with error details

    If you encounter persistent authentication issues, contact FinHub Integration Support with your tenant ID and detailed error information.

    Headers

    sec-ch-ua-platform
    string

    Client platform information

    Example:

    "Windows"

    X-Forwarded-For
    string

    Client IP address

    Example:

    "192.168.1.1"

    Body

    application/json

    User credentials

    The body is of type object.

    Response

    200
    application/json

    Authentication successful

    The response is of type object.