> ## Documentation Index
> Fetch the complete documentation index at: https://docs.routeur.app/llms.txt
> Use this file to discover all available pages before exploring further.

> ## Agent Instructions
> Prices are US dollars per contract that pays $1: 0.46 means 46 cents. Spread is the Yes ask plus the No ask minus $1. Liquidity grades are deep, tradeable and thin; lists hide thin markets unless include_thin=true. Relations are proven from contract terms, never inferred from wording; a lead marked informational is never executable. Every figure carries a graph_run; read /agents/reading-order first, then /concepts/relations and /concepts/liquidity.

# How often proven relations held at settlement

> The public accuracy record, readable without a key. For every relation
type and proof family, on one venue or across both: how many proven
relations were checked against the settled outcomes of their markets,
how many were violated, the violation rate with its 95% Wilson
interval, and how a hand-labelled sample of live relations was judged.
`release` states the guard that decides which families may offer
executable leads, and which have passed it. `methodology` says in
plain words how every figure is made. Refreshed every half hour.




## OpenAPI

````yaml /openapi.yaml get /v1/accuracy
openapi: 3.1.0
info:
  title: Routeur Graph API
  version: '2026-09-15'
  summary: >-
    Proven relations between Kalshi and Polymarket contracts, with the history
    and signals built on them.
  description: >
    Routeur reads every open market on Kalshi and global Polymarket, and proves

    which ones imply, exclude or equal each other from each venue's structured

    contract terms and exact arithmetic. No relation is inferred from prose, and

    ambiguous or conflicting evidence is withheld.


    ## Authentication

    Send your key in the `X-API-Key` header, or as `Authorization: Bearer
    <key>`.

    Keys look like `rk_live_<12-character id>_<43-character secret>` and are

    shown once when issued. Keep them server-side. One endpoint needs no key:

    `/v1/accuracy`, the public record of how often proven relations held when

    their markets settled.


    ## Rate limits

    Every key has a per-minute limit and a per-day quota set by its tier:


    | Tier | Requests per minute | Requests per day |

    |---|---|---|

    | free | 30 | 2,000 |

    | trader | 120 | 50,000 |

    | pro | 600 | 500,000 |

    | institutional | 3,000 | 10,000,000 |


    Responses carry `X-RateLimit-Limit`, `X-RateLimit-Remaining` and

    `X-RateLimit-Reset` (Unix seconds) for the minute window, and

    `X-Daily-Quota-Limit` and `X-Daily-Quota-Remaining` for the day (UTC).

    A request over either limit returns `429` with `Retry-After` in seconds.


    ## Conventions

    - Money and prices are decimal strings in USD (for example `"0.4100"`),
    never
      floats. Prices are per contract that pays $1.
    - Times are RFC 3339 in UTC.

    - Successful responses wrap results in `data`. Graph-derived responses also
      name the `graph_run` they were read from; runs finish hourly.
    - Paginated lists return `next_cursor` when more results exist. Pass it back
      as `cursor` unchanged; cursors are opaque.
    - Unknown or repeated query parameters are rejected with `400`, so typos
    never
      silently widen a query.

    ## Liquidity

    Every object that names a market carries its 24-hour volume, its spread and

    a `liquidity` grade, because a price nobody can trade at is not a price:


    | Grade | 24-hour volume or open interest | Round-trip spread |

    |---|---|---|

    | `deep` | $25,000 traded, or $250,000 open interest | 2¢ or less |

    | `tradeable` | $1,000 traded, or $25,000 open interest | 5¢ or less |

    | `thin` | anything less, or no quoted round trip | |


    Lists that suggest something to act on — price gaps, leads, movers, flows,

    large fills, closing soon, strategy matches — leave thin markets out by

    default, and rank what is left by the money behind it. Three parameters

    change that wherever it applies: `min_volume_usd`, `max_spread_usd` and

    `include_thin=true`, which drops both floors. Search and event listings show

    thin markets but rank them below what can be traded.


    ## Errors

    Errors return a JSON body `{"error": {"code": "...", "message": "..."}}`.

    Branch on `code`; messages may change.


    | Status | Code | Meaning |

    |---|---|---|

    | 400 | `invalid_parameter` | A query parameter is unknown, repeated or out
    of range. |

    | 400 | `invalid_market` | The venue is not `kalshi` or `polymarket`, or the
    market id is malformed. |

    | 400 | `invalid_rulebook` | The venue, rulebook kind or id is malformed. |

    | 400 | `invalid_event` | The venue is not `kalshi` or `polymarket`, or the
    event id is malformed. |

    | 400 | `invalid_topic` | The topic name is malformed; use lowercase words
    joined by dashes. |

    | 401 | `api_key_required` | No key was sent. |

    | 401 | `invalid_api_key` | The key is malformed or unknown. |

    | 401 | `api_key_revoked` | The key was revoked. |

    | 401 | `invalid_token` | The bearer credential is not an API key and is not
    a valid service identity token. |

    | 403 | `caller_not_allowed` | The service identity token is valid but its
    identity may not call the API. |

    | 404 | `market_not_found` | The market is not in the latest graph. |

    | 404 | `event_not_found` | The event is not in the latest graph. |

    | 404 | `topic_not_found` | No listed markets are labeled with that topic. |

    | 404 | `strategy_not_found` | No strategy with that id is supported by
    settled history right now. |

    | 404 | `relation_not_found` | Both markets are listed, but no current proof
    relates them. |

    | 404 | `rulebook_not_found` | No such rulebook has been recorded. |

    | 404 | `book_not_found` | No order book is recorded for the market at that
    time. |

    | 404 | `not_found` | No such endpoint. |

    | 429 | `rate_limited` | The per-minute limit was exceeded. |

    | 429 | `daily_quota_exceeded` | The daily quota is used up. |

    | 429 | `too_many_streams` | The key already holds its concurrent live
    streams. |

    | 503 | `graph_unavailable` | No graph run has finished yet. |

    | 503 | `database_unavailable` | The database is not reachable; the
    readiness check answers this while it is down. |

    | 503 | `stream_unavailable` | No live stream capacity is free; retry
    shortly. |

    | 504 | `timeout` | The request took longer than 15 seconds. |

    | 500 | `internal` | Something failed on our side. |


    ## Webhooks

    Mispricing alerts are delivered as signed `POST` requests; see the

    `webhooks` section. Each request carries

    `Routeur-Signature: t=<unix seconds>,v1=<hex>`, where `v1` is

    HMAC-SHA256 of `<t>.<raw body>` keyed by your subscription's signing

    secret. Reject requests whose signature does not match or whose `t` is more

    than five minutes old, and respond `2xx` within 10 seconds.


    `Routeur-Delivery` identifies the delivery and stays the same across
    retries,

    so use it to ignore duplicates. Any response other than `2xx` or `410`, or
    no

    response, is retried with exponential backoff from 30 seconds for up to 8

    attempts; responding `410 Gone` disables the subscription. Endpoints must be

    HTTPS on a public address, and redirects are not followed.
  contact:
    name: Routeur
    url: https://routeur.app
servers:
  - url: https://api.routeur.app
security:
  - apiKey: []
  - bearer: []
tags:
  - name: Events
    description: Real-world events across both venues, the way people browse them.
  - name: Graph
    description: Markets and the relations proven between them.
  - name: History
    description: Recorded quotes and trades.
  - name: Rules
    description: |
      Contract terms and their history. Every version of every market's rule
      text is kept from the day it was first seen, along with the rulebooks
      above it (Kalshi series and event terms, Polymarket resolution metadata)
      and the venue's contract terms documents, with diffs between versions.
  - name: Books
    description: >-
      Order books recorded live from each venue's feed, their history, and the
      health of the feeds.
  - name: Signals
    description: Mispricing leads and unusual trading derived from the graph and history.
  - name: Live
    description: Quotes, trades, relations and leads pushed as they happen.
  - name: Service
    description: Service status and this document.
paths:
  /v1/accuracy:
    get:
      tags:
        - Graph
      summary: How often proven relations held at settlement
      description: |
        The public accuracy record, readable without a key. For every relation
        type and proof family, on one venue or across both: how many proven
        relations were checked against the settled outcomes of their markets,
        how many were violated, the violation rate with its 95% Wilson
        interval, and how a hand-labelled sample of live relations was judged.
        `release` states the guard that decides which families may offer
        executable leads, and which have passed it. `methodology` says in
        plain words how every figure is made. Refreshed every half hour.
      operationId: getAccuracy
      responses:
        '200':
          description: The accuracy record.
          content:
            application/json:
              schema:
                type: object
                additionalProperties: false
                required:
                  - data
                properties:
                  data:
                    $ref: '#/components/schemas/Accuracy'
              example:
                data:
                  headline:
                    checked: 18240
                    violated: 3
                    violation_rate: '0.0002'
                    violation_rate_high: '0.0005'
                    labelled: 214
                    labelled_precision: '0.9907'
                    labelled_precision_low: '0.9665'
                    labelled_precision_high: '0.9975'
                    wrong_relations_still_live: 0
                  buckets:
                    - relation: implies
                      family: ladder
                      cross_venue: false
                      checked: 17510
                      violated: 0
                      unverifiable: 320
                      violation_rate: '0.0000'
                      violation_rate_low: '0.0000'
                      violation_rate_high: '0.0002'
                      first_settled_at: '2026-07-01T14:00:00Z'
                      last_settled_at: '2026-09-15T22:00:00Z'
                      labels:
                        correct: 60
                        wrong: 0
                        unsure: 1
                        precision: '1.0000'
                        precision_low: '0.9397'
                        precision_high: '1.0000'
                      wrong_relations_still_live: 0
                      released: true
                    - relation: equivalent
                      family: econ
                      cross_venue: true
                      checked: 12
                      violated: 0
                      unverifiable: 1
                      violation_rate: '0.0000'
                      violation_rate_low: '0.0000'
                      violation_rate_high: '0.2447'
                      first_settled_at: '2026-08-12T12:30:00Z'
                      last_settled_at: '2026-09-11T12:30:00Z'
                      labels:
                        correct: 9
                        wrong: 1
                        unsure: 0
                        precision: '0.9000'
                        precision_low: '0.5958'
                        precision_high: '0.9821'
                      wrong_relations_still_live: 0
                      released: false
                  release:
                    min_checked: 25
                    max_violation_rate: '0.0100'
                    released:
                      - family: ladder
                        cross_venue: false
                        checked: 17510
                        violated: 0
                      - family: sports
                        cross_venue: true
                        checked: 640
                        violated: 3
                  refreshed_at: '2026-09-16T09:37:40Z'
                  methodology:
                    - >-
                      Every relation the graph proves is a claim about outcomes.
                      ...
        '503':
          $ref: '#/components/responses/Unavailable'
        default:
          $ref: '#/components/responses/Error'
      security: []
components:
  schemas:
    Accuracy:
      type: object
      additionalProperties: false
      required:
        - headline
        - buckets
        - release
        - methodology
      properties:
        headline:
          $ref: '#/components/schemas/AccuracyHeadline'
        buckets:
          type: array
          items:
            $ref: '#/components/schemas/AccuracyBucket'
        release:
          $ref: '#/components/schemas/AccuracyRelease'
        refreshed_at:
          $ref: '#/components/schemas/Timestamp'
          description: When the figures were last rebuilt; absent before the first pass.
        methodology:
          type: array
          description: How every figure is made, in plain words.
          items:
            type: string
    AccuracyHeadline:
      type: object
      additionalProperties: false
      required:
        - checked
        - violated
        - violation_rate
        - violation_rate_high
        - labelled
        - wrong_relations_still_live
      properties:
        checked:
          type: integer
          description: Relations checked against settled outcomes, over every bucket.
        violated:
          type: integer
        violation_rate:
          $ref: '#/components/schemas/Decimal'
        violation_rate_high:
          $ref: '#/components/schemas/Decimal'
          description: Upper bound of the 95% Wilson interval.
        labelled:
          type: integer
          description: Sample relations judged correct or wrong; unsure ones are left out.
        labelled_precision:
          $ref: '#/components/schemas/Decimal'
        labelled_precision_low:
          $ref: '#/components/schemas/Decimal'
        labelled_precision_high:
          $ref: '#/components/schemas/Decimal'
        wrong_relations_still_live:
          type: integer
          description: Relations judged wrong that the latest graph run still holds.
    AccuracyBucket:
      type: object
      additionalProperties: false
      required:
        - relation
        - family
        - cross_venue
        - checked
        - violated
        - unverifiable
        - violation_rate
        - violation_rate_low
        - violation_rate_high
        - labels
        - wrong_relations_still_live
        - released
      properties:
        relation:
          $ref: '#/components/schemas/AccuracyRelation'
        family:
          $ref: '#/components/schemas/ProofFamily'
        cross_venue:
          type: boolean
        checked:
          type: integer
          description: >-
            Relations whose markets both settled Yes or No: consistent plus
            violated.
        violated:
          type: integer
        unverifiable:
          type: integer
          description: >-
            Pairs where a side settled scalar or void, or the relation makes no
            claim.
        violation_rate:
          $ref: '#/components/schemas/Decimal'
        violation_rate_low:
          $ref: '#/components/schemas/Decimal'
        violation_rate_high:
          $ref: '#/components/schemas/Decimal'
        first_settled_at:
          $ref: '#/components/schemas/Timestamp'
        last_settled_at:
          $ref: '#/components/schemas/Timestamp'
        labels:
          $ref: '#/components/schemas/AccuracyLabels'
        wrong_relations_still_live:
          type: integer
        released:
          type: boolean
          description: Whether this family and venue scope have passed the release guard.
    AccuracyRelease:
      type: object
      additionalProperties: false
      required:
        - min_checked
        - max_violation_rate
        - released
      properties:
        min_checked:
          type: integer
          description: Checks a family needs before it can be released.
        max_violation_rate:
          $ref: '#/components/schemas/Decimal'
          description: >-
            A family with violations is released only while the upper bound of
            its violation rate stays below this.
        released:
          type: array
          items:
            $ref: '#/components/schemas/ReleasedBucket'
    Timestamp:
      type: string
      format: date-time
    Error:
      type: object
      additionalProperties: false
      required:
        - error
      properties:
        error:
          type: object
          additionalProperties: false
          required:
            - code
            - message
          properties:
            code:
              type: string
              description: A stable machine-readable code.
            message:
              type: string
              description: A human-readable explanation.
    Decimal:
      type: string
      description: An exact decimal number.
      pattern: ^-?[0-9]+(\.[0-9]+)?$
      example: '0.4100'
    AccuracyRelation:
      type: string
      description: >-
        A relation type as accuracy reports it; subset and superset edges are
        one type, implies.
      enum:
        - equivalent
        - implies
        - contradicts
        - overlaps
    ProofFamily:
      type: string
      description: |
        The kind of proof behind a relation: `ladder` (exact strike bounds on
        one variable within a venue's event), `sports` (a game line paired
        across venues), `econ` (an economic or crypto variable paired across
        venues), `exclusive` (a source-asserted mutually exclusive event) or
        `other`.
      enum:
        - ladder
        - sports
        - econ
        - exclusive
        - other
    AccuracyLabels:
      type: object
      additionalProperties: false
      required:
        - correct
        - wrong
        - unsure
      properties:
        correct:
          type: integer
        wrong:
          type: integer
        unsure:
          type: integer
        precision:
          $ref: '#/components/schemas/Decimal'
          description: correct / (correct + wrong); absent until one is labelled.
        precision_low:
          $ref: '#/components/schemas/Decimal'
        precision_high:
          $ref: '#/components/schemas/Decimal'
    ReleasedBucket:
      type: object
      additionalProperties: false
      required:
        - family
        - cross_venue
        - checked
        - violated
      properties:
        family:
          $ref: '#/components/schemas/ProofFamily'
        cross_venue:
          type: boolean
        checked:
          type: integer
        violated:
          type: integer
  responses:
    Unavailable:
      description: No graph run has finished yet.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    Error:
      description: Any other error.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
  securitySchemes:
    apiKey:
      type: apiKey
      in: header
      name: X-API-Key
    bearer:
      type: http
      scheme: bearer
      description: The same API key sent as a Bearer token.

````