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

# Route survival

> The wedge, not the score. An agent about to move real money needs "can I get out at size, measured today" more than "is this good". This is the same verdict `refreshAllRouteScreens` writes daily and the live engine uses to gate deposits — exposed read-only. Round trip, on the protocol's own execution path, so no pricing oracle is involved: USDC compared against USDC.

A vault that has never been screened returns `screened: false` with every measurement field `null` — never a fabricated verdict.



## OpenAPI

````yaml api-reference/openapi.yaml GET /vaults/{chainId}/{address}/route
openapi: 3.1.0
info:
  title: AtlasYield API
  version: '1.0'
  description: >-
    Read-only access to the Atlas Score Index: neutral 16-factor vault scores
    across four pillars — Yield, Safety, Liquidity, Sustainability — plus the
    tracked vault catalog and the Atlas Engine, which turns those scores into a
    risk-adjusted allocation. Research and information, not investment advice.

    Every endpoint in this spec is public and keyless, limited to 60 requests
    per minute per IP. An optional partner key sent in the `x-api-key` header
    moves the caller to its own bucket of 100 requests per minute and unlocks
    two endpoints that are not part of this spec (every vault's factor breakdown
    in one call, and score history). A key is never required: an unknown or
    retired key sent to a public endpoint is ignored, and only the two partner
    endpoints reject it, with a 401. How to get one:
    https://docs.atlasyield.club/partner-access
servers:
  - url: https://api.atlasyield.club/v1
security:
  - {}
  - PartnerKey: []
paths:
  /vaults/{chainId}/{address}/route:
    get:
      summary: Route-survival verdict for one vault
      description: >-
        The wedge, not the score. An agent about to move real money needs "can I
        get out at size, measured today" more than "is this good". This is the
        same verdict `refreshAllRouteScreens` writes daily and the live engine
        uses to gate deposits — exposed read-only. Round trip, on the protocol's
        own execution path, so no pricing oracle is involved: USDC compared
        against USDC.


        A vault that has never been screened returns `screened: false` with
        every measurement field `null` — never a fabricated verdict.
      operationId: getVaultRoute
      parameters:
        - name: chainId
          in: path
          required: true
          schema:
            type: integer
          description: EVM chain id the vault lives on.
          example: 1
        - name: address
          in: path
          required: true
          schema:
            type: string
          description: Vault contract address. Case-insensitive.
          example: '0x5949c3bfdf9babd8bf011d9d8dbb1a2c3e10d8b8'
        - name: notional
          in: query
          required: false
          description: USD size to cost the round trip at. 10 to 10,000,000, default 5,000.
          schema:
            type: number
            minimum: 10
            maximum: 10000000
            default: 5000
      responses:
        '200':
          description: >-
            The most recent route-survival verdict for the vault, or the
            unscreened shape.
          content:
            application/json:
              schema:
                type: object
                properties:
                  success:
                    type: boolean
                    example: true
                  disclaimer:
                    type: string
                    example: Research and information, not investment advice.
                  data:
                    $ref: '#/components/schemas/VaultRoute'
        '400':
          $ref: '#/components/responses/ValidationError'
components:
  schemas:
    VaultRoute:
      type: object
      description: >-
        Round-trip route-survival verdict for one vault: send USDC in, take the
        position, sell it straight back, on the exact path the app itself
        executes. "Can I get out at size, measured today" — not a liquidity
        claim, a real quote. SAME-CHAIN ONLY: funding USDC sits on the vault's
        own chain. Nothing here describes bridging in from another chain (see
        `probe`).
      properties:
        vaultId:
          type: string
          nullable: true
          description: 'Stable identifier: protocol:chainId:address. Null when unscreened.'
          example: pendle:1:0x5949c3bfdf9babd8bf011d9d8dbb1a2c3e10d8b8
        chainId:
          type: integer
          example: 1
        screened:
          type: boolean
          description: >-
            False when this vault has never been screened — no verdict is
            fabricated.
          example: true
        verdict:
          type: string
          nullable: true
          enum:
            - OK
            - DEGRADED
            - DANGEROUS
            - UNPRICEABLE
            - NO_ROUTE
            - SKIPPED
            - null
          description: >-
            OK/DEGRADED are tradable. DANGEROUS, UNPRICEABLE and NO_ROUTE block
            deposits in the live engine. SKIPPED means our own probe was
            rate-limited, not a statement about the vault. Null when unscreened.
          example: OK
        reasonClass:
          type: string
          nullable: true
          enum:
            - protocol_refused
            - no_aggregator_quote
            - dust
            - no_amount
            - rate_limited
            - unmapped
            - null
          description: >-
            Why a non-OK verdict was reached. `protocol_refused`: the protocol's
            own router (Pendle Convert) refuses the position — the vault is dead
            for entry or exit. `no_aggregator_quote`: no same-chain aggregator
            quotes USDC into the underlying (typical for LP-token vaults); the
            vault may still be exitable by redeeming and unwinding by hand.
            `dust`: value came back but below the 85% floor. Null for
            OK/DEGRADED.
          example: protocol_refused
        usdIn:
          type: number
          nullable: true
          description: USDC sent on the worst probed notional.
          example: 5000
        usdOut:
          type: number
          nullable: true
          description: USDC that came back after entering and exiting the position.
          example: 4991
        retained:
          type: number
          nullable: true
          description: usdOut / usdIn on the worst probed notional.
          example: 0.9982
        path:
          type: string
          nullable: true
          enum:
            - pendle
            - composer
            - native
            - null
          description: Which execution path was probed — the same one the app itself calls.
          example: pendle
        probe:
          type: object
          description: >-
            What was measured, stated on every response. `scope` is always
            `same-chain`; `crossChain` is always `not probed`.
          properties:
            scope:
              type: string
              example: same-chain
            funding:
              type: string
            legs:
              type: string
            notionalsUsd:
              type: array
              items:
                type: number
              example:
                - 100
                - 5000
            router:
              type: object
              additionalProperties:
                type: string
            crossChain:
              type: string
              example: not probed
        checkedAt:
          type: string
          format: date-time
          nullable: true
          description: When this verdict was last measured. Null when unscreened.
        cost:
          $ref: '#/components/schemas/RouteCost'
    RouteCost:
      type: object
      nullable: true
      description: >-
        Estimated round-trip execution cost at `notionalUsd`, same-chain, on the
        named router. fixedUsd = (vault entry + exit + swap + router approvals)
        gas × USD per gas; allInBps = fixedUsd / notional + proportional (router
        fee + price impact). An ESTIMATE at the stated gas basis: realised cost
        varies with gas at execution time. Null when the vault never completed a
        round trip. Unmeasured inputs are listed in `missing`; where a component
        is known to be missing, the figure is marked `floor: true` (a lower
        bound).
      properties:
        notionalUsd:
          type: number
          example: 10000
        router:
          type: string
          enum:
            - lifi
            - pendle-convert
            - none
          description: >-
            `none` = same token in and out, nothing swapped. Costs differ by
            router: the Atlas app deposits via Relay.
        gasBasis:
          type: string
          enum:
            - p50_7d
          description: Headline basis. Trailing 7-day median
          so a single spike cannot set it.: null
        fixedUsd:
          type: object
          properties:
            current:
              type: number
              nullable: true
            p50_7d:
              type: number
              nullable: true
            p90_7d:
              type: number
              nullable: true
            floor:
              type: boolean
              description: >-
                True when a component is known to be missing (L1 data fee on L2s
                (Base, Optimism, Arbitrum), or router gas not reported): the
                true figure is higher.
        gasUnits:
          type: object
          properties:
            swap:
              type: integer
              nullable: true
            vaultEntry:
              type: integer
            vaultExit:
              type: integer
            approvals:
              type: integer
              description: >-
                USDC->router on entry + underlying->router on exit. LiFi only; 0
                for Pendle Convert or a same-token round trip.
            total:
              type: integer
            vaultGasSource:
              type: string
              enum:
                - observed
                - assumed
              description: >-
                `observed` = median of real transactions; `assumed` = no
                transaction exists yet.
            highVariance:
              type: boolean
              description: >-
                True when the protocol's vault-action gas is a median of
                observed exits that disagreed by more than 2x.
        proportionalBps:
          type: object
          properties:
            value:
              type: number
              nullable: true
            routerFeeBps:
              type: number
              nullable: true
            priceImpactBps:
              type: number
              nullable: true
            extrapolated:
              type: boolean
              description: >-
                True outside the probed $100–$5,000: the nearest probe is held
                flat, not fitted.
        allInBps:
          type: object
          properties:
            current:
              type: number
              nullable: true
            p50_7d:
              type: number
              nullable: true
            p90_7d:
              type: number
              nullable: true
            floor:
              type: boolean
              description: >-
                Same as fixedUsd.floor. True means these figures are a LOWER
                BOUND; treat as not passed in any gate.
        missing:
          type: array
          items:
            type: string
            enum:
              - swap_gas
              - l1_data_fee
              - gas_current
              - gas_history
              - no_route_at_size
              - gas_history_partial
              - high_variance_gas
  responses:
    ValidationError:
      description: >-
        A query parameter is missing or out of range. The body carries per-field
        detail under `details.fieldErrors`.
      content:
        application/json:
          schema:
            type: object
            properties:
              success:
                type: boolean
                example: false
              error:
                type: string
                example: Validation error
              details:
                type: object
                description: Zod field errors, keyed by parameter name.
  securitySchemes:
    PartnerKey:
      type: apiKey
      in: header
      name: x-api-key
      description: >-
        Optional. Not needed for any endpoint in this spec. Unlocks the
        partner-only endpoints and a 100 requests per minute bucket (public
        limit is 60 per IP).

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.