Skip to content
Linra Omni Developer Docs

Getting started

From a credential to your first authenticated API call in about five minutes.

New to Linra Omni? Platform overview covers the multi-product framing (Scent is the first product) and the platform-wide contracts (versioning, envelope, pagination) before you write any code — worth a skim first if you want the bigger picture, but not required to follow the steps below.

Before you can generate anything, you need a dashboard login. This is a one-time, human step, not an API call:

  1. A Linra admin invites you as a user on your partner account. You receive an activation email with a single-use link.
  2. You open the link, activate your account, and set your own password. You’re now signed in to the Linra Omni Portal dashboard at https://omni-portal.linra.net — one address for both staging and production; you pick the environment with the Environment selector in the dashboard’s top bar.
  3. In the sidebar, open Partners & Vendors → My Account → API Credentials. There you self-generate your own API credential — no further Linra involvement needed (e.g. one for staging, one for production).

If you haven’t received an invitation yet, ask your Linra account contact to send one.

API credentials are issued and managed entirely through the Linra Omni Portal dashboard — the partner API itself never creates, lists, or rotates credentials (see Credentials for why). Once you’re signed in at https://omni-portal.linra.net (see step 0 above), choose the environment you want to integrate against in the Environment selector (Staging first, always), open Partners & Vendors → My Account → API Credentials, and select Generate.

Generating a credential shows you the secret exactly once:

Client ID: live_9f8c2a1b4e6d4a7c9b0e3f2d1c8a5b6e
Client Secret: •••••••••••••••••••••••••••••••••••••••••••••• (shown once — copy it now)
Environment: Staging

Store both values in your own secret manager immediately. If you lose the secret, generate a new credential and deactivate the old one — there is no “reveal secret” endpoint, by design.

2. Exchange the credential for an access token

Section titled “2. Exchange the credential for an access token”
Terminal window
curl -X POST https://api-omni-stg.linra.net/api/v1/auth/token \
-H "Content-Type: application/json" \
-d '{
"clientId": "live_9f8c2a1b4e6d4a7c9b0e3f2d1c8a5b6e",
"clientSecret": "your-secret-here"
}'
{
"state": "SUCCESS",
"payload": {
"accessToken": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...",
"tokenType": "Bearer",
"expiresIn": 300
}
}

The token is valid for 5 minutes — exactly: an expired token is rejected within at most 30 seconds of clock skew (see Authentication & tokens for why, and for the caching pattern you should build around this from day one). The token’s signed env claim is bound to the credential’s own environment — a staging credential can never mint a token that works against production, and vice versa (see Environments).

Every other /api/v1 request carries the token as a bearer credential:

Terminal window
curl https://api-omni-stg.linra.net/api/v1/scent/scents?pageSize=5 \
-H "Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9..."
{
"state": "SUCCESS",
"payload": {
"items": [
{ "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "brandId": "9b2d...", "name": "Example Scent", "info": { "productType": "Perfume", "concentration": "Edp", "audience": "Unisex" }, "...": "..." }
],
"pagination": { "page": 1, "pageSize": 5, "totalCount": 1, "totalPages": 1 }
}
}

Prefer to explore the API in Postman before writing any code? Download the collection and environment below, import both into Postman, fill in your clientId/clientSecret in the environment, run the Get access token request, then call any other request in the collection.