Three ways to populate the catalog on day one.
Aforo does not assume your APIs already live in one place. Whichever shape your stack is in today, the catalog meets you there and absorbs what already exists.
From your gateway
Auto-import existing APIs
Connect Kong, Apigee, AWS API Gateway, Azure APIM, or MuleSoft. Aforo walks your existing routes, deduplicates by spec, and creates catalog entries as DRAFT. Bulk import processes hundreds of endpoints in minutes; bi-directional sync pushes publishStatus changes back at the gateway edge.
From your repo
AI agents and MCP servers
Paste a GitHub, GitLab, or Bitbucket URL. Aforo reads agent.yaml (or your custom manifest path) and pre-populates capabilities, default models, and starter rate plans. Useful for AI-first companies whose agents live in code, not behind a managed gateway.
From OpenAPI
No gateway required
Drop the spec URL or paste YAML. Every endpoint becomes a catalog asset; every parameter and example seeds the billable-unit configuration. Useful when your APIs aren’t behind a managed gateway yet, or when you want to add catalog ahead of the gateway rollout.
Category plus billable units = one rate-card-ready asset.
Aforo does not separate “what kind of product is this” from “how do you measure it.” Every product enters the catalog as a Category attached to one or more Billable Units. The pair is the primitive every rate plan, invoice line item, and margin calculation references — extensible at both axes.
InsightBot
One product. Four metering dimensions. One compound rate plan. Bill, invoice, and recognize revenue per unit — independently.
4 GA categories. Add your own.
Each category is a descriptor JSON file. Define new categories with their own discovery protocol, default billable-unit templates, and type-specific config (e.g. tool_registry for MCP,agent_config for AI Agent).
- · API Calls
- · Bytes Out
- · Latency p95 tier
- · Error Rate
- · Tokens In
- · Tokens Out
- · Session Duration
- · Tool Invocations
- · Workflow Runs
- · Steps Executed
- · External Calls
- · Wall Time
- · tools/call invocations
- · Stream Bytes
- · Active Sessions
- · Tool-specific
- · Define your own
- · Per-event aggregation
- · Filter expressions
- · JSONB metadata
Categories: the shape
Each category declares its discovery protocol (gateway / Git manifest / OpenAPI / JSON-RPC), default billable-unit templates, and type-specific configuration schema. Adding a new category means a new descriptor JSON — not a service deploy.
- Default templates ship per category
- Override the discovery adapter for in-house protocols
- Type-specific config (tool_registry, agent_config, etc.)
- Custom categories register via descriptor at deploy time
Billable Units: the measure
A Billable Unit maps a raw event field to a billable quantity. Pick an aggregation (SUM / MAX / AVG / COUNT), optionally scope with a filter expression, and the catalog auto-validates incoming usage. Templates seed the common cases; custom units cover the long tail.
- 32 starter templates (8 per category, edit or replace)
- Multi-dimensional: bill on multiple units in one rate plan
- JSONB filter conditions scope a unit (region · status · tier)
- Ingestion rejects events that do not match an active unit
Product defines the SKU. Finance validates the margin. Both operate from one system of record.
Universal Packaging
Mix and match APIs, AI agents, MCP servers, and your own custom product categories into unified, sellable SKUs. Every product carries its own billable units — pick from the per-category templates or define new ones in the dashboard. Spec versioning means yesterday’s customers stay safe when you ship today’s plan; publishStatus workflow (Draft → In Review → Published → Archived) keeps every change reviewable.
Auto-Discovery & Gateway Sync
Wire it up once, run it forever. Five gateway adapters (Kong, Apigee, AWS, Azure APIM, MuleSoft) auto-import products + push publishStatus back at the edge. Repository Auto-Discovery reads agent.yaml manifests from GitHub, GitLab, or Bitbucket on a paste-the-URL trigger. OpenAPI Import gives you a zero-gateway path. Breaking-change detection compares spec diffs at the line item so a customer’s subscription doesn’t silently break.
COGS Attribution & Margin Protection
Cost-of-goods-sold is attributed at the event level, every API call, token, and agent session, at ingestion time. Not estimated. Not reconciled after the fact. Gross margins are computed per product, per customer, per billing cycle and available before month-end close. Monetized-Product Deletion Protection blocks a delete that would orphan billable subscriptions; webhook drift detection alerts when a monetized asset disappears from the gateway.
Multi-Tenant Architecture
Run separate, isolated product catalogs for different business units, regions, or partner ecosystems, all from a single pane of glass. Each tenant gets its own catalog, pricing, and billing rules. The parent organization gets unified reporting across all of them, plus per-tenant Spectral lint rulesets and governance scoring.
One screen. Every revenue asset.
The Aforo Product Catalog as a Product or Finance operator sees it. Click any asset to inspect rate plans, subscriptions, governance history, and lifecycle events.
Live product UI · click any asset to drill into Product 360 with rate plans, subscriptions, audit trail, and the spec-diff review panel.
Register. Meter. Monetize. One afternoon.
No YAML files. No deploy queues. No new tickets. Engineering sets up the discovery sources once; Product defines the asset, Finance validates the metric, and revenue starts flowing.
Register the Revenue Asset
Name it. Type it. Assign an owner. Every monetizable asset — APIs, AI agents, MCP servers, SaaS modules — enters the system with structured metadata, lifecycle state, and an audit trail. Engineering wires the discovery sources once (gateway adapters, Git access, OpenAPI ingestion); Product runs the catalog daily.
Attach the Billable Unit
Define the unit of value: API calls, tokens consumed, sessions completed, tool invocations. The metric flows downstream into every rate plan, invoice line item, and margin calculation. Change it once here, pricing, billing, and reporting update automatically.
Activate Both GTM Motions
One catalog feeds two revenue channels simultaneously. Self-serve: publish to your developer storefront, buyers compare plans, subscribe, and hit your APIs in minutes. No sales touch required. Sales-led: your reps pull from the same catalog to construct bespoke enterprise contracts, volume commitments, prepaid drawdowns, custom grandfathering, negotiated SLAs, and multi-year terms. The critical guarantee: what Sales promises in a contract is exactly what Billing invoices. No drift. No revenue leakage from misaligned pricing between channels.
The catalog is also your governance plane.
Every product carries its own spec version, lifecycle stage, and health score. Subscribers pin to versions; reviewers gate publishes; risky assets surface in dashboards. Nothing ships silently.
Spec Versioning
SHA-256 content hashing tracks every change to every OpenAPI or MCP spec. Subscriptions pin to a version, so a customer paying for v1.4 is not silently moved to v2.0 when you ship it. Roll forward (or back) at the catalog level without touching subscriptions.
Breaking-Change Detection
OpenAPI diff analysis flags removed endpoints, parameter-type changes, enum narrowing, and required-field additions before you publish. Reviewers see a structured report; PMs approve or block per change.
Health + Governance Scores
Each product gets a 0–100 Health score (spec quality + version currency) and a 0–100 Governance score (Spectral lint compliance). PM dashboards filter and sort by score so the riskiest assets surface first.
Publish Workflow
DRAFT → IN_REVIEW → PUBLISHED → ARCHIVED with an audit trail. audience (INTERNAL / EXTERNAL / PARTNER) controls who sees each asset; maturityStage (GA / BETA / DEPRECATED / RETIRED) signals lifecycle to subscribers.
Everything your revenue team needs. One dashboard.
The catalog replaces the product spreadsheet, the metrics wiki, and the billing configuration file. All of them.
Live Revenue Ledger
STREAMING| Asset | Type | Status | Health | Gov | Growth | MRR |
|---|---|---|---|---|---|---|
Translation API | REST API | GA | 96 | 92 | +12.4% | $1.24M |
Embeddings v3 | REST API | GA | 89 | 87 | +18.7% | $840K |
InsightBot | AI Agent | GA | 94 | 88 | +34.1% | $612K |
DataPipe MCP | MCP Server | GA | 91 | 85 | +8.2% | $488K |
Forecast Studio | AI Agent | BETA | 82 | 76 | +62.3% | $184K |
Vector Search v2 | REST API | GA | 88 | 90 | +9.6% | $732K |
Translation v1 | REST API | DEPRECATED | 58 | 72 | −8.1% | $148K |
Compliance Bot | Agentic API | DRAFT | 71 | 64 | — | — |
Three days in the catalog.
Concrete sequences from real operator workflows. Names anonymised; the steps are exactly what the catalog ships.
Acme imports 47 APIs from Kong on day one
Acme runs 47 production APIs across 3 Kong clusters. The PMM wants a paid tier shipped in two weeks. The platform team has never had a catalog.
- 01Connect Kong via OAuth — credentials encrypted at rest
- 02Aforo walks all 3 clusters, deduplicates routes, creates 47 DRAFT catalog entries
- 03Platform Lead spot-reviews 4 outliers, approves the rest in bulk
- 04PMM ships the first paid tier on day 11 — catalog was ready on day 1
AI team auto-discovers an MCP server from a GitHub URL
You shipped a new internal MCP server last sprint. Capabilities live in a Git-tracked agent.yaml. You want to monetize it externally without re-defining the schema in three places.
- 01Paste the GitHub URL into Add Product → Discover
- 02Aforo reads agent.yaml, hashes the spec, populates capabilities + default rate plan
- 03PM toggles audience: PARTNER and maturityStage: BETA before publish
- 04External partner subscribes via storefront; usage starts metering through tools/call
PM deprecates Beta v2 without breaking a single subscription
Translation API v3 ships next month. 138 customers still hit v2. Legacy field shape will be removed — a breaking change that would have meant 138 angry support tickets before Aforo.
- 01PM uploads the v3 spec; breaking-change detector flags the removed field + 2 enum narrowings
- 02PM marks v2 as maturityStage: DEPRECATED with a 60-day sunset window
- 03All 138 subscriptions stay pinned to v2 — they keep working until they upgrade
- 04New subscribers route to v3 automatically; storefront badge shows v3 GA / v2 DEPRECATED