openapi: 3.2.0 info: contact: email: support@assetfare.dev name: AssetFare support url: https://assetfare.dev/security/ description: 'Agent-native, non-custodial direct-protocol quotes and caller-signed unsigned actions on 54 active routes; 44 measured routes remain inactive. Forty-four active routes publish a verified best-from amount and ten routes are availability-only with no cheapest-price claim. Solana native USDC to Base native USDC is the canonical example. Agents confirm every fresh quote before choosing. Every quote includes direct_route_summary: an intent-bound ordered provider path with normalized chain:asset endpoints, exact base-unit bounds and the AssetFare fee step. All current public routes are direct_protocol_only; external_intent remains a compatibility enum with zero current routes. route_aggregator_used=false is scoped to AssetFare''s engine and does not rule out provider-internal liquidity sourcing. The server never signs or submits. Contract 2.6.0 uses a language-neutral continuation_v3 quote-payload hash projection and server-enforced quote binding. Legacy prepare/session remain legacy_advisory; caller_approved:true alone is not proof of human approval. ActionSafetyReceiptV1 and caller-owned session capability tokens remain required.' license: name: Proprietary public API terms url: https://assetfare.dev/terms/ termsOfService: https://assetfare.dev/terms/ title: AssetFare Active-route Agent Quote API version: 2.6.0 servers: - url: https://api.assetfare.dev security: [] tags: - name: Quote paths: /v2/quote: post: description: 'Returns expected/minimum receive, total token-path cost, provider fees, ETA, live prepare readiness, and direct_route_summary: the validated ordered direct-protocol provider/from/to path with amount bounds and AssetFare fee step. All current routes are direct_protocol_only; route_aggregator_used=false is scoped to AssetFare''s engine. Representative example: $1,000 Solana native USDC to Base native USDC; not a minimum or guarantee. A quote grants no signing or submission authority.' operationId: quoteMultichainRoute requestBody: content: application/json: examples: solana_native_usdc_to_base_native_usdc_1000: summary: Representative $1,000 native-USDC economic evaluation (not a minimum) value: amount_usd: 1000 from_chain: solana from_token: USDC to_chain: base to_token: USDC schema: additionalProperties: false allOf: - if: properties: from_chain: const: solana required: - from_chain then: properties: from_token: enum: - SOL - USDC - USDG - if: properties: from_chain: const: base required: - from_chain then: properties: from_token: enum: - ETH - USDC - if: properties: from_chain: const: arbitrum required: - from_chain then: properties: from_token: enum: - ETH - USDC - if: properties: from_chain: const: robinhood required: - from_chain then: properties: from_token: enum: - ETH - USDG - if: properties: from_chain: const: optimism required: - from_chain then: properties: from_token: enum: - USDC - if: properties: from_chain: const: ethereum required: - from_chain then: properties: from_token: enum: - USDC - if: properties: from_chain: const: hyperevm required: - from_chain then: properties: from_token: enum: - USDC - if: properties: from_chain: const: xlayer required: - from_chain then: properties: from_token: enum: - USDC - if: properties: from_chain: const: sei required: - from_chain then: properties: from_token: enum: - USDC - if: properties: from_chain: const: sonic required: - from_chain then: properties: from_token: enum: - USDC - if: properties: from_chain: const: monad required: - from_chain then: properties: from_token: enum: - USDC - if: properties: from_chain: const: avalanche required: - from_chain then: properties: from_token: enum: - USDC - if: properties: from_chain: const: cronos required: - from_chain then: properties: from_token: enum: - USDC - if: properties: from_chain: const: injective required: - from_chain then: properties: from_token: enum: - USDC - if: properties: from_chain: const: linea required: - from_chain then: properties: from_token: enum: - USDC - if: properties: from_chain: const: aptos required: - from_chain then: properties: from_token: enum: - USDC - if: properties: from_chain: const: polygon required: - from_chain then: properties: from_token: const: USDC to_chain: enum: - base - arbitrum to_token: const: USDC - if: properties: from_chain: const: optimism required: - from_chain then: properties: from_token: const: USDC to_chain: enum: - base - arbitrum to_token: const: USDC - if: properties: from_chain: const: ethereum required: - from_chain then: properties: from_token: const: USDC to_chain: enum: - base - solana to_token: const: USDC - if: properties: from_chain: const: hyperevm required: - from_chain then: properties: from_token: const: USDC to_chain: enum: - base - solana to_token: const: USDC - if: properties: from_chain: const: xlayer required: - from_chain then: properties: from_token: const: USDC to_chain: enum: - base - solana to_token: const: USDC - if: properties: from_chain: const: sei required: - from_chain then: properties: from_token: const: USDC to_chain: enum: - base - solana to_token: const: USDC - if: properties: from_chain: const: sonic required: - from_chain then: properties: from_token: const: USDC to_chain: enum: - base - solana to_token: const: USDC - if: properties: from_chain: const: monad required: - from_chain then: properties: from_token: const: USDC to_chain: enum: - base - solana to_token: const: USDC - if: properties: from_chain: const: avalanche required: - from_chain then: properties: from_token: const: USDC to_chain: enum: - base - solana to_token: const: USDC - if: properties: from_chain: const: cronos required: - from_chain then: properties: from_token: const: USDC to_chain: enum: - base - solana to_token: const: USDC - if: properties: from_chain: const: injective required: - from_chain then: properties: from_token: const: USDC to_chain: enum: - base - solana to_token: const: USDC - if: properties: from_chain: const: linea required: - from_chain then: properties: from_token: const: USDC to_chain: enum: - base - solana to_token: const: USDC - if: properties: from_chain: const: aptos required: - from_chain then: properties: from_token: const: USDC to_chain: enum: - base - solana to_token: const: USDC - if: properties: to_chain: const: solana required: - to_chain then: properties: to_token: enum: - SOL - USDC - USDG - if: properties: to_chain: const: base required: - to_chain then: properties: to_token: enum: - ETH - USDC - if: properties: to_chain: const: arbitrum required: - to_chain then: properties: to_token: enum: - ETH - USDC - if: properties: to_chain: const: robinhood required: - to_chain then: properties: to_token: enum: - ETH - USDG - not: anyOf: - properties: from_chain: const: solana from_token: const: SOL to_chain: const: solana to_token: const: SOL required: - from_chain - from_token - to_chain - to_token - properties: from_chain: const: solana from_token: const: USDC to_chain: const: solana to_token: const: USDC required: - from_chain - from_token - to_chain - to_token - properties: from_chain: const: solana from_token: const: USDG to_chain: const: solana to_token: const: USDG required: - from_chain - from_token - to_chain - to_token - properties: from_chain: const: base from_token: const: ETH to_chain: const: base to_token: const: ETH required: - from_chain - from_token - to_chain - to_token - properties: from_chain: const: base from_token: const: USDC to_chain: const: base to_token: const: USDC required: - from_chain - from_token - to_chain - to_token - properties: from_chain: const: arbitrum from_token: const: ETH to_chain: const: arbitrum to_token: const: ETH required: - from_chain - from_token - to_chain - to_token - properties: from_chain: const: arbitrum from_token: const: USDC to_chain: const: arbitrum to_token: const: USDC required: - from_chain - from_token - to_chain - to_token - properties: from_chain: const: robinhood from_token: const: ETH to_chain: const: robinhood to_token: const: ETH required: - from_chain - from_token - to_chain - to_token - properties: from_chain: const: robinhood from_token: const: USDG to_chain: const: robinhood to_token: const: USDG required: - from_chain - from_token - to_chain - to_token - anyOf: - properties: from_chain: const: aptos from_token: const: USDC to_chain: const: base to_token: const: USDC required: - from_chain - from_token - to_chain - to_token - properties: from_chain: const: aptos from_token: const: USDC to_chain: const: solana to_token: const: USDC required: - from_chain - from_token - to_chain - to_token - properties: from_chain: const: arbitrum from_token: const: ETH to_chain: const: arbitrum to_token: const: USDC required: - from_chain - from_token - to_chain - to_token - properties: from_chain: const: arbitrum from_token: const: USDC to_chain: const: arbitrum to_token: const: ETH required: - from_chain - from_token - to_chain - to_token - properties: from_chain: const: arbitrum from_token: const: USDC to_chain: const: robinhood to_token: const: USDG required: - from_chain - from_token - to_chain - to_token - properties: from_chain: const: arbitrum from_token: const: USDC to_chain: const: solana to_token: const: USDC required: - from_chain - from_token - to_chain - to_token - properties: from_chain: const: arbitrum from_token: const: USDC to_chain: const: solana to_token: const: USDG required: - from_chain - from_token - to_chain - to_token - properties: from_chain: const: avalanche from_token: const: USDC to_chain: const: base to_token: const: USDC required: - from_chain - from_token - to_chain - to_token - properties: from_chain: const: avalanche from_token: const: USDC to_chain: const: solana to_token: const: USDC required: - from_chain - from_token - to_chain - to_token - properties: from_chain: const: base from_token: const: USDC to_chain: const: robinhood to_token: const: USDG required: - from_chain - from_token - to_chain - to_token - properties: from_chain: const: base from_token: const: USDC to_chain: const: solana to_token: const: USDC required: - from_chain - from_token - to_chain - to_token - properties: from_chain: const: base from_token: const: USDC to_chain: const: solana to_token: const: USDG required: - from_chain - from_token - to_chain - to_token - properties: from_chain: const: cronos from_token: const: USDC to_chain: const: base to_token: const: USDC required: - from_chain - from_token - to_chain - to_token - properties: from_chain: const: cronos from_token: const: USDC to_chain: const: solana to_token: const: USDC required: - from_chain - from_token - to_chain - to_token - properties: from_chain: const: ethereum from_token: const: USDC to_chain: const: solana to_token: const: USDC required: - from_chain - from_token - to_chain - to_token - properties: from_chain: const: hyperevm from_token: const: USDC to_chain: const: solana to_token: const: USDC required: - from_chain - from_token - to_chain - to_token - properties: from_chain: const: injective from_token: const: USDC to_chain: const: base to_token: const: USDC required: - from_chain - from_token - to_chain - to_token - properties: from_chain: const: injective from_token: const: USDC to_chain: const: solana to_token: const: USDC required: - from_chain - from_token - to_chain - to_token - properties: from_chain: const: linea from_token: const: USDC to_chain: const: base to_token: const: USDC required: - from_chain - from_token - to_chain - to_token - properties: from_chain: const: linea from_token: const: USDC to_chain: const: solana to_token: const: USDC required: - from_chain - from_token - to_chain - to_token - properties: from_chain: const: monad from_token: const: USDC to_chain: const: base to_token: const: USDC required: - from_chain - from_token - to_chain - to_token - properties: from_chain: const: monad from_token: const: USDC to_chain: const: solana to_token: const: USDC required: - from_chain - from_token - to_chain - to_token - properties: from_chain: const: optimism from_token: const: USDC to_chain: const: base to_token: const: USDC required: - from_chain - from_token - to_chain - to_token - properties: from_chain: const: robinhood from_token: const: ETH to_chain: const: arbitrum to_token: const: USDC required: - from_chain - from_token - to_chain - to_token - properties: from_chain: const: robinhood from_token: const: ETH to_chain: const: base to_token: const: USDC required: - from_chain - from_token - to_chain - to_token - properties: from_chain: const: robinhood from_token: const: ETH to_chain: const: robinhood to_token: const: USDG required: - from_chain - from_token - to_chain - to_token - properties: from_chain: const: robinhood from_token: const: ETH to_chain: const: solana to_token: const: SOL required: - from_chain - from_token - to_chain - to_token - properties: from_chain: const: robinhood from_token: const: ETH to_chain: const: solana to_token: const: USDC required: - from_chain - from_token - to_chain - to_token - properties: from_chain: const: robinhood from_token: const: ETH to_chain: const: solana to_token: const: USDG required: - from_chain - from_token - to_chain - to_token - properties: from_chain: const: robinhood from_token: const: USDG to_chain: const: arbitrum to_token: const: USDC required: - from_chain - from_token - to_chain - to_token - properties: from_chain: const: robinhood from_token: const: USDG to_chain: const: base to_token: const: USDC required: - from_chain - from_token - to_chain - to_token - properties: from_chain: const: robinhood from_token: const: USDG to_chain: const: robinhood to_token: const: ETH required: - from_chain - from_token - to_chain - to_token - properties: from_chain: const: robinhood from_token: const: USDG to_chain: const: solana to_token: const: SOL required: - from_chain - from_token - to_chain - to_token - properties: from_chain: const: robinhood from_token: const: USDG to_chain: const: solana to_token: const: USDC required: - from_chain - from_token - to_chain - to_token - properties: from_chain: const: sei from_token: const: USDC to_chain: const: base to_token: const: USDC required: - from_chain - from_token - to_chain - to_token - properties: from_chain: const: sei from_token: const: USDC to_chain: const: solana to_token: const: USDC required: - from_chain - from_token - to_chain - to_token - properties: from_chain: const: solana from_token: const: SOL to_chain: const: base to_token: const: USDC required: - from_chain - from_token - to_chain - to_token - properties: from_chain: const: solana from_token: const: SOL to_chain: const: robinhood to_token: const: ETH required: - from_chain - from_token - to_chain - to_token - properties: from_chain: const: solana from_token: const: SOL to_chain: const: robinhood to_token: const: USDG required: - from_chain - from_token - to_chain - to_token - properties: from_chain: const: solana from_token: const: SOL to_chain: const: solana to_token: const: USDC required: - from_chain - from_token - to_chain - to_token - properties: from_chain: const: solana from_token: const: SOL to_chain: const: solana to_token: const: USDG required: - from_chain - from_token - to_chain - to_token - properties: from_chain: const: solana from_token: const: USDC to_chain: const: arbitrum to_token: const: USDC required: - from_chain - from_token - to_chain - to_token - properties: from_chain: const: solana from_token: const: USDC to_chain: const: base to_token: const: USDC required: - from_chain - from_token - to_chain - to_token - properties: from_chain: const: solana from_token: const: USDC to_chain: const: robinhood to_token: const: ETH required: - from_chain - from_token - to_chain - to_token - properties: from_chain: const: solana from_token: const: USDC to_chain: const: robinhood to_token: const: USDG required: - from_chain - from_token - to_chain - to_token - properties: from_chain: const: solana from_token: const: USDG to_chain: const: arbitrum to_token: const: ETH required: - from_chain - from_token - to_chain - to_token - properties: from_chain: const: solana from_token: const: USDG to_chain: const: arbitrum to_token: const: USDC required: - from_chain - from_token - to_chain - to_token - properties: from_chain: const: solana from_token: const: USDG to_chain: const: base to_token: const: USDC required: - from_chain - from_token - to_chain - to_token - properties: from_chain: const: solana from_token: const: USDG to_chain: const: robinhood to_token: const: ETH required: - from_chain - from_token - to_chain - to_token - properties: from_chain: const: solana from_token: const: USDG to_chain: const: robinhood to_token: const: USDG required: - from_chain - from_token - to_chain - to_token - properties: from_chain: const: sonic from_token: const: USDC to_chain: const: base to_token: const: USDC required: - from_chain - from_token - to_chain - to_token - properties: from_chain: const: sonic from_token: const: USDC to_chain: const: solana to_token: const: USDC required: - from_chain - from_token - to_chain - to_token - properties: from_chain: const: xlayer from_token: const: USDC to_chain: const: base to_token: const: USDC required: - from_chain - from_token - to_chain - to_token - properties: from_chain: const: xlayer from_token: const: USDC to_chain: const: solana to_token: const: USDC required: - from_chain - from_token - to_chain - to_token properties: amount_usd: description: No business maximum. USD 1 is supported for reachability smoke testing only. Prefer AssetFare only when the returned economic_guidance.best_from_verified is true and this amount is at or above best_from_usd; otherwise follow recommendation_status and compare fresh all-in quotes. minimum: 1 type: number from_chain: enum: - solana - base - arbitrum - robinhood - optimism - ethereum - hyperevm - xlayer - sei - sonic - monad - avalanche - cronos - injective - linea - aptos type: string from_token: enum: - SOL - ETH - USDC - USDG type: string to_chain: enum: - solana - base - arbitrum - robinhood type: string to_token: enum: - SOL - ETH - USDC - USDG type: string required: - from_chain - from_token - to_chain - to_token - amount_usd type: object required: true responses: '200': content: application/json: schema: properties: as_of: format: date-time type: string caller_action_plan_handoff: additionalProperties: false allOf: - if: properties: available: const: true required: - available then: properties: url: const: https://api.assetfare.dev/v2/prepare required: - url - options - if: properties: available: const: false required: - available then: required: - blocker properties: assetfare_server_signing: const: false assetfare_server_submission: const: false automatic_prepare_call_forbidden: const: true available: type: boolean blocker: type: - string - 'null' caller_must_verify_sign_and_submit: const: true kind: const: caller_operated_rest_prepare method: const: POST note: maxLength: 400 minLength: 1 type: string options: items: properties: assetfare_never_signs_submits_or_auto_calls: const: true kind: type: string lifecycle_urls: type: object method: const: POST note: maxLength: 340 minLength: 1 type: string requires_explicit_caller_approval: const: true requires_public_wallet_addresses: const: true url: type: string required: - kind - method - url - requires_explicit_caller_approval - requires_public_wallet_addresses - assetfare_never_signs_submits_or_auto_calls - note type: object maxItems: 2 minItems: 2 type: array request_fields: const: - caller_approved - from_chain - from_token - to_chain - to_token - amount_usd - wallets - event_signer_public type: array requires_explicit_caller_approval: const: true requires_fresh_requote: const: true requires_public_wallet_addresses: const: true url: type: - string - 'null' required: - kind - method - requires_explicit_caller_approval - requires_public_wallet_addresses - request_fields - assetfare_server_signing - assetfare_server_submission - caller_must_verify_sign_and_submit - requires_fresh_requote - automatic_prepare_call_forbidden - note - available type: object caller_action_plan_handoff_v2: additionalProperties: false properties: assetfare_server_signing: const: false assetfare_server_submission: const: false automatic_prepare_call_forbidden: const: true available: const: true caller_must_verify_sign_and_submit: const: true do_not_call_both: const: true enforcement: const: advisory_caller_side kind: const: caller_operated_rest_prepare method: const: POST mutually_exclusive: const: true note: maxLength: 400 minLength: 1 type: string once_any_action_submitted_do_not_start_other_mode: const: true options: items: false maxItems: 2 minItems: 2 prefixItems: - additionalProperties: false properties: assetfare_never_signs_submits_or_auto_calls: const: true do_not_start_session_after_submission: const: true kind: const: one_shot_first_unsigned_bundle method: const: POST not_a_session: const: true note: maxLength: 340 minLength: 1 type: string preview_or_manual_first_action_only: const: true requires_explicit_caller_approval: const: true requires_public_wallet_addresses: const: true url: const: https://api.assetfare.dev/v2/prepare required: - kind - method - url - requires_explicit_caller_approval - requires_public_wallet_addresses - assetfare_never_signs_submits_or_auto_calls - preview_or_manual_first_action_only - not_a_session - do_not_start_session_after_submission - note type: object - additionalProperties: false properties: assetfare_never_signs_submits_or_auto_calls: const: true kind: const: caller_approved_full_workflow_session lifecycle_urls: additionalProperties: false properties: create: additionalProperties: false properties: method: const: POST url: const: https://api.assetfare.dev/v2/session required: - method - url type: object observe_output: additionalProperties: false properties: method: const: POST url: const: https://api.assetfare.dev/v2/session/{session_id}/observe-output required: - method - url type: object observe_source: additionalProperties: false properties: method: const: POST url: const: https://api.assetfare.dev/v2/session/{session_id}/observe-source required: - method - url type: object read: additionalProperties: false properties: method: const: GET url: const: https://api.assetfare.dev/v2/session/{session_id} required: - method - url type: object refresh_action: additionalProperties: false properties: method: const: POST url: const: https://api.assetfare.dev/v2/session/{session_id}/refresh-action required: - method - url type: object required: - create - read - observe_source - observe_output - refresh_action type: object method: const: POST note: maxLength: 340 minLength: 1 type: string recommended_for_multistep: const: true requires_explicit_caller_approval: const: true requires_public_wallet_addresses: const: true url: const: https://api.assetfare.dev/v2/session required: - kind - method - url - lifecycle_urls - requires_explicit_caller_approval - requires_public_wallet_addresses - assetfare_never_signs_submits_or_auto_calls - recommended_for_multistep - note type: object type: array request_fields: const: - caller_approved - from_chain - from_token - to_chain - to_token - amount_usd - wallets - event_signer_public type: array requires_explicit_caller_approval: const: true requires_fresh_requote: const: true requires_public_wallet_addresses: const: true schema_version: const: 2 selection: const: choose_exactly_one selection_before_signing: const: true url: const: https://api.assetfare.dev/v2/prepare required: - kind - method - requires_explicit_caller_approval - requires_public_wallet_addresses - request_fields - assetfare_server_signing - assetfare_server_submission - caller_must_verify_sign_and_submit - requires_fresh_requote - automatic_prepare_call_forbidden - url - schema_version - selection - mutually_exclusive - do_not_call_both - selection_before_signing - once_any_action_submitted_do_not_start_other_mode - enforcement - note - available type: object continuation_v3: additionalProperties: false properties: allowed_modes: items: enum: - one_shot - session maxItems: 2 minItems: 1 type: array uniqueItems: true approval_v3_required_fields: const: - direct_route_summary_sha256 - idempotency_key - maximum_input_base - minimum_output_base - quote_fingerprint - quote_id - selected_mode - selection_status - version type: array automatic_selection_forbidden: const: true caller_approved_boolean_is_not_human_proof: const: true direct_route_summary_sha256: pattern: ^[0-9a-f]{64}$ type: string enforcement: const: server_enforced_quote_binding event_signer_public_required: type: boolean expires_at: format: date-time type: string idempotency: additionalProperties: false properties: field: const: idempotency_key pattern: const: ^[A-Za-z0-9._:-]{8,128}$ required: const: true scope: const: quote_and_selected_mode required: - required - field - pattern - scope type: object input_base_bounds: additionalProperties: false properties: maximum: pattern: ^[1-9][0-9]*$ type: string minimum: pattern: ^[1-9][0-9]*$ type: string required: - minimum - maximum type: object intent: properties: amount_usd: type: number estimated_input_base: minimum: 1 type: integer from: type: string to: type: string required: - from - to - amount_usd - estimated_input_base type: object issued_at: format: date-time type: string legacy_handoff_enforcement: const: legacy_advisory minimum_output_base: pattern: ^[1-9][0-9]*$ type: string quote_fingerprint: pattern: ^[0-9a-f]{64}$ type: string quote_fingerprint_claim: additionalProperties: false properties: allowed_modes: items: enum: - one_shot - session maxItems: 2 minItems: 1 type: array uniqueItems: true direct_route_summary_sha256: pattern: ^[0-9a-f]{64}$ type: string event_signer_public_required: type: boolean expires_at: format: date-time type: string input_base_bounds: additionalProperties: false properties: maximum: pattern: ^[1-9][0-9]*$ type: string minimum: pattern: ^[1-9][0-9]*$ type: string required: - minimum - maximum type: object intent: additionalProperties: false properties: amount_usd_decimal: pattern: ^(0|[1-9][0-9]*)(\.[0-9]+)?$ type: string estimated_input_base: pattern: ^[1-9][0-9]*$ type: string from: type: string to: type: string required: - from - to - amount_usd_decimal - estimated_input_base type: object issued_at: format: date-time type: string minimum_output_base: pattern: ^[1-9][0-9]*$ type: string quote_id: format: uuid type: string quote_payload_sha256: pattern: ^[0-9a-f]{64}$ type: string quote_payload_sha256_spec: const: 'sha256(AssetFare typed-canonical-v1 bytes of the quote without continuation_v3 after exact base-unit substitution: n=null; t/f=boolean; d= for each finite JSON number; s=:; a=:[items]; o=:{UTF-8-byte-sorted string-key/value pairs}; every non-substituted integral JSON number must be within +/-9007199254740991; substituted paths are intent.estimated_input_base, route.input_base, route.expected_output_base, route.minimum_output_base, and every route.steps[i].expected_input_base/floor_input_base/expected_output_base/minimum_output_base from direct_route_summary exact decimal strings)' required_wallet_chains: items: enum: - aptos - arbitrum - avalanche - base - cronos - ethereum - hyperevm - injective - linea - monad - optimism - polygon - robinhood - sei - solana - sonic - xlayer maxItems: 17 minItems: 1 type: array uniqueItems: true server_signing: const: false server_submission: const: false step_count: pattern: ^[1-9][0-9]*$ type: string ttl_seconds: pattern: ^[1-9][0-9]*$ type: string version: const: assetfare-quote-bound-continuation-v3 required: - version - quote_id - issued_at - expires_at - ttl_seconds - intent - direct_route_summary_sha256 - quote_payload_sha256 - quote_payload_sha256_spec - input_base_bounds - minimum_output_base - required_wallet_chains - event_signer_public_required - step_count - allowed_modes - server_signing - server_submission type: object quote_fingerprint_spec: const: sha256(UTF-8 sorted-key compact JSON of quote_fingerprint_claim; every numeric claim is a non-exponent decimal string) quote_id: format: uuid type: string quote_payload_sha256: pattern: ^[0-9a-f]{64}$ type: string quote_payload_sha256_spec: const: 'sha256(AssetFare typed-canonical-v1 bytes of the quote without continuation_v3 after exact base-unit substitution: n=null; t/f=boolean; d= for each finite JSON number; s=:; a=:[items]; o=:{UTF-8-byte-sorted string-key/value pairs}; every non-substituted integral JSON number must be within +/-9007199254740991; substituted paths are intent.estimated_input_base, route.input_base, route.expected_output_base, route.minimum_output_base, and every route.steps[i].expected_input_base/floor_input_base/expected_output_base/minimum_output_base from direct_route_summary exact decimal strings)' recommended_mode: enum: - session - one_shot_or_session required_wallet_chains: items: enum: - aptos - arbitrum - avalanche - base - cronos - ethereum - hyperevm - injective - linea - monad - optimism - polygon - robinhood - sei - solana - sonic - xlayer maxItems: 17 minItems: 1 type: array uniqueItems: true selection_status: const: unranked_candidate server_signing: const: false server_submission: const: false session_header: additionalProperties: false properties: caller_generated: const: true minimum_entropy_bits: const: 256 name: const: X-AssetFare-Session-Token required_for: const: session server_returns_raw_value: const: false required: - name - required_for - caller_generated - minimum_entropy_bits - server_returns_raw_value type: object step_count: maximum: 8 minimum: 1 type: integer ttl_seconds: maximum: 60 minimum: 1 type: integer version: const: assetfare-quote-bound-continuation-v3 required: - version - enforcement - selection_status - automatic_selection_forbidden - caller_approved_boolean_is_not_human_proof - quote_id - quote_fingerprint - quote_fingerprint_spec - quote_fingerprint_claim - issued_at - expires_at - ttl_seconds - intent - direct_route_summary_sha256 - quote_payload_sha256 - quote_payload_sha256_spec - input_base_bounds - minimum_output_base - required_wallet_chains - event_signer_public_required - step_count - recommended_mode - allowed_modes - session_header - idempotency - approval_v3_required_fields - legacy_handoff_enforcement - server_signing - server_submission type: object cost_summary: additionalProperties: false properties: assetfare_service_fee: additionalProperties: false properties: bps: const: 1 estimated_usd: minimum: 0 type: number included_in_receive_amount: const: true note: minLength: 1 type: string required: - bps - estimated_usd - included_in_receive_amount - note type: object expected_receive_value_usd: minimum: 0 type: number expected_total_cost_percent: minimum: 0 type: number expected_total_cost_usd: minimum: 0 type: number input_value_usd: minimum: 0 type: number maximum_total_cost_percent: minimum: 0 type: number maximum_total_cost_usd: minimum: 0 type: number minimum_receive_value_usd: minimum: 0 type: number provider_fee_components: items: additionalProperties: false properties: expected_usd: minimum: 0 type: number included_in_receive_amount: const: true includes_destination_gas: type: boolean kind: minLength: 1 type: string maximum_usd: minimum: 0 type: number provider: minLength: 1 type: string required: - provider - kind - expected_usd - maximum_usd - included_in_receive_amount type: object type: array rankable_all_in: const: false scope: const: token_path_only_network_gas_excluded small_amount_warning: type: boolean unpriced_costs: items: minLength: 1 type: string type: array warning: type: - string - 'null' required: - scope - input_value_usd - expected_receive_value_usd - minimum_receive_value_usd - expected_total_cost_usd - maximum_total_cost_usd - expected_total_cost_percent - maximum_total_cost_percent - assetfare_service_fee - provider_fee_components - unpriced_costs - rankable_all_in - small_amount_warning - warning type: object direct_route_summary: additionalProperties: false allOf: - else: properties: external_intent_protocol_used: const: false provider_internal_dex_aggregation_possible: const: false steps: not: contains: properties: provider: const: across_intent_bridge required: - provider type: object if: properties: classification: const: external_intent required: - classification then: properties: external_intent_protocol_used: const: true primary_selection_eligible: const: false product_classification: const: external_coverage_only provider_internal_dex_aggregation_possible: const: true steps: contains: properties: provider: const: across_intent_bridge required: - provider type: object properties: assetfare_fee_bps: const: 1 classification: description: Every current public route is direct_protocol_only; external_intent is retained only as a compatibility enum. enum: - direct_protocol_only - external_intent economic_eligibility: enum: - not_asserted_by_capability - coverage_only_not_primary external_intent_protocol_used: type: boolean fee_collection_step_index: maximum: 7 minimum: 0 type: integer from: enum: - aptos:USDC - arbitrum:ETH - arbitrum:USDC - avalanche:USDC - base:ETH - base:USDC - cronos:USDC - ethereum:USDC - hyperevm:USDC - injective:USDC - linea:USDC - monad:USDC - optimism:USDC - polygon:USDC - robinhood:ETH - robinhood:USDG - sei:USDC - solana:SOL - solana:USDC - solana:USDG - sonic:USDC - xlayer:USDC type: string mode: enum: - aptos_move_cctp_direct - cctp_direct_composition - optimism_source_cctp - polygon_source_cctp - robinhood_across_ingress_composition - robinhood_paxos_egress_composition - robinhood_paxos_ingress_composition - same_chain_direct - same_chain_direct_composition primary_selection_eligible: type: boolean product_classification: enum: - primary_direct - external_coverage_only provider_internal_dex_aggregation_possible: description: False for every current public route; true is retained only for a historical external-intent route. type: boolean public_execution_eligible: type: boolean route: enum: - aptos:USDC->base:USDC - aptos:USDC->solana:USDC - arbitrum:ETH->arbitrum:USDC - arbitrum:USDC->arbitrum:ETH - arbitrum:USDC->robinhood:USDG - arbitrum:USDC->solana:USDC - arbitrum:USDC->solana:USDG - avalanche:USDC->base:USDC - avalanche:USDC->solana:USDC - base:USDC->robinhood:USDG - base:USDC->solana:USDC - base:USDC->solana:USDG - cronos:USDC->base:USDC - cronos:USDC->solana:USDC - ethereum:USDC->solana:USDC - hyperevm:USDC->solana:USDC - injective:USDC->base:USDC - injective:USDC->solana:USDC - linea:USDC->base:USDC - linea:USDC->solana:USDC - monad:USDC->base:USDC - monad:USDC->solana:USDC - optimism:USDC->base:USDC - robinhood:ETH->arbitrum:USDC - robinhood:ETH->base:USDC - robinhood:ETH->robinhood:USDG - robinhood:ETH->solana:SOL - robinhood:ETH->solana:USDC - robinhood:ETH->solana:USDG - robinhood:USDG->arbitrum:USDC - robinhood:USDG->base:USDC - robinhood:USDG->robinhood:ETH - robinhood:USDG->solana:SOL - robinhood:USDG->solana:USDC - sei:USDC->base:USDC - sei:USDC->solana:USDC - solana:SOL->base:USDC - solana:SOL->robinhood:ETH - solana:SOL->robinhood:USDG - solana:SOL->solana:USDC - solana:SOL->solana:USDG - solana:USDC->arbitrum:USDC - solana:USDC->base:USDC - solana:USDC->robinhood:ETH - solana:USDC->robinhood:USDG - solana:USDG->arbitrum:ETH - solana:USDG->arbitrum:USDC - solana:USDG->base:USDC - solana:USDG->robinhood:ETH - solana:USDG->robinhood:USDG - sonic:USDC->base:USDC - sonic:USDC->solana:USDC - xlayer:USDC->base:USDC - xlayer:USDC->solana:USDC type: string route_aggregator_used: const: false description: Always false for AssetFare's route engine; does not claim each provider avoids internal aggregation. route_minimum_guard_bps: maximum: 500 minimum: 1 type: - integer - 'null' server_signing: const: false server_submission: const: false step_count: maximum: 8 minimum: 1 type: integer steps: items: additionalProperties: false allOf: - else: properties: direct_protocol: const: true external_intent_protocol: const: false if: properties: provider: const: across_intent_bridge required: - provider then: properties: action: const: bridge direct_protocol: const: false external_intent_protocol: const: true - else: else: properties: action: const: bridge if: properties: provider: const: circle_cctp_receive required: - provider then: properties: action: const: receive if: properties: provider: enum: - orca_whirlpool - raydium_clmm - uniswap_v3 required: - provider then: properties: action: const: swap properties: action: enum: - swap - bridge - receive aggregator_api_used: const: false description: 'Always false: AssetFare did not call a market-wide route-aggregator API for this step; this does not describe provider-internal liquidity sourcing.' assetfare_fee_bps: maximum: 1 minimum: 0 type: integer direct_protocol: type: boolean expected_input_base: pattern: ^[1-9][0-9]*$ type: string expected_output_base: pattern: ^[1-9][0-9]*$ type: string external_intent_protocol: description: False for every current public route; true is retained only for historical compatibility. type: boolean from: enum: - aptos:USDC - arbitrum:ETH - arbitrum:USDC - avalanche:USDC - base:ETH - base:USDC - cronos:USDC - ethereum:USDC - hyperevm:USDC - injective:USDC - linea:USDC - monad:USDC - optimism:USDC - polygon:USDC - robinhood:ETH - robinhood:USDG - sei:USDC - solana:SOL - solana:USDC - solana:USDG - sonic:USDC - xlayer:USDC type: string index: minimum: 0 type: integer minimum_guard_bps: maximum: 500 minimum: 1 type: integer minimum_input_base: pattern: ^[1-9][0-9]*$ type: string minimum_output_base: pattern: ^[1-9][0-9]*$ type: string provider: enum: - across_intent_bridge - circle_cctp - circle_cctp_receive - orca_whirlpool - paxos_usdg_layerzero_oft - raydium_clmm - uniswap_v3 to: enum: - arbitrum:ETH - arbitrum:USDC - base:ETH - base:USDC - robinhood:ETH - robinhood:USDG - solana:SOL - solana:USDC - solana:USDG type: string required: - index - action - provider - from - to - expected_input_base - minimum_input_base - expected_output_base - minimum_output_base - assetfare_fee_bps - direct_protocol - external_intent_protocol - aggregator_api_used type: object maxItems: 8 minItems: 1 type: array to: enum: - arbitrum:ETH - arbitrum:USDC - base:ETH - base:USDC - robinhood:ETH - robinhood:USDG - solana:SOL - solana:USDC - solana:USDG type: string version: const: assetfare-direct-route-summary-v1 required: - version - route - from - to - classification - mode - product_classification - economic_eligibility - public_execution_eligible - primary_selection_eligible - route_minimum_guard_bps - route_aggregator_used - external_intent_protocol_used - provider_internal_dex_aggregation_possible - assetfare_fee_bps - fee_collection_step_index - server_signing - server_submission - step_count - steps type: object economic_guidance: additionalProperties: false description: Dated route-specific evidence and public activation state. properties: advisory_start_usd: enum: - null - 50 - 100 - 250 - 500 - 1000 - 2500 - 5000 - 10000 type: - integer - 'null' availability_only: type: boolean basis: minLength: 1 type: string best_from_usd: enum: - null - 50 - 100 - 250 - 500 - 1000 - 2500 - 5000 - 10000 type: - integer - 'null' best_from_verified: type: boolean confidence: enum: - paired_all_in_snapshot - availability_only_no_price_claim fresh_quote_required: const: true not_a_best_price_guarantee: const: true not_an_execution_minimum: const: true public_activation_status: enum: - active_price_verified - active_availability_only - inactive_economics public_active: type: boolean recommendation_status: enum: - active_price_verified - active_availability_only - inactive_economics recommended_action: enum: - use_assetfare_first_at_or_above_best_from - use_assetfare_when_route_availability_is_required_without_price_claim - do_not_offer_publicly_until_reactivated tested_amounts_usd: items: enum: - 50 - 100 - 250 - 500 - 1000 - 2500 - 5000 - 10000 type: integer type: array uniqueItems: true tested_ceiling_usd: const: 10000 required: - advisory_start_usd - best_from_usd - best_from_verified - availability_only - public_activation_status - public_active - recommendation_status - recommended_action - confidence - basis - tested_amounts_usd - tested_ceiling_usd - not_an_execution_minimum - not_a_best_price_guarantee - fresh_quote_required type: object eta: additionalProperties: false properties: complete_route_estimate: type: boolean estimated_time_range_seconds: items: false prefixItems: - minimum: 0 type: integer - minimum: 1 type: integer type: - array - 'null' estimated_time_seconds: minimum: 1 type: - integer - 'null' note: minLength: 1 type: string sources: items: format: uri type: string type: array required: - estimated_time_seconds - estimated_time_range_seconds - complete_route_estimate - sources - note type: object execution: properties: blocker: type: - string - 'null' first_unsigned_action_supported: type: boolean future_actions_require_verified_receipts: const: true type: boolean supported: type: boolean required: - supported - first_unsigned_action_supported - future_actions_require_verified_receipts type: object handoff_schema_version: const: 2 intent: properties: amount_usd: type: number estimated_input_base: minimum: 1 type: integer from: type: string to: type: string required: - from - to - amount_usd - estimated_input_base type: object offer: properties: assetfare_fee_bps: const: 1 type: integer cost_disclosure: properties: destination_gas_included: type: boolean destination_native_gas_required: type: boolean rankable_all_in: type: boolean source_gas_included: type: boolean token_minimum_includes_route_and_protocol_fees: type: boolean unpriced_costs: items: type: string type: array required: - token_minimum_includes_route_and_protocol_fees - source_gas_included - destination_gas_included - destination_native_gas_required - unpriced_costs - rankable_all_in type: object estimated_min_receive_amount: type: number estimated_min_receive_usd: type: number estimated_time_seconds: type: - integer - 'null' expected_receive_amount: type: number expected_receive_usd: type: number fee_blocker: type: - string - 'null' fee_collectible_now: const: true fee_collection: const: only_on_eligible_successful_executor_step fee_collection_steps: items: minimum: 0 type: integer maxItems: 1 minItems: 1 type: array fee_modeled_bps: const: 1 type: integer output_symbol: type: string required: - expected_receive_amount - estimated_min_receive_amount - output_symbol - expected_receive_usd - estimated_min_receive_usd - assetfare_fee_bps - fee_modeled_bps - fee_collectible_now - fee_collection_steps - fee_collection - cost_disclosure type: object quote_id: format: uuid type: string risk: properties: external_intent_protocol_used: type: boolean fresh_quote_required_each_step: const: true type: boolean non_atomic: type: boolean provider_internal_dex_aggregation_possible: type: boolean server_signing: const: false type: boolean server_submission: const: false type: boolean required: - non_atomic - fresh_quote_required_each_step - server_signing - server_submission - external_intent_protocol_used - provider_internal_dex_aggregation_possible type: object route: properties: aggregator_api_used: const: false external_intent_protocol_used: type: boolean mode: minLength: 1 type: string quote_latency_ms: minimum: 0 type: integer route: type: string server_signing: const: false type: boolean server_submission: const: false type: boolean steps: items: type: object minItems: 1 type: array required: - route - steps - quote_latency_ms - server_signing - server_submission - mode - aggregator_api_used - external_intent_protocol_used type: object status: const: capped_public_agent_release description: Legacy compatibility identifier only; it does not represent a current business amount cap. type: string ttl_seconds: const: 60 required: - quote_id - status - as_of - ttl_seconds - intent - offer - route - risk - execution - cost_summary - eta - economic_guidance - direct_route_summary - caller_action_plan_handoff - caller_action_plan_handoff_v2 - handoff_schema_version - continuation_v3 type: object description: Transparent route quote; AssetFare service fee is one component, not total cost '400': description: Invalid route '429': description: Rate limited '502': description: Provider unavailable with retry guidance '503': description: Capacity busy summary: Quote a live route, including Solana native USDC to Base native USDC tags: - Quote x-assetfare-evaluation-guidance: always_compare_fresh_at_intended_amount: true documentation_example_scope: example_only_not_route_guidance_or_minimum documentation_example_usd: 1000 historical_observation: evidence_as_of: '2026-09-29' not_generalizable: true observed_competitive_bucket_usd: 500 route: solana:USDC->base:USDC not_a_minimum: true not_guaranteed_best: true reachability_smoke_scope: connectivity_only_not_economic_evaluation reachability_smoke_usd: 1 route_minimum_usd: 1 route_specific_guidance: availability_only_routes: 10 catalog_routes: 98 controls_recommendation_only_when_verified: true nullable_when_unverified: true public_active_routes: 54 public_inactive_routes: 44 required_on_every_quote: true url: https://assetfare.dev/route-economics.json values_change_with_market: true verified_best_from_only: true version: assetfare-route-economic-guidance-v3 schema_version: 4 sol_input_caveat: SOL-input routes add a source swap, so compare their full fee-inclusive route economics separately. x-assetfare-safety: action_bundle_ttl_seconds: 180 action_refresh_policy: expired_unsubmitted_only action_safety_receipt_schema: ActionSafetyReceiptV1 amount_policy: no_business_maximum amount_usd_maximum: null amount_usd_minimum: 1 api_contract_version: 2.6.0 caller_approved_boolean_is_not_human_proof: true caller_approved_required_for_prepare_and_session: true caller_owned_agent_execution: a2a_remote_skill: false assetfare_server_key_access: false assetfare_server_signing: false assetfare_server_submission: false command: assetfare-agent-runner key_location: caller_wallet_adapter_only minimum_package_version: 1.15.2 package: assetfare-mcp policy_schema: https://assetfare.dev/schemas/caller-owned-execution-policy-v2.json remote_mcp_tool: false scope: caller_process_only supported: true version: assetfare-caller-owned-agent-execution-v2 wallet_adapter_contract_version: assetfare-caller-wallet-adapter-v2 caller_verifies_signs_and_submits: true continuation_v3_enforcement: server_enforced_quote_binding direct_route_summary: assetfare_fee_step_bound: true base_unit_amounts_are_decimal_strings: true classification_values: - direct_protocol_only - external_intent economic_eligibility_is_route_and_amount_conditioned: true external_coverage_only_route_count: 0 external_intent: No public route uses an external intent protocol; provider-internal liquidity sourcing or aggregation remains possible normalized_chain_asset_endpoints: true ordered_provider_path: true primary_direct_route_count: 54 product_classification_values: - primary_direct - external_coverage_only required_on_every_quote: true route_aggregator_used_scope: assetfare_engine_only route_count: 54 server_signing: false server_submission: false step_count: 95 version: assetfare-direct-route-summary-v1 external_intent_protocol: none legacy_prepare_and_session_enforcement: legacy_advisory onchain_deadline_seconds: 240 provider_internal_dex_aggregation_possible: true public: true quote_cache: bounded_thread_safe_process_local_ttl_restart_fails_closed quote_ttl_seconds: 60 receipt_generated_from: decoded_built_action_only receipt_recomputed_before_storage_return_reload_refresh: true relay_used: false release_mode: noncustodial_public_agent_release server_signing: false server_submission: false session_ownership: caller-generated high-entropy opaque capability token (X-AssetFare-Session-Token, >=256-bit CSPRNG) supplied on session create and every read/observe/refresh; the server stores only its sha256 hash, never returns or logs the raw token, and compares in constant time. Idempotency binds to (token_hash, idempotency_key), so a retry recovers a session whose create response was lost and survives an egress-IP change; the network identity is NOT the ownership secret and is used only for capacity/telemetry; sessions created under the retired network-identity model are denied (fail-closed) subjective_safe_boolean_present: false wallet_ready_minimum_remaining_seconds: 120