Documentation

Developer & Integration Docs

Last updated: September 2026 · API v1.0 · Contracts v0.9

Overview

Split Finance exposes three surfaces for integrators:

All endpoints return JSON. Authentication is via EIP-4361 (Sign-In With Ethereum) for user-scoped endpoints and API keys for server-to-server integration.

Authentication

User sessions

POST /auth/nonce
{ "address": "0xabc..." }

→ { "nonce": "a3f9...", "expires_at": 1735689600 }

POST /auth/verify
{ "address": "0xabc...", "signature": "0xdef..." }

→ { "token": "eyJ...", "expires_in": 3600 }

Server-to-server

Include the header X-Split-Key: sk_live_... on all requests. Keys are scoped to read or read-write. Rotate every 90 days.

Markets

GET/v1/markets

List all markets with active staking pools.

{
  "markets": [
    {
      "id": "poly_0x9f...",
      "venue": "polymarket",
      "question": "Will X happen by Y date?",
      "yes_price": 0.72,
      "no_price": 0.28,
      "resolves_at": "2027-03-15T00:00:00Z",
      "pool": {
        "yes_staked": "125000.00",
        "no_staked": "98000.00",
        "imbalance": 0.24,
        "current_apy": 6.85,
        "boost_apy": 1.00
      }
    }
  ]
}
GET/v1/markets/:id

Retrieve a single market with full pool detail and APY history.

GET/v1/markets/:id/apy-history

Returns daily APY samples over the last 90 days.

Staking

POST/v1/stake/quote

Preview the effect of a proposed stake before signing.

{
  "market_id": "poly_0x9f...",
  "side": "yes",
  "amount": "1000.00"
}

→ {
  "expected_apy": 6.85,
  "boost_applied": 0.0,
  "matched_immediately": true,
  "receipt_token": "sYES-0x9f..."
}
POST/v1/stake/prepare

Returns an unsigned transaction payload to submit via the user's wallet.

GET/v1/positions/:address

List all open staking positions for an address.

POST/v1/unstake/prepare

Build an unstake transaction. Subject to counterparty liquidity availability.

Yield

GET/v1/yield/accrued/:address

Current accrued yield for a given address, broken down by position.

GET/v1/yield/strategies

Current allocation and realized APY per underlying lending strategy.

WebSocket

wss://api.split.finance/v1/stream

// subscribe
{ "action": "subscribe", "channel": "market:poly_0x9f..." }

// messages
{ "type": "pool_update", "yes": "125100", "no": "98100", "apy": 6.86 }
{ "type": "yield_tick", "address": "0xabc...", "accrued": "0.0412" }

Smart Contracts

ContractAddress (mainnet)Purpose
StakingVault0x…Deposits and receipt issuance
PairingEngine0x…Matches YES/NO stakers
YieldRouter0x…Allocates collateral to strategies
OracleAdapter0x…Verifies signed yield updates
TreasuryVault0x…Holds reserve for APY floor subsidy

Key interfaces

interface IStakingVault {
    function stake(uint256 marketId, bool side, uint256 amount) external returns (uint256 receiptId);
    function unstake(uint256 receiptId, uint256 amount) external;
    function claimYield(uint256 receiptId) external returns (uint256 yieldAmount);
}

interface IPairingEngine {
    function match(uint256 marketId) external returns (bool matched);
    function imbalance(uint256 marketId) external view returns (int256);
}

Error Codes

CodeMeaningResolution
4001Insufficient counterparty liquidityRetry later or accept longer match time
4002Market not accepting stakesCheck resolves_at — near-resolution markets close
4003Oracle signature invalidYield update rejected; no state change
4004Stake below minimumMinimum is 50 USDC notional per position
5001Strategy withdrawal delayedLending market utilization high; queued

Rate Limits

Public endpoints: 60 req/min per IP. Authenticated: 600 req/min per key. WebSocket: 100 concurrent subscriptions per connection.

Support

Integration questions: dev@split.finance
Bug reports: github.com/split-finance