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

# Initiate an off-ramp

> Consumes an available quote and creates settlement instructions. Sandbox never moves funds or contacts a provider.



## OpenAPI

````yaml /openapi.json post /api/v1/business/offramps
openapi: 3.1.0
info:
  title: NorthFond Business API
  version: 1.0.0
  summary: Provider-neutral stablecoin on-ramp and off-ramp infrastructure.
  description: >-
    NorthFond lets businesses provision or register EVM wallets, store
    beneficiaries, request quotes, initiate off-ramps, confirm settlement, and
    track transactions. Sandbox and live credentials use the same API contract
    and remain isolated.
  contact:
    name: NorthFond API Support
servers:
  - url: https://payment.gideondevrel.xyz
    description: Configured NorthFond API environment
security:
  - ApiKeyAuth: []
tags:
  - name: Account
    description: Authenticated business context.
  - name: Customers
    description: Business-owned customers and managed wallets.
  - name: Beneficiaries
    description: Encrypted, reusable payout destinations.
  - name: Wallets
    description: Managed and external EVM funding wallets.
  - name: Quotes
    description: Provider-neutral off-ramp prices.
  - name: Off-ramps
    description: Stablecoin-to-fiat payout initiation.
  - name: On-ramps
    description: Fiat-to-stablecoin deposit initiation.
  - name: Transactions
    description: Payment status, events, and settlement.
externalDocs:
  description: NorthFond developer documentation
  url: /docs
paths:
  /api/v1/business/offramps:
    post:
      tags:
        - Off-ramps
      summary: Initiate an off-ramp
      description: >-
        Consumes an available quote and creates settlement instructions. Sandbox
        never moves funds or contacts a provider.
      operationId: createOfframp
      parameters:
        - $ref: '#/components/parameters/IdempotencyKey'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateOfframpRequest'
      responses:
        '201':
          description: Off-ramp created
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/Transaction'
                  - type: object
                    required:
                      - settlement
                    properties:
                      settlement:
                        $ref: '#/components/schemas/Settlement'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '409':
          $ref: '#/components/responses/Conflict'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
        '429':
          $ref: '#/components/responses/RateLimited'
        '503':
          $ref: '#/components/responses/Unavailable'
components:
  parameters:
    IdempotencyKey:
      name: Idempotency-Key
      in: header
      required: true
      description: >-
        A unique key for this logical write operation. Reuse it when retrying
        the exact same request.
      schema:
        type: string
        minLength: 8
        maxLength: 255
      example: operation_01K4ZJBP5S9J9T7AM6XW8HCT2F
  schemas:
    CreateOfframpRequest:
      type: object
      required:
        - quote_id
        - funding_source
      additionalProperties: false
      properties:
        quote_id:
          type: string
          format: uuid
        external_reference:
          type: string
          minLength: 1
          maxLength: 120
        funding_source:
          $ref: '#/components/schemas/FundingSource'
        simulation:
          type: string
          enum:
            - success
            - failed
            - delayed
            - action_required
          default: success
          description: Sandbox only.
    Transaction:
      type: object
      required:
        - id
        - direction
        - quote_id
        - status
        - source
        - destination
        - fees
        - exchange_rate
        - created_at
        - updated_at
      properties:
        id:
          type: string
          format: uuid
        direction:
          type: string
          enum:
            - offramp
            - onramp
        external_reference:
          type:
            - string
            - 'null'
        quote_id:
          type: string
          format: uuid
        beneficiary_id:
          type:
            - string
            - 'null'
          format: uuid
        wallet_id:
          type:
            - string
            - 'null'
          format: uuid
        status:
          $ref: '#/components/schemas/TransactionStatus'
        funding_source:
          type: object
          properties:
            type:
              type: string
              enum:
                - managed_wallet
                - external_wallet
            reference:
              type: string
            address:
              type: string
        payment_source:
          type: object
          properties:
            type:
              const: mobile_money
            reference:
              type: string
              description: Redacted payment account reference.
        source:
          type: object
          properties:
            asset:
              const: USDC
            amount:
              type: string
            total_required:
              type: string
            chain:
              $ref: '#/components/schemas/EvmChain'
        destination:
          type: object
          properties:
            currency:
              type: string
            asset:
              type: string
            amount:
              type: string
            chain:
              $ref: '#/components/schemas/EvmChain'
            wallet_address:
              type: string
            transaction_hash:
              type:
                - string
                - 'null'
        fees:
          type: object
          properties:
            provider:
              type: string
            platform:
              type: string
        exchange_rate:
          type: string
        failure:
          oneOf:
            - type: 'null'
            - type: object
              properties:
                code:
                  type: string
                message:
                  type:
                    - string
                    - 'null'
        created_at:
          type: string
          format: date-time
        updated_at:
          type: string
          format: date-time
        completed_at:
          type:
            - string
            - 'null'
          format: date-time
    Settlement:
      type: object
      required:
        - id
        - transaction_id
        - status
        - chain
        - asset
        - token_address
        - from_address
        - to_address
        - amount
        - confirmations
        - required_confirmations
        - expires_at
      properties:
        id:
          type: string
          format: uuid
        transaction_id:
          type: string
          format: uuid
        status:
          type: string
          enum:
            - awaiting_transfer
            - detected
            - confirmed
        chain:
          $ref: '#/components/schemas/EvmChain'
        asset:
          const: USDC
        token_address:
          type: string
        from_address:
          type: string
        to_address:
          type: string
        amount:
          type: string
        fee_address:
          type:
            - string
            - 'null'
        fee_amount:
          type: string
        total_required:
          type: string
        execution:
          type: object
          description: >-
            Use direct_transfer when the fee is zero. For fee_splitter, approve
            the exact raw amount and submit the returned transaction.
        transaction_hash:
          type:
            - string
            - 'null'
        confirmations:
          type: integer
        required_confirmations:
          type: integer
        expires_at:
          type: string
          format: date-time
        detected_at:
          type:
            - string
            - 'null'
          format: date-time
        confirmed_at:
          type:
            - string
            - 'null'
          format: date-time
    FundingSource:
      type: object
      required:
        - type
        - wallet_id
      properties:
        type:
          type: string
          enum:
            - managed_wallet
            - external_wallet
        wallet_id:
          type: string
          format: uuid
    TransactionStatus:
      type: string
      enum:
        - created
        - awaiting_funds
        - funded
        - signing
        - submitting
        - processing
        - action_required
        - completed
        - failed
    EvmChain:
      type: string
      enum:
        - base
        - polygon
        - arbitrum
        - optimism
        - avalanche
    ErrorResponse:
      type: object
      required:
        - error
      properties:
        error:
          type: object
          required:
            - code
            - message
            - requestId
          properties:
            code:
              type: string
              example: invalid_request
            message:
              type: string
            requestId:
              type: string
              format: uuid
            details: {}
  responses:
    BadRequest:
      description: The request is invalid.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
    Unauthorized:
      description: The API key is missing or invalid.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
    Forbidden:
      description: The API key lacks the required scope or the source IP is not allowed.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
    Conflict:
      description: The request conflicts with current resource or idempotency state.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
    UnprocessableEntity:
      description: The request is understood but cannot be processed.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
    RateLimited:
      description: The credential rate limit was exceeded.
      headers:
        Retry-After:
          schema:
            type: integer
          description: Seconds before retrying.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
    Unavailable:
      description: A required service or environment configuration is unavailable.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
  securitySchemes:
    ApiKeyAuth:
      type: http
      scheme: bearer
      bearerFormat: nf_test_… or nf_live_…
      description: A secret NorthFond business API key. Keep it on your server.

````