API Documentation
The IntLiq API provides programmatic access to tokenised real world asset liquidity intelligence. 15 endpoints covering protocols, scores, market data, watchlists, webhooks, and data export. Methodology v1.7-MMI with anti-manipulation detection.
Authentication
All API endpoints require authentication via a Bearer token in the Authorization header. API keys use the ilq_ prefix and are SHA-256 hashed at rest.
Authorization: Bearer ilq_XXXXXXXXXXXXXXXXGenerate keys from your dashboard or via POST /api/v1/user/keys. Each user may hold up to 5 active keys.
Keys can be rotated via POST /api/v1/user/keys/rotate with a 24-hour grace period where both old and new keys are valid.
Key rotation is enforced by plan: Analyst every 90 days, Professional every 180 days, Institutional every 365 days.
Base URL
https://intliq.comRate Limits
API access is subject to both per-minute and monthly limits based on your plan. Exceeding either returns 429 with a Retry-After header.
| Plan | Monthly Quota | Per Minute | Notes |
|---|---|---|---|
| Observer | 0 | 0 | No API access |
| Analyst | 2,000 | 60 | Score history, backtesting |
| Professional | 10,000 | 200 | Export, custom profiles, webhooks |
| Institutional | Unlimited | Unlimited | Dedicated infrastructure, SLA |
Error Response Format
All errors follow a consistent JSON structure with a machine-readable code and human-readable message.
{
"error": {
"code": "UNAUTHORIZED",
"message": "Missing or invalid API key",
"requestId": "req_a1b2c3d4"
}
}Plan-gated endpoints include an upgradeUrl field when the user's plan is insufficient.
Endpoints
/api/v1/protocolsReturns a paginated list of all tracked RWA protocols with current scores.
Parameters
| Parameter | Type | Description |
|---|---|---|
| category | string | Filter by category (treasury, private_credit, real_estate, commodity, infrastructure) |
| tier | string | Filter by liquidity tier (L1, L2, L3, ILLIQUID) |
| min_score | number | Minimum IntLiq score (0-100) |
| min_aum | number | Minimum AUM in USD |
| limit | number | Protocols per page (default: 20, max: 100) |
| offset | number | Pagination offset (default: 0) |
Example Request
curl -X GET "https://intliq.com/api/v1/protocols?category=treasury&limit=5" \ -H "Authorization: Bearer ilq_YOUR_API_KEY"
Example Response
{
"protocols": [
{
"slug": "ondo-usdy",
"name": "Ondo US Dollar Yield",
"category": "treasury",
"aum_usd": 450200000,
"liquidity_score": 82,
"liquidity_tier": "L1"
}
],
"total": 24,
"page": 1,
"limit": 5
}/api/v1/protocols/:slugReturns full details for a specific protocol by slug, including issuer, jurisdiction, yield, and chain data.
Example Request
curl -X GET "https://intliq.com/api/v1/protocols/ondo-usdy" \ -H "Authorization: Bearer ilq_YOUR_API_KEY"
Example Response
{
"slug": "ondo-usdy",
"name": "Ondo US Dollar Yield",
"category": "treasury",
"issuer": "Ondo Finance",
"blockchain": "Ethereum, Solana, Mantle",
"jurisdiction": "US",
"aum_usd": 450200000,
"yield_pct": 5.10,
"liquidity_score": 82,
"liquidity_tier": "L1",
"redemption_frequency": "daily",
"holder_count": 12400,
"last_updated": "2026-03-22T06:00:00Z"
}/api/v1/scoresReturns all current liquidity scores with full component breakdown and methodology version.
Example Request
curl -X GET "https://intliq.com/api/v1/scores" \ -H "Authorization: Bearer ilq_YOUR_API_KEY"
Example Response
{
"scores": [
{
"protocol_id": "uuid",
"score": 95,
"tier": "L1",
"aum_score": 80,
"redemption_score": 100,
"secondary_volume_score": 100,
"issuer_score": 100,
"jurisdiction_score": 100,
"protocol": { "slug": "blackrock-buidl", "name": "BlackRock BUIDL" }
}
],
"methodologyVersion": "v1.7-MMI"
}/api/v1/scores/:slugReturns full score breakdown for a specific protocol including anti-manipulation penalties.
Example Request
curl -X GET "https://intliq.com/api/v1/scores/ondo-usdy" \ -H "Authorization: Bearer ilq_YOUR_API_KEY"
Example Response
{
"protocol": "Ondo US Dollar Yield",
"slug": "ondo-usdy",
"score": 82,
"tier": "L1",
"aum_score": 80,
"redemption_score": 100,
"secondary_volume_score": 100,
"issuer_score": 60,
"jurisdiction_score": 100,
"nav_divergence_penalty": 0,
"sybil_penalty": 0,
"staleness_penalty": 0,
"data_confidence": 0.95,
"methodology_version": "v1.7-MMI"
}/api/v1/scores/:slug/historyAnalyst+Returns historical score data with trajectory analysis (IMPROVING, STABLE, DECLINING).
Parameters
| Parameter | Type | Description |
|---|---|---|
| limit | number | Number of data points to return (default: 30, max: 365) |
| interval | string | Bucketing interval: day, week, or month (default: day) |
Example Request
curl -X GET "https://intliq.com/api/v1/scores/ondo-usdy/history?limit=7&interval=day" \ -H "Authorization: Bearer ilq_YOUR_API_KEY"
Example Response
{
"protocol": { "slug": "ondo-usdy", "name": "Ondo US Dollar Yield" },
"scores": [
{ "score": 82, "tier": "L1", "computed_at": "2026-03-22T06:00:00Z", "methodology_version": "v1.7-MMI" },
{ "score": 80, "tier": "L1", "computed_at": "2026-03-21T06:00:00Z", "methodology_version": "v1.7-MMI" },
{ "score": 79, "tier": "L1", "computed_at": "2026-03-20T06:00:00Z", "methodology_version": "v1.7-MMI" }
],
"trajectory": "IMPROVING",
"methodologyVersion": "v1.7-MMI"
}/api/v1/marketReturns aggregated market overview: total AUM, average score, protocol count, and distribution by tier and category.
Example Request
curl -X GET "https://intliq.com/api/v1/market" \ -H "Authorization: Bearer ilq_YOUR_API_KEY"
Example Response
{
"totalAumUsd": 1571500000,
"averageLiquidityScore": 68,
"totalProtocols": 24,
"tiers": { "L1": 8, "L2": 9, "L3": 5, "ILLIQUID": 2 },
"categories": { "treasury": 12, "private_credit": 6, "real_estate": 3, "commodity": 2, "infrastructure": 1 }
}/api/v1/watchlistReturns the authenticated user's watchlist with current protocol data and alert configuration.
Example Request
curl -X GET "https://intliq.com/api/v1/watchlist" \ -H "Authorization: Bearer ilq_YOUR_API_KEY"
Example Response
{
"watchlist": [
{
"id": "uuid",
"protocol": {
"slug": "ondo-usdy",
"name": "Ondo US Dollar Yield",
"liquidity_score": 82,
"liquidity_tier": "L1"
},
"alert_on_score_change": true,
"alert_threshold": 10
}
]
}/api/v1/watchlistAdd a protocol to the authenticated user's watchlist with default alert settings.
Parameters
| Parameter | Type | Description |
|---|---|---|
| protocolSlug | string | The slug of the protocol to watch (required, in request body) |
Example Request
curl -X POST "https://intliq.com/api/v1/watchlist" \
-H "Authorization: Bearer ilq_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"protocolSlug": "ondo-usdy"}'Example Response
{
"id": "uuid",
"user_id": "uuid",
"protocol_id": "uuid",
"alert_on_score_change": true,
"alert_on_tier_change": true,
"alert_threshold": 10
}/api/v1/watchlist/:slugRemove a protocol from the watchlist by its slug.
Example Request
curl -X DELETE "https://intliq.com/api/v1/watchlist/ondo-usdy" \ -H "Authorization: Bearer ilq_YOUR_API_KEY"
Example Response
{ "success": true }/api/v1/usageReturns current API usage counters and plan limits for the authenticated user.
Example Request
curl -X GET "https://intliq.com/api/v1/usage" \ -H "Authorization: Bearer ilq_YOUR_API_KEY"
Example Response
{
"plan": "analyst",
"apiCallsUsed": 142,
"apiCallsLimit": 2000,
"reportsGenerated": 5,
"reportsLimit": 25,
"resetAt": "2026-04-22T00:00:00Z"
}/api/v1/usage/statsAnalyst+Returns granular usage time-series data for resource consumption analytics.
Parameters
| Parameter | Type | Description |
|---|---|---|
| interval | string | Aggregation interval: day, week, or month (default: day) |
| days | number | Lookback period in days (default: 30, max: 365) |
Example Request
curl -X GET "https://intliq.com/api/v1/usage/stats?interval=week&days=30" \ -H "Authorization: Bearer ilq_YOUR_API_KEY"
Example Response
{
"userId": "uuid",
"interval": "week",
"stats": [
{ "period": "2026-W12", "api_calls": 48, "reports": 3 },
{ "period": "2026-W11", "api_calls": 62, "reports": 5 }
]
}/api/v1/user/keysGenerate a new API key. Keys are SHA-256 hashed at rest; the raw key is returned once and cannot be retrieved again. Maximum 5 active keys per user.
Example Request
curl -X POST "https://intliq.com/api/v1/user/keys" \ -H "Authorization: Bearer SESSION_TOKEN"
Example Response
{
"apiKey": "ilq_a1b2c3d4e5f6g7h8i9j0",
"keyId": "uuid"
}/api/v1/user/keys/rotateRotate an existing API key. Creates a new key and schedules the old key for deactivation after a 24-hour grace period.
Parameters
| Parameter | Type | Description |
|---|---|---|
| keyId | string | UUID of the key to rotate (required, in request body) |
Example Request
curl -X POST "https://intliq.com/api/v1/user/keys/rotate" \
-H "Authorization: Bearer SESSION_TOKEN" \
-H "Content-Type: application/json" \
-d '{"keyId": "uuid"}'Example Response
{
"apiKey": "ilq_k1l2m3n4o5p6q7r8s9t0",
"keyId": "uuid",
"gracePeriodEnds": "2026-03-25T14:00:00Z"
}/api/v1/scoring-profilesProfessional+List all custom scoring profiles for the authenticated user. Custom weights allow institutional clients to tune scoring to their risk framework.
Example Request
curl -X GET "https://intliq.com/api/v1/scoring-profiles" \ -H "Authorization: Bearer ilq_YOUR_API_KEY"
Example Response
{
"profiles": [
{
"id": "uuid",
"name": "Conservative Treasury",
"weights": { "aum": 0.40, "redemption": 0.25, "secondaryVolume": 0.10, "issuer": 0.15, "jurisdiction": 0.10 },
"penalty_caps": { "maxTotalPenalty": 70, "maxNavPenalty": 30, "maxSybilPenalty": 60, "maxStalenessPenalty": 50, "maxWashTradePenalty": 40 },
"is_default": false,
"created_at": "2026-03-10T12:00:00Z",
"updated_at": "2026-03-10T12:00:00Z"
}
]
}/api/v1/scoring-profilesProfessional+Create a custom scoring profile. Weights must sum to 1.0 (within 0.01 tolerance). Professional plan allows 3 profiles; Institutional allows 10.
Parameters
| Parameter | Type | Description |
|---|---|---|
| name | string | Profile name (required, max 100 chars) |
| weights | object | Scoring weights: { aum, redemption, secondaryVolume, issuer, jurisdiction } — must sum to 1.0 |
| penaltyCaps | object | Optional penalty caps: { maxTotalPenalty, maxNavPenalty, maxSybilPenalty, maxStalenessPenalty, maxWashTradePenalty } |
Example Request
curl -X POST "https://intliq.com/api/v1/scoring-profiles" \
-H "Authorization: Bearer ilq_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Conservative Treasury",
"weights": {
"aum": 0.40,
"redemption": 0.25,
"secondaryVolume": 0.10,
"issuer": 0.15,
"jurisdiction": 0.10
}
}'Example Response
{
"profile": {
"id": "uuid",
"name": "Conservative Treasury",
"weights": { "aum": 0.40, "redemption": 0.25, "secondaryVolume": 0.10, "issuer": 0.15, "jurisdiction": 0.10 },
"penalty_caps": { "maxTotalPenalty": 70, "maxNavPenalty": 30, "maxSybilPenalty": 60, "maxStalenessPenalty": 50, "maxWashTradePenalty": 40 },
"is_default": false,
"created_at": "2026-03-24T10:00:00Z",
"updated_at": "2026-03-24T10:00:00Z"
}
}/api/v1/exportProfessional+Export protocol data as CSV or JSON. Returns all tracked protocols with scores, yields, and metadata. Maximum 1,000 rows per request.
Parameters
| Parameter | Type | Description |
|---|---|---|
| format | string | Export format: csv or json (default: json) |
| category | string | Filter by category (optional) |
| tier | string | Filter by liquidity tier (optional) |
Example Request
curl -X GET "https://intliq.com/api/v1/export?format=json&category=treasury" \ -H "Authorization: Bearer ilq_YOUR_API_KEY"
Example Response
{
"exportedAt": "2026-03-24T12:00:00Z",
"count": 12,
"protocols": [
{
"slug": "blackrock-buidl",
"name": "BlackRock BUIDL",
"category": "treasury",
"issuer": "BlackRock",
"aum_usd": 521000000,
"yield_pct": 5.25,
"liquidity_score": 95,
"liquidity_tier": "L1",
"redemption_frequency": "daily",
"jurisdiction": "US",
"last_updated": "2026-03-24T06:00:00Z"
}
]
}/api/v1/webhooksProfessional+List all configured webhooks for the authenticated user.
Example Request
curl -X GET "https://intliq.com/api/v1/webhooks" \ -H "Authorization: Bearer ilq_YOUR_API_KEY"
Example Response
{
"webhooks": [
{
"id": "uuid",
"name": "Score Monitor",
"url": "https://example.com/hooks/intliq",
"events": ["score_change", "tier_change"],
"active": true,
"last_triggered_at": "2026-03-23T14:30:00Z",
"failure_count": 0,
"created_at": "2026-03-01T09:00:00Z"
}
]
}/api/v1/webhooksProfessional+Register a new webhook endpoint. The webhook secret is returned once and cannot be retrieved again. URL must use HTTPS.
Parameters
| Parameter | Type | Description |
|---|---|---|
| name | string | Human-readable webhook name (required, max 100 chars) |
| url | string | HTTPS endpoint URL to receive events (required) |
| events | string[] | Array of event types to subscribe to (required, min 1) |
Example Request
curl -X POST "https://intliq.com/api/v1/webhooks" \
-H "Authorization: Bearer ilq_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Score Monitor",
"url": "https://example.com/hooks/intliq",
"events": ["score_change", "tier_change", "compliance_alert"]
}'Example Response
{
"webhook": {
"id": "uuid",
"name": "Score Monitor",
"url": "https://example.com/hooks/intliq",
"events": ["score_change", "tier_change", "compliance_alert"],
"active": true,
"created_at": "2026-03-24T10:00:00Z"
},
"secret": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"_notice": "Store this secret securely. It cannot be retrieved again."
}/api/v1/backtestAnalyst+Run methodology backtesting against historical data. Compares scores against actual protocol outcomes (AUM drawdowns, tier transitions, redemption delays) to validate prediction accuracy.
Parameters
| Parameter | Type | Description |
|---|---|---|
| days_back | number | Historical lookback in days (default: 90, min: 7, max: 365) |
Example Request
curl -X GET "https://intliq.com/api/v1/backtest?days_back=90" \ -H "Authorization: Bearer ilq_YOUR_API_KEY"
Example Response
{
"protocolCount": 24,
"scoreRecordCount": 1680,
"periodStart": "2025-12-24T00:00:00Z",
"periodEnd": "2026-03-24T00:00:00Z",
"aumRetentionCorrelation": 0.87,
"l1StabilityRate": 0.94,
"illiquidPredictionAccuracy": 0.82,
"avgScoreBeforeDrawdown": 38,
"methodologyVersion": "v1.7-MMI",
"protocolResults": [
{
"slug": "blackrock-buidl",
"name": "BlackRock BUIDL",
"avgScore": 95,
"scoreVolatility": 1.2,
"aumRetention30d": 0.99,
"tierStability": 1.0,
"predictionAccurate": true
}
]
}/api/reports/generateGenerate a PDF intelligence report for a protocol. Reports are stored in Supabase Storage with a time-limited download URL.
Parameters
| Parameter | Type | Description |
|---|---|---|
| protocolId | string | UUID of the protocol (required, in request body) |
Example Request
curl -X POST "https://intliq.com/api/reports/generate" \
-H "Authorization: Bearer SESSION_TOKEN" \
-H "Content-Type: application/json" \
-d '{"protocolId": "uuid"}'Example Response
{
"reportId": "uuid",
"downloadUrl": "https://supabase.co/storage/v1/...",
"expiresAt": "2026-06-22T06:00:00Z"
}Webhook Events
Webhooks deliver real-time notifications to your HTTPS endpoint when monitored events occur. Each delivery includes signature headers for verification.
Event Types
| Event | Description |
|---|---|
| score_change | A protocol's liquidity score changed by more than the configured threshold |
| tier_change | A protocol moved between liquidity tiers (e.g., L1 to L2) |
| aum_change | AUM increased or decreased by more than 10% within 24 hours |
| compliance_alert | Jurisdiction or regulatory status change detected |
| data_stale | Protocol data has not been refreshed within the expected SLA |
| circuit_breaker | Scoring engine detected anomalous data and paused scoring for a protocol |
Delivery Headers
| Header | Description |
|---|---|
| X-IntLiq-Signature | HMAC-SHA256 signature of the request body using your webhook secret |
| X-IntLiq-Event | The event type that triggered the delivery (e.g., score_change) |
| X-IntLiq-Delivery-Id | Unique delivery UUID for idempotency and debugging |
Signature Verification
# Verify the HMAC-SHA256 signature
import hmac, hashlib
def verify_signature(payload: bytes, signature: str, secret: str) -> bool:
expected = hmac.new(
secret.encode("utf-8"),
payload,
hashlib.sha256
).hexdigest()
return hmac.compare_digest(expected, signature)Error Codes
| Status | Code | Description |
|---|---|---|
| 400 | BAD_REQUEST | Invalid parameters or malformed request body |
| 401 | UNAUTHORIZED | Missing, invalid, or expired API key |
| 402 | PLAN_REQUIRED | Endpoint requires a higher-tier plan |
| 404 | NOT_FOUND | Requested resource does not exist |
| 409 | DUPLICATE | Resource already exists (e.g., watchlist entry, webhook URL) |
| 429 | LIMIT_REACHED | Monthly API quota exceeded, per-minute rate limit hit, or resource limit reached |
| 500 | INTERNAL_ERROR | Server encountered an unexpected error |