Skip to main content

Overview

The Hub API lets you manage consumer-facing Hub API keys and query per-listing analytics. All endpoints require a session token — pass the authenticated user’s Bearer token in the Authorization header. Hub API keys themselves (for agent-developer access to Hub discovery endpoints) are a separate credential type; see Create API key below. Base URL: https://ezforge.ai Authentication: All endpoints require Authorization: Bearer <user-token>.
Dedicated pages provide deeper coverage of each area: API Keys (security model, header usage, deprecated endpoint migration) and Listing Analytics (tier comparison table, metric definitions).

API keys

Hub API keys allow agent developers to call Hub discovery and data endpoints. Keys are tier-gated with daily request limits:
TierDaily limit
explorer100 requests/day
builder10,000 requests/day
partner100,000 requests/day

Create API key

POST /api/v1/hub/api-keys
Creates a new Hub API key for the authenticated user. The raw key is returned exactly once — store it immediately; it cannot be retrieved again. Request body:
{
  "tier": "explorer"
}
FieldTypeRequiredDescription
tierstringKey tier: explorer, builder, or partner. Defaults to explorer.
Response 201:
{
  "data": {
    "key": "hub_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
    "meta": {
      "id": "01JQXYZ0000000000000000000",
      "userId": "01JQABC0000000000000000000",
      "keyPrefix": "hub_live_xxxxxxx",
      "tier": "explorer",
      "dailyRequestCount": 0,
      "lastRequestAt": null,
      "createdAt": "2026-05-15T10:00:00.000Z",
      "revokedAt": null
    }
  }
}
The key field is returned only once, at creation time. Store it securely — it cannot be retrieved again.
Response fields (meta):
FieldTypeDescription
idstringULID key identifier
userIdstringULID of the owning user
keyPrefixstringFirst 16 characters of the key (safe to display)
tierstringKey tier: explorer, builder, or partner
dailyRequestCountintegerRequests made today (resets UTC midnight)
lastRequestAtISO 8601 or nullTimestamp of the most recent request
createdAtISO 8601Key creation timestamp
revokedAtISO 8601 or nullSet when the key is revoked; null for active keys
Error responses:
StatusCodeCondition
401unauthorizedMissing or invalid session token
422validation_errortier is not one of explorer, builder, partner
429rate_limitedIP rate limit exceeded (Retry-After reflects seconds until window reset, ≤ 60)
503service_unavailableRate-limit service temporarily unavailable

List API keys

GET /api/v1/hub/api-keys
Returns all active (non-revoked) Hub API keys for the authenticated user, ordered oldest-first. Returns up to 100 keys. Raw key values are never returned. Response 200:
{
  "data": [
    {
      "id": "01JQXYZ0000000000000000000",
      "userId": "01JQABC0000000000000000000",
      "keyPrefix": "hub_live_xxxxxxx",
      "tier": "builder",
      "dailyRequestCount": 42,
      "lastRequestAt": "2026-05-15T09:14:00.000Z",
      "createdAt": "2026-03-01T08:00:00.000Z",
      "revokedAt": null
    }
  ]
}
Error responses:
StatusCodeCondition
401unauthorizedMissing or invalid session token
429rate_limitedIP rate limit exceeded (Retry-After reflects seconds until window reset, ≤ 60)
503service_unavailableRate-limit service temporarily unavailable

Revoke API key

DELETE /api/v1/hub/api-keys/:id
Immediately revokes a Hub API key. Any subsequent requests using this key will receive a 401. Revocation cannot be undone. Path parameters:
ParameterTypeDescription
idstringULID of the key to revoke
Response 204: No content. Error responses:
StatusCodeCondition
401unauthorizedMissing or invalid session token
404not_foundKey not found or not owned by the authenticated user
409conflictKey is already revoked
429rate_limitedIP rate limit exceeded (Retry-After reflects seconds until window reset, ≤ 60)
503service_unavailableRate-limit service temporarily unavailable

Analytics

Get listing analytics

GET /api/v1/hub/analytics/listings/:id
Returns analytics for a Hub listing. The response shape is gated by the listing’s tier — callers receive only the fields their tier makes available. Only the listing owner can access this endpoint. Path parameters:
ParameterTypeDescription
idstring26-character ULID of the listing
Query parameters:
ParameterTypeDefaultDescription
periodstring30dReporting window: 7d, 30d, or 90d
Response 200 — Basic tier:
{
  "data": {
    "tier": "basic",
    "period": "30d",
    "view_count": 312
  }
}
Response 200 — Featured tier:
{
  "data": {
    "tier": "featured",
    "period": "30d",
    "view_count": 312,
    "click_count": 87,
    "click_through_rate": 27.88
  }
}
Response 200 — Premium tier:
{
  "data": {
    "tier": "premium",
    "period": "30d",
    "view_count": 312,
    "click_count": 87,
    "click_through_rate": 27.88,
    "search_impressions": 1540,
    "referral_clicks": 34,
    "conversion_rate": 3.21
  }
}
Response fields:
FieldTypeTiersDescription
tierstringallListing tier used to gate this response: basic, featured, or premium
periodstringallReporting window reflected back: 7d, 30d, or 90d
view_countintegerallTotal listing views in the period
click_countintegerFeatured, PremiumTotal click-throughs from search results
click_through_ratenumberFeatured, Premiumclick_count / view_count × 100, rounded to 2 decimal places
search_impressionsintegerPremiumTimes the listing appeared in search results
referral_clicksintegerPremiumReferral-link interactions originating from Hub discovery
conversion_ratenumberPremiumtransactions / view_count × 100, rounded to 2 decimal places
Error responses:
StatusCodeCondition
400invalid_inputid is not a valid 26-character ULID, or period is not 7d, 30d, or 90d
401unauthorizedMissing or invalid session token
403forbiddenAuthenticated user does not own this listing
404not_foundListing not found
429rate_limitedIP rate limit exceeded (Retry-After reflects seconds until window reset, ≤ 60)
503service_unavailableRate-limit service temporarily unavailable

Deprecated endpoints

/api/v1/hub/keys is deprecated. Use /api/v1/hub/api-keys for all new integrations. The /api/v1/hub/keys path will be sunset on 2028-01-01 and removed in a future release.
Responses from the deprecated path include the following headers to signal migration:
Deprecation: true
Link: </api/v1/hub/api-keys>; rel="successor-version"
Sunset: Sat, 01 Jan 2028 00:00:00 GMT
Deprecated pathReplacement
POST /api/v1/hub/keysPOST /api/v1/hub/api-keys
GET /api/v1/hub/keysGET /api/v1/hub/api-keys
DELETE /api/v1/hub/keys/:idDELETE /api/v1/hub/api-keys/:id