Skip to main content
The Surface API gives you programmatic access to Surface’s cross-exchange matching system. Look up one Kalshi contract ticker or Polymarket contract slug, or list clusters within one configured series/tag association. Responses group contract details and match links by exchange and contract ID. Add include_rules=true when you also need resolution rules. Every match passes through a multi-stage validation pipeline. Team, date, line, and side alignment are all checked before a result is accepted. If a candidate doesn’t clear the bar, it’s rejected rather than returned.

Base URL

Authentication

All requests require an API key in the X-API-Key header.
Create an account and generate a key at surfaceapi.com/portal.

Rate limits

The free tier allows 60 authenticated requests per minute. This is enforced in fixed UTC minute windows. Every authenticated request counts toward this limit, including repeated lookups and unknown contracts. The free tier allows 25 new unique cluster lookups per day. Repeat lookups are always free. Looking up any contract ID within a cluster you’ve already accessed never counts against your quota. 404s are also free against the daily quota. If no match is found for a contract, that request does not consume a daily quota slot, but it still counts toward the minute request limit. The daily quota resets at midnight UTC each day. These response headers are present on every authenticated request: The request-rate headers are also present on every authenticated response:

Errors

All errors use the same envelope:
On a 429, three additional fields are included. The Retry-After header gives the number of seconds to wait.