Quickstart: First API Call
This guide gets you to a successful API call in under 10 minutes.
Quickstart: First API Call
This guide gets you to a successful API call in under 10 minutes.
Prerequisites
- A tenant ID and service account credentials
curlandjqinstalled
Step 1: Get an access token
export SERVICE_ID="your-service-id"
export SERVICE_SECRET="your-service-secret"
ACCESS_TOKEN=$(curl -sS -X POST \
-H "Authorization: Bearer $SERVICE_SECRET" \
-H "Content-Type: application/json" \
-d "{\"serviceId\": \"$SERVICE_ID\", \"audience\": \"internal-service\"}" \
https://api.qnsp.cuilabs.io/auth/service-token \
| jq -r '.accessToken')
echo $ACCESS_TOKEN
Step 2: Make an authenticated request
export TENANT_ID="your-tenant-uuid"
curl -sS \
-H "Authorization: Bearer $ACCESS_TOKEN" \
"https://api.qnsp.cuilabs.io/proxy/kms/v1/keys?tenantId=$TENANT_ID" \
| jq
Step 3: Check health endpoints
Health endpoints are public and bypass bot protection for GET/HEAD requests:
# Check all services health
curl -sS https://api.qnsp.cuilabs.io/proxy/health | jq
# Check specific service health
curl -sS https://api.qnsp.cuilabs.io/proxy/platform/health | jq
curl -sS https://api.qnsp.cuilabs.io/proxy/billing/health | jq
The /proxy/health endpoint returns the health status of all services:
{
"status": "healthy",
"services": {
"platform-api": {"status": "healthy", "latencyMs": 3},
"auth-service": {"status": "healthy", "latencyMs": 5},
...
}
}
Common pitfalls
- Missing tenant: Returns
400 BAD_REQUEST— includetenantIdquery parameter - Expired token: Returns
401 UNAUTHORIZED— request a new token and retry - Wrong audience: Returns
403 FORBIDDEN— check token audience matches endpoint requirements