Skip to main content
Formo

Events API

  • Send individual or batches of events via events.formo.so to Formo.
  • High-throughput streaming ingestion with an easy-to-use HTTP API.
  • Supports 1000 requests/s and 20MB/s.

Profiles API

You can use the Profiles API for real-time personalization. Once you fetch a profile, you can use them in your app for real-time personalization.
  • Fetch wallet profile properties including net worth and wallet labels
  • Segment and target users based on location, device, and referrer
  • Real-time activation API for personalized user experiences
  • Available via x402 (formo.x402.paysponge.com) and MPP (formo.mpp.paysponge.com): pay per request, no API key required

Query API

  • Connect BI tools and SQL clients via BI integration.
  • Query and filter raw analytics events, materialized views, and metrics.
  • Return the activity feed / event stream for an anonymous visitor or wallet.
  • Export data periodically to your data warehouse.

Charts API

  • Create and manage custom dashboards and charts.
  • Add, update, and remove charts with SQL-based queries and visualization options (bar, line, pie, funnel, stacked, retention, and more).

Segments API

  • Create and manage user segments based on filter conditions.
  • Segment users by DeFi positions, net worth, transaction count, device, browser, lifetime volume, and other attributes.

Contracts API

  • Monitor blockchain smart contract events across all major chains.
  • Add contracts by chain ID, address, and ABI to get fully-decoded transaction and smart contract events.

Alerts API

  • Create, update, and manage project alerts programmatically.
  • Configure alert conditions and a webhook notification channel (including Slack, via a Slack incoming-webhook URL).

Response shape

Successful responses return the resource directly - there is no envelope, no isSuccess discriminator. HTTP status alone (200/201/204 vs 4xx/5xx) carries success. For example, creating an alert returns the alert itself:
DELETE returns 204 No Content with an empty body - don’t try to parse JSON on those.

Pagination

List endpoints use a Stripe-style envelope only because they need pagination metadata:

Idempotency

Pass an Idempotency-Key header on POST/PUT/PATCH/DELETE requests to the Alerts, Charts, Contracts, Segments, and Import APIs so retries can’t double-create or double-charge. The first response is cached for 24 hours and replayed byte-for-byte on retry.
The header is opt-in. See Idempotency for the full contract, failure modes, and client patterns.

Errors

Every non-2xx response uses the same envelope:
Branch on error.code (a stable enum), not message or HTTP status alone. The doc_url field anchors to the matching section of the Errors reference, so AI agents can fetch remediation context without escalating to a human. See Errors for the full list of codes.

Versioning

The public API is mounted under /v0/. We treat the path version as a major version; we will add /v1/ (rather than break /v0/) for incompatible changes. While under /v0/ the contract is settling - breaking changes can land before /v1/ ships, and we will announce them in the changelog. Within a version we may add new endpoints, new optional request fields, new response fields (clients should ignore unknown fields), and new error codes within an existing HTTP status family. We will not remove or rename existing endpoints/fields, change the HTTP status of an existing error condition, or repurpose an existing code value.

FAQ