Overview
The Hub API lets you manage consumer-facing Hub API keys and query per-listing analytics. Management and analytics endpoints require a session token — pass the authenticated user’s Bearer token in theAuthorization header. Hub API keys themselves (for agent-developer access to Hub discovery and outcome-report endpoints) are a separate credential type; see Create API key below.
Base URL: https://ezforge.ai
Authentication: Management and analytics endpoints require Authorization: Bearer <user-token>; Hub discovery and outcome-report endpoints use a Hub API key (Authorization: Bearer hub_live_…).
API keys
Hub API keys allow agent developers to call Hub discovery and data endpoints. Keys are tier-gated with daily request limits:Create API key
Response
201:
meta):
Error responses:
List API keys
200:
Revoke API key
401. Revocation cannot be undone.
Path parameters:
Response
204: No content.
Error responses:
Analytics
Get listing analytics
Query parameters:
Response
200 — Basic tier:
200 — Featured tier:
200 — Premium tier:
Error responses:
Capability documents
Capability documents let listing owners describe their MCP server’s tools and skills in structured form (SKILL.md or JSON). Once uploaded, the document is publicly retrievable and indexed by the Hub-level skills discovery registry atGET /.well-known/mcp-skills.
Upload capability document
Request body:
multipart/form-data
Example request:
201:
Error responses:
Get capability document
Example request:
200:
Cache-Control: public, max-age=120, stale-while-revalidate=600).
Error responses:
Get listing SKILL.md
skill_md_endpoint in the Hub MCP registry document. Public — no authentication required.
Fetching this endpoint records a click analytics event for the listing (fire-and-forget).
Path parameters:
Example request:
200:
Returns the SKILL.md content as text/markdown; charset=utf-8. The body is a Markdown document with YAML frontmatter containing hub:-prefixed flat keys (e.g. hub:listing_id, hub:listing_tier) as defined by the Hub SKILL.md spec.
200):
The
X-Hub-* headers expose the structured listing metadata so callers can access it programmatically without parsing the Markdown body.
Error responses:
Skills discovery registry
Example request:
200:
next_cursor is only present when more results exist. Pass its value as cursor in the next request to retrieve the following page.
Response fields (per listing):
Responses are cached for 60 seconds (
Cache-Control: public, max-age=60, stale-while-revalidate=300).
Error responses:
Listing tier
Set listing tier
basic, featured, or premium) of a single listing. Moving to basic is always allowed. Moving to featured or premium requires an active or trialing Hub subscription for that tier on your account. Hub matches the subscription against your account’s shared Stripe customer (see Billing account).
Hub identifies the subscription by its catalog price (hub_featured_monthly for Featured, hub_premium_monthly for Premium), not by a fixed Stripe price ID. A subscription on a price that has since been superseded or archived still counts, so a price change on our side doesn’t invalidate existing subscribers.
Auth: Session token (listing owner required).
Path parameters:
Request body:
application/json
Example request:
200: The updated listing, wrapped in { "data": { … } }. listingTier reflects the new tier.
The change applies to this listing only. Subscription changes made through Stripe update all of your active listings.
Error responses:
For
featured and premium, the subscription check runs before the ownership and existence checks. A request without a matching subscription returns 402 even if the listing is missing or isn’t yours.
Outcome reports
Outcome reports let agent developers tell Hub whether an interaction with a listing worked. Reports feed the public Outcome Reports card on the listing detail page once enough reports exist (see Listings).Submit outcome report
Authorization: Bearer hub_live_…). All tiers (Explorer and above) can submit reports.
Path parameters:
Request body:
application/json
Example request:
201:
200 (duplicate referral_id — a report for this referral already exists, nothing new is stored):
referral_id are never deduplicated.
Error responses: