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_XXXXXXXXXXXXXXXX

Generate 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.com

Rate 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.

PlanMonthly QuotaPer MinuteNotes
Observer00No API access
Analyst2,00060Score history, backtesting
Professional10,000200Export, custom profiles, webhooks
InstitutionalUnlimitedUnlimitedDedicated 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

GET/api/v1/protocols

Returns a paginated list of all tracked RWA protocols with current scores.

Parameters

ParameterTypeDescription
categorystringFilter by category (treasury, private_credit, real_estate, commodity, infrastructure)
tierstringFilter by liquidity tier (L1, L2, L3, ILLIQUID)
min_scorenumberMinimum IntLiq score (0-100)
min_aumnumberMinimum AUM in USD
limitnumberProtocols per page (default: 20, max: 100)
offsetnumberPagination 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
}
GET/api/v1/protocols/:slug

Returns 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"
}
GET/api/v1/scores

Returns 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"
}
GET/api/v1/scores/:slug

Returns 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"
}
GET/api/v1/scores/:slug/historyAnalyst+

Returns historical score data with trajectory analysis (IMPROVING, STABLE, DECLINING).

Parameters

ParameterTypeDescription
limitnumberNumber of data points to return (default: 30, max: 365)
intervalstringBucketing 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"
}
GET/api/v1/market

Returns 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 }
}
GET/api/v1/watchlist

Returns 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
    }
  ]
}
POST/api/v1/watchlist

Add a protocol to the authenticated user's watchlist with default alert settings.

Parameters

ParameterTypeDescription
protocolSlugstringThe 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
}
DELETE/api/v1/watchlist/:slug

Remove 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 }
GET/api/v1/usage

Returns 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"
}
GET/api/v1/usage/statsAnalyst+

Returns granular usage time-series data for resource consumption analytics.

Parameters

ParameterTypeDescription
intervalstringAggregation interval: day, week, or month (default: day)
daysnumberLookback 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 }
  ]
}
POST/api/v1/user/keys

Generate 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"
}
POST/api/v1/user/keys/rotate

Rotate an existing API key. Creates a new key and schedules the old key for deactivation after a 24-hour grace period.

Parameters

ParameterTypeDescription
keyIdstringUUID 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"
}
GET/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"
    }
  ]
}
POST/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

ParameterTypeDescription
namestringProfile name (required, max 100 chars)
weightsobjectScoring weights: { aum, redemption, secondaryVolume, issuer, jurisdiction } — must sum to 1.0
penaltyCapsobjectOptional 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"
  }
}
GET/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

ParameterTypeDescription
formatstringExport format: csv or json (default: json)
categorystringFilter by category (optional)
tierstringFilter 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"
    }
  ]
}
GET/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"
    }
  ]
}
POST/api/v1/webhooksProfessional+

Register a new webhook endpoint. The webhook secret is returned once and cannot be retrieved again. URL must use HTTPS.

Parameters

ParameterTypeDescription
namestringHuman-readable webhook name (required, max 100 chars)
urlstringHTTPS endpoint URL to receive events (required)
eventsstring[]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."
}
GET/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

ParameterTypeDescription
days_backnumberHistorical 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
    }
  ]
}
POST/api/reports/generate

Generate a PDF intelligence report for a protocol. Reports are stored in Supabase Storage with a time-limited download URL.

Parameters

ParameterTypeDescription
protocolIdstringUUID 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

EventDescription
score_changeA protocol's liquidity score changed by more than the configured threshold
tier_changeA protocol moved between liquidity tiers (e.g., L1 to L2)
aum_changeAUM increased or decreased by more than 10% within 24 hours
compliance_alertJurisdiction or regulatory status change detected
data_staleProtocol data has not been refreshed within the expected SLA
circuit_breakerScoring engine detected anomalous data and paused scoring for a protocol

Delivery Headers

HeaderDescription
X-IntLiq-SignatureHMAC-SHA256 signature of the request body using your webhook secret
X-IntLiq-EventThe event type that triggered the delivery (e.g., score_change)
X-IntLiq-Delivery-IdUnique 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

StatusCodeDescription
400BAD_REQUESTInvalid parameters or malformed request body
401UNAUTHORIZEDMissing, invalid, or expired API key
402PLAN_REQUIREDEndpoint requires a higher-tier plan
404NOT_FOUNDRequested resource does not exist
409DUPLICATEResource already exists (e.g., watchlist entry, webhook URL)
429LIMIT_REACHEDMonthly API quota exceeded, per-minute rate limit hit, or resource limit reached
500INTERNAL_ERRORServer encountered an unexpected error