anthid-com Control Evaluation API

Effective control-state evaluation

Operations 1

POST /v1/controls/evaluate Evaluate controls #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/anthid-com:anthid-com-control-evaluation-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

anthid-com-control-evaluation-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: controls Control Evaluation API
  description: Effective control-state evaluation
  license:
    name: ''
  version: 0.1.0
servers:
- url: https://api.anthid.com
  description: Production
tags:
- name: Control Evaluation
  description: Effective control-state evaluation
paths:
  /v1/controls/evaluate:
    post:
      tags:
      - Control Evaluation
      summary: Evaluate controls
      description: Evaluates organization controls for JSON `null`, or effective order controls for an order context with a resolved `instrument`. Non-equity instruments are blocked. Supply `side` when position or daily-loss controls apply; those controls block orders without it. Both allowed and blocked results return 200. Users and API keys require Controls Basic or Premium. Users need an organization role; API keys need control read permission for the account environment, or both environments for `null`. Services need `control:evaluate` and `x-organization-id`.
      operationId: evaluateControls
      parameters:
      - name: x-organization-id
        in: header
        description: Organization ID required for service-account credentials
        required: false
        schema:
          type:
          - string
          - 'null'
          format: uuid
        example: 550e8400-e29b-41d4-a716-446655440222
      requestBody:
        description: JSON null for organization-only evaluation, or a complete order context including its required instrument
        content:
          application/json:
            schema:
              oneOf:
              - type: 'null'
              - $ref: '#/components/schemas/EvaluateRequest'
            example:
              account_id: 550e8400-e29b-41d4-a716-446655440000
              instrument:
                asset_class: EQUITY
                exchange: NASDAQ
                symbol: AAPL
              quantity: '100'
              side: BUY
              symbol: AAPL
        required: true
      responses:
        '200':
          description: Control evaluation result
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/EvaluateResult'
              example:
                allowed: false
                triggered:
                - control_type: Manual
                  reason: Symbol restricted during earnings
                  scope:
                    Symbol:
                      account_id: 550e8400-e29b-41d4-a716-446655440000
                      symbol: AAPL
        '400':
          description: JSON syntax is invalid, or the service-account `x-organization-id` header is missing or invalid
          content:
            application/json:
              schema:
                type: string
            text/plain:
              schema:
                type: string
        '401':
          description: Missing or invalid authentication credentials
        '403':
          description: Caller lacks controls entitlement, evaluation access, or account ownership
          content:
            application/json:
              schema:
                type: string
        '413':
          description: Request body exceeds the size limit
          content:
            text/plain:
              schema:
                type: string
        '415':
          description: Content-Type must be application/json
          content:
            text/plain:
              schema:
                type: string
        '422':
          description: JSON does not match the request schema
          content:
            text/plain:
              schema:
                type: string
        '429':
          description: Caller exceeded the request rate limit
        '500':
          description: Server error
          content:
            application/json:
              schema:
                type: string
      security:
      - bearerAuth: []
      - clientCredentials: []
      - apiKeyAuth: []
components:
  schemas:
    TriggeredControl:
      type: object
      required:
      - scope
      - control_type
      - reason
      properties:
        control_type:
          $ref: '#/components/schemas/ControlType'
        reason:
          type: string
        scope:
          $ref: '#/components/schemas/ControlScope'
    OptionType:
      type: string
      enum:
      - call
      - put
    Settlement:
      type: string
      description: 'Which asset a [`Perpetual`] pays out in.


        The difference is not bookkeeping. A linear contract is quoted and settled

        in the quote asset, so its value rises with price like anything else. An

        inverse contract is quoted in the quote asset and settled in the **base**

        one, which puts price in the denominator: the position is worth

        `multiplier * quantity / price`, and it is worth *less* as price rises.


        A venue commonly lists both against the same pair - `BTCUSDT` linear beside

        `XBTUSD` inverse - so the spelling is not a reliable guide and this field

        is the only thing that says which is which.'
      enum:
      - LINEAR
      - INVERSE
    OrderSide:
      type: string
      enum:
      - UNSPECIFIED
      - BUY
      - SELL
      - SELL_SHORT
    PredictionOutcome:
      type: string
      description: Which side of a prediction market a contract pays on.
      enum:
      - 'YES'
      - 'NO'
    Perpetual:
      type: object
      description: "A perpetual contract: a derivative with no settlement date.\n\nIt tracks its underlying without ever expiring, held in line by a funding\npayment exchanged between longs and shorts on a fixed schedule rather than\nby convergence to a settlement price. Two consequences matter more than the\nrest, and both are places where treating a perpetual as a future goes\nwrong quietly:\n\n1. **There is no expiry.** [`Instrument::expiration`](super::Instrument::expiration)\n   answers `None`, and\n   that `None` means \"never\" rather than \"unknown\". Anything that rolls,\n   ages or expires positions has to tell those apart.\n2. **Settlement can invert the position.** See [`Settlement`].\n\nFunding is carried as a schedule rather than a rate because the rate is\nmarket data that changes every interval, and an instrument identity that\nwent stale every eight hours would be cached wrongly everywhere. What\nbelongs here is *when* funding happens; what it costs belongs on a quote."
      required:
      - symbol
      - base
      - quote
      - venue
      - underlying
      - settlement
      - multiplier
      - funding
      - tick_size
      - quantity_increment
      properties:
        base:
          type: string
        funding:
          $ref: '#/components/schemas/FundingSchedule'
        multiplier:
          $ref: '#/components/schemas/Multiplier'
          description: 'Units of the underlying per contract.


            Read through [`Instrument::notional`](super::Instrument::notional). For an

            inverse contract this is

            an amount of the *quote* asset - one contract of `XBTUSD` is one dollar

            of bitcoin - which is why it cannot simply be multiplied through.'
        quantity_increment:
          $ref: '#/components/schemas/Quantity'
        quote:
          type: string
        settlement:
          $ref: '#/components/schemas/Settlement'
        symbol:
          type: string
          description: The venue's spelling - `BTCUSDT`, `BTC-PERP`, `XBTUSD`.
        tick_size:
          $ref: '#/components/schemas/Price'
        underlying:
          $ref: '#/components/schemas/PerpetualUnderlying'
          description: 'What the contract tracks.


            Perpetuals started on crypto and did not stay there: the same structure

            now wraps equity indices and event outcomes, and the contract mechanics

            are identical in each. This says what the exposure actually is, so a

            risk check can ask what it is looking at without parsing a ticker.'
        venue:
          type: string
    Crypto:
      type: object
      description: 'Spot crypto: the asset itself, held outright.


        # Precision


        The type is not the constraint here, and this note exists to say so.


        [`Quantity`] holds eighteen decimal places, so a satoshi - `0.00000001` -

        has ten places to spare, and on-chain token amounts at their own native

        precision fit without rounding. Crypto is the asset class that used to make

        this worth reading: while the scale was six, a bitcoin size was silently

        rounded two places short of the asset''s own divisibility, exact enough to

        order with and wrong for anything reconciling a balance. See

        [`SCALE`](crate::numeric::SCALE) for why that is no longer true of any

        value this crate carries.


        What does constrain a size is [`Self::quantity_increment`], which is the

        venue''s own step and is data rather than a property of the type. A size that

        is exactly representable here can still be refused by the venue for being

        off the increment, so that field is the one to check against - not the width

        of the number.'
      required:
      - symbol
      - base
      - quote
      - venue
      - price_increment
      - quantity_increment
      properties:
        base:
          type: string
          description: The asset being bought - `BTC`.
        price_increment:
          $ref: '#/components/schemas/Price'
        quantity_increment:
          $ref: '#/components/schemas/Quantity'
          description: 'The smallest size step the venue accepts. See the precision note above

            for what this type can and cannot express.'
        quote:
          type: string
          description: The asset it is priced in - `USD`.
        symbol:
          type: string
          description: The venue's spelling - `BTC-USD` on Coinbase, `XXBTZUSD` on Kraken.
        venue:
          type: string
    ExerciseStyle:
      type: string
      enum:
      - american
      - european
    Currency:
      type: object
      description: A currency pair.
      required:
      - symbol
      - base
      - quote
      properties:
        base:
          type: string
          description: The currency being bought or sold - `EUR`.
        quote:
          type: string
          description: The currency it is priced in - `USD`.
        symbol:
          type: string
          description: The pair as the venue spells it - `EURUSD`, or `EUR/USD`.
    Equity:
      type: object
      description: A share in a listed company.
      required:
      - symbol
      properties:
        exchange:
          type:
          - string
          - 'null'
          description: 'The primary listing venue, where it was resolved.


            Where the security *is listed*, which is a fact the instruments

            catalogue owns - not where an order on it is sent. That is

            [`OrderVenue`](crate::broker::order::order_venue::OrderVenue), it lives

            on the order, and the two differ constantly: an equity listed on one

            exchange is routable to several, and two orders on this instrument can

            name different destinations while this field says the same thing for

            both.


            Optional because an equity can be traded without the listing ever being

            resolved - the order carries its own destination - so most equities

            reach this type without one.'
        symbol:
          type: string
    EvaluateResult:
      type: object
      required:
      - allowed
      - triggered
      properties:
        allowed:
          type: boolean
        triggered:
          type: array
          items:
            $ref: '#/components/schemas/TriggeredControl'
    PerpetualUnderlying:
      type: string
      description: 'What a [`Perpetual`] is a perpetual *on*.


        The mechanics do not change between these; the exposure does, and so does

        which desk is allowed to hold it.'
      enum:
      - UNSPECIFIED
      - CRYPTO
      - FUTURE
      - PREDICTION
    EvaluateRequest:
      type: object
      required:
      - account_id
      - symbol
      - quantity
      - instrument
      properties:
        account_id:
          type: string
          format: uuid
        instrument:
          $ref: '#/components/schemas/Instrument'
          description: 'What is being traded.


            Mandatory, and that is the safety property. A control has to be

            evaluated against the same instrument the order is placed in, so the

            caller resolves once and carries it: this service resolving

            independently would leave a window where it judged one instrument and

            the order was placed in another, which a catalogue sync between the

            two is enough to open.


            There is deliberately no "unknown" case. An order in something the

            catalogue cannot identify is not an order this platform can price, and

            the caller refuses it before reaching here rather than sending an

            absence for the evaluator to interpret.'
        quantity:
          $ref: '#/components/schemas/Quantity'
        side:
          oneOf:
          - type: 'null'
          - $ref: '#/components/schemas/OrderSide'
            description: 'Which way the order moves the position.


              Position size and daily loss limits need it: whether an order opens or

              closes a position is the whole question they ask. Optional on the wire

              so a caller built before it existed still parses, but a request without

              it is refused by any control that needs it rather than guessed at.'
        symbol:
          type: string
          description: 'The venue''s spelling, which is what symbol-scoped controls are keyed

            on. Kept beside `instrument` rather than read out of it: a control the

            tenant wrote against `ESZ25` has to match whether or not the catalogue

            resolved that order, and the key must not change depending on whether

            the resolution succeeded.'
    ControlScope:
      oneOf:
      - type: object
        required:
        - Organization
        properties:
          Organization:
            type: string
            format: uuid
      - type: object
        required:
        - Account
        properties:
          Account:
            type: string
            format: uuid
      - type: object
        required:
        - Symbol
        properties:
          Symbol:
            type: object
            required:
            - account_id
            - symbol
            properties:
              account_id:
                type: string
                format: uuid
              symbol:
                type: string
    Instrument:
      oneOf:
      - allOf:
        - $ref: '#/components/schemas/Equity'
        - type: object
          required:
          - asset_class
          properties:
            asset_class:
              type: string
              enum:
              - EQUITY
      - allOf:
        - $ref: '#/components/schemas/Future'
        - type: object
          required:
          - asset_class
          properties:
            asset_class:
              type: string
              enum:
              - FUTURE
      - allOf:
        - $ref: '#/components/schemas/OptionInstrument'
        - type: object
          required:
          - asset_class
          properties:
            asset_class:
              type: string
              enum:
              - OPTION
      - allOf:
        - $ref: '#/components/schemas/Currency'
        - type: object
          required:
          - asset_class
          properties:
            asset_class:
              type: string
              enum:
              - CURRENCY
      - allOf:
        - $ref: '#/components/schemas/Crypto'
        - type: object
          required:
          - asset_class
          properties:
            asset_class:
              type: string
              enum:
              - CRYPTO
      - allOf:
        - $ref: '#/components/schemas/Perpetual'
        - type: object
          required:
          - asset_class
          properties:
            asset_class:
              type: string
              enum:
              - PERPETUAL
      - allOf:
        - $ref: '#/components/schemas/Prediction'
        - type: object
          required:
          - asset_class
          properties:
            asset_class:
              type: string
              enum:
              - PREDICTION
      description: 'A tradable instrument, with the facts that make its price mean something.


        Not `Copy` - every variant carries at least one venue-spelled string - and

        deliberately `Eq` and `Hash`, so it can key a position map and sit inside

        the order parameter types, which are hashed.'
    Future:
      type: object
      description: A dated futures contract.
      required:
      - symbol
      - root
      - exchange
      - expiration
      - tick_size
      - multiplier
      - currency
      properties:
        currency:
          type: string
          description: What a point is denominated in - `USD`.
        exchange:
          type: string
          description: 'The exchange, in that exchange''s own spelling - `CME`, `CBOT`, `NYMEX`.


            A string rather than an enum because the set is open and every vendor

            spells it differently: Rithmic says `CME` where Databento says

            `GLBX.MDP3` for the same venue. An enum would have to pick one spelling

            and translate the rest, and this string goes back out on the order.'
        expiration:
          type: string
          format: date-time
          description: 'Last trade, not settlement - the moment the contract stops being

            tradable, which is what an adapter needs to know before sending.'
        multiplier:
          $ref: '#/components/schemas/Multiplier'
          description: Currency per full point of price movement - `50.0` for ES.
        root:
          type: string
          description: 'The contract family the month belongs to - `ES`.


            Held separately because it is what a strategy is actually expressed in.

            A position in "the ES front month" outlives any one `symbol`, and

            recovering the root by trimming characters off the end of a symbol is

            guesswork the venue already answered.'
        symbol:
          type: string
          description: The venue's spelling of this contract month - `ESZ5`, or `ESZ25`.
        tick_size:
          $ref: '#/components/schemas/Price'
    Price:
      type: string
    OptionInstrument:
      type: object
      description: A listed option on an equity or an index.
      required:
      - symbol
      - underlying
      - expiration
      - strike
      - option_type
      - exercise_style
      - multiplier
      properties:
        exchange:
          type:
          - string
          - 'null'
        exercise_style:
          $ref: '#/components/schemas/ExerciseStyle'
        expiration:
          type: string
          format: date-time
        multiplier:
          $ref: '#/components/schemas/Multiplier'
          description: Shares per contract - `100.0` for a standard listed option.
        option_type:
          $ref: '#/components/schemas/OptionType'
        strike:
          $ref: '#/components/schemas/Price'
        symbol:
          type: string
          description: The OCC ticker.
        tick_size:
          oneOf:
          - type: 'null'
          - $ref: '#/components/schemas/Price'
        underlying:
          type: string
    Quantity:
      type: string
    ControlType:
      type: string
      enum:
      - Manual
      - Time
      - Risk
    FundingSchedule:
      type: object
      description: 'How often a [`Perpetual`] exchanges funding.


        The schedule, not the rate - see the note on [`Perpetual`] for why the rate

        is deliberately absent.'
      required:
      - interval_seconds
      properties:
        interval_seconds:
          type: integer
          format: int32
          description: 'Seconds between funding exchanges. Eight hours on most venues, one hour

            on some, and a handful settle continuously.'
          minimum: 0
    Multiplier:
      type: string
    Prediction:
      type: object
      description: 'A binary event contract, settling at [`Self::payout`] or at nothing.


        The price is a probability rather than a value, which is what separates this

        from everything else here: a contract trading at `0.62` is the market saying

        sixty-two percent, and it pays `payout` if the event resolves true. Sizing

        it with a share-price formula produces a number with no meaning.'
      required:
      - symbol
      - market
      - outcome
      - venue
      - payout
      - currency
      - tick_size
      properties:
        currency:
          type: string
          description: 'What the payout is denominated in - `USD` on Kalshi, `USDC` on

            Polymarket.'
        expiration:
          type:
          - string
          - 'null'
          format: date-time
          description: 'When the event resolves, where the venue has published it.


            `None` for a market resolving on an event rather than a clock - "when

            the bill passes" has no date until it does.'
        market:
          type: string
          description: 'The market this contract is one side of.


            Both sides of an event are separately tradable instruments with their

            own books, so the pair is only recoverable through this.'
        outcome:
          $ref: '#/components/schemas/PredictionOutcome'
          description: Which side of the market this contract pays on.
        payout:
          $ref: '#/components/schemas/Price'
          description: 'What one contract pays if it resolves in its favour - `1.0` on Kalshi

            and Polymarket both.'
        symbol:
          type: string
          description: 'The venue''s identifier for this contract - a Kalshi market ticker, or a

            Polymarket token id.'
        tick_size:
          $ref: '#/components/schemas/Price'
        venue:
          type: string
  securitySchemes:
    apiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT
    clientCredentials:
      type: http
      scheme: bearer
      bearerFormat: JWT
      description: Machine bearer token minted via the client_credentials grant.
x-tagGroups:
- name: Organization
  tags:
  - Organization Controls
- name: Account
  tags:
  - Account Manual Controls
  - Account Risk Controls
  - Account Time Controls
- name: Symbols
  tags:
  - Symbol Manual Controls
  - Symbol Risk Controls
  - Symbol Time Controls
  - Effective Controls
- name: Evaluation
  tags:
  - Control Evaluation