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

# Create lookup-backed PPV quote.

> Create a lookup-backed PPV quote from a funded internal account to a receiver PPV address. Use GET /quotes/{quoteId}/current for live/current quote state, GET /quotes/{quoteId} for retained historical detail, and POST /quotes/{quoteId}/execute for execution. This endpoint creates the quote only and does not execute a transfer. Platform configuration fee policy and the sandbox Lightning execution profile are read after corridor confirmation as internal pricing inputs, while the quote response is the outward fee and amount truth for that newly created quote.



## OpenAPI

````yaml /openapi/blips-public-reference.yaml post /quotes
openapi: 3.1.0
info:
  title: BLIPS Public Reference API
  version: '2026-04-08'
  description: >-
    Public OpenAPI 3.1 subset for the first BLIPS Mintlify API Reference and
    Playground release. This document is bound to the confirmed Public Test
    Backend at https://public-test.blips.network, includes only the approved
    first-release public endpoints, uses only internal `$ref` values, and
    excludes callback-only webhook documentation and operator-only surfaces.
servers:
  - url: https://public-test.blips.network
    description: >-
      Confirmed Public Test Backend ingress target for public BLIPS API
      Reference, Playground, and internet-testable Try It flows.
security:
  - BasicAuth: []
tags:
  - name: Platform Setup
    description: >-
      Bootstrap and platform configuration surfaces for establishing the public
      BLIPS integration context.
  - name: Sandbox API
    description: >-
      Sandbox-only externally displayed helper surfaces. These routes either
      adjust quote inputs or create incoming-payment review cases, but they
      always feed the existing quote or transaction families and never become
      second outward API families.
  - name: Tokens
    description: >-
      Platform-scoped API credential create, list, detail, and revoke
      operations.
  - name: Customers
    description: >-
      Customer onboarding, profile lifecycle, and PPV payment-address issuance
      surfaces.
  - name: Accounts
    description: >-
      Customer-bound internal-account and external-account surfaces kept in the
      first-layer public contract.
  - name: Same-Currency Transfers
    description: >-
      Same-currency receiver lookup plus incoming and outgoing transfer
      primitives.
  - name: Cross-Currency Transfers
    description: >-
      PPV-first receiver lookup, quote creation/readback, and quote execution
      for cross-currency flows.
  - name: Transactions
    description: Transaction readback plus bounded incoming-review decision operations.
  - name: Webhooks
    description: >-
      Webhook connectivity verification surface for the public BLIPS
      integration.
paths:
  /quotes:
    post:
      tags:
        - Cross-Currency Transfers
      summary: Create lookup-backed PPV quote.
      description: >-
        Create a lookup-backed PPV quote from a funded internal account to a
        receiver PPV address. Use GET /quotes/{quoteId}/current for live/current
        quote state, GET /quotes/{quoteId} for retained historical detail, and
        POST /quotes/{quoteId}/execute for execution. This endpoint creates the
        quote only and does not execute a transfer. Platform configuration fee
        policy and the sandbox Lightning execution profile are read after
        corridor confirmation as internal pricing inputs, while the quote
        response is the outward fee and amount truth for that newly created
        quote.
      operationId: createQuote
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/QuoteCreateMvpRequest'
            examples:
              internalAccountToPpv:
                value:
                  lookupId: lookup_replace_with_fresh_receiver_lookup
                  source:
                    accountId: InternalAccount:replace_with_sender_internal_account
                  destination:
                    ppvAddress: demo-customer@pay.example.blips
                    currency: PHP
                  lockedCurrencySide: SENDING
                  lockedCurrencyAmount: '10000'
                  description: Cross-border customer send
                  senderCustomerInfo:
                    FULL_NAME: Alice Zhang
      responses:
        '201':
          description: Lookup-backed PPV quote created.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/QuoteCreateMvpResponse'
              examples:
                created:
                  value:
                    quoteId: Quote:quote_123
                    transactionId: txn_quote_001
                    status: PENDING
                    createdAt: '2026-04-05T12:00:00Z'
                    expiresAt: '2026-04-05T12:05:00Z'
                    lockedCurrencySide: SENDING
                    lockedCurrencyAmount: '10000'
                    sendingAmount:
                      currencyCode: USD
                      amountMinor: '10000'
                    receivingAmount:
                      currencyCode: PHP
                      amountMinor: '542300'
                    feesTotal:
                      currencyCode: USD
                      amountMinor: '180'
                    exchangeRate: '54.23000000'
                    aggregateQuote:
                      quoteMode: SEND_FIXED
                      onRampQuoteRef: onramp_quote_123
                      railQuoteRef: rail_quote_123
                      offRampQuoteRef: offramp_quote_123
                      sendingAmount:
                        currencyCode: USD
                        amountMinor: '10000'
                      receivingAmount:
                        currencyCode: PHP
                        amountMinor: '542300'
                      totalFees:
                        currencyCode: USD
                        amountMinor: '180'
                      effectiveFxRate: '54.23000000'
                      effectiveExchangeRate: '54.23000000'
                      serviceFee:
                        currencyCode: USD
                        amountMinor: '120'
                      receiverFee:
                        currencyCode: PHP
                        amountMinor: '3258'
                      recipientGets:
                        currencyCode: PHP
                        amountMinor: '542300'
                      totalSenderPays:
                        currencyCode: USD
                        amountMinor: '10000'
                      validUntil: '2026-04-05T12:05:00Z'
                      status: QUOTED
        '400':
          description: Missing or invalid quote-create fields.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/QuoteCreateMvpErrorResponse'
              examples:
                invalidRequest:
                  value:
                    status: 400
                    code: INVALID_REQUEST
                    message: Invalid request body
                    details:
                      lookupId: required
                      source.accountId: required
                      lockedCurrencyAmount: must be a numeric minor-unit string
        '401':
          description: Invalid or missing API credentials.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/QuoteCreateMvpErrorResponse'
              examples:
                unauthorized:
                  value:
                    status: 401
                    code: UNAUTHORIZED
                    message: Invalid or missing API credentials
                    details: {}
        '409':
          description: Quote blocked by current payment or PPV readiness requirements.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/QuoteCreateMvpErrorResponse'
              examples:
                ppvNotCleared:
                  value:
                    status: 409
                    code: PPV_NOT_CLEARED
                    message: PPV not cleared
                    details: {}
        '422':
          description: >-
            Lookup context is missing or expired, or additional payer data is
            still required.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/QuoteCreateMvpErrorResponse'
              examples:
                lookupExpired:
                  value:
                    status: 422
                    code: LOOKUP_EXPIRED
                    message: Lookup expired. Run receiver lookup again.
                    details:
                      lookupId: lookup_replace_with_fresh_receiver_lookup
                missingMandatoryUserInfo:
                  value:
                    status: 422
                    code: MISSING_MANDATORY_USER_INFO
                    message: Additional counterparty information required
                    details:
                      requiredFields:
                        - FULL_NAME
        '500':
          description: Internal service error.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/QuoteCreateMvpErrorResponse'
              examples:
                internalError:
                  value:
                    status: 500
                    code: INTERNAL_ERROR
                    message: Internal service error
                    details: {}
      security:
        - BasicAuth: []
components:
  schemas:
    QuoteCreateMvpRequest:
      type: object
      description: >-
        Frozen MVP public quote-create request: lookup-backed internal-account
        to PPV-address quote creation only.
      properties:
        lookupId:
          type: string
          description: >-
            Fresh receiver lookup handle returned by the earlier receiver lookup
            step.
        source:
          $ref: '#/components/schemas/QuoteCreateMvpSource'
          description: Sender-side source account for the quote.
        destination:
          $ref: '#/components/schemas/QuoteCreateMvpDestination'
          description: Lookup-backed PPV destination for the quote.
        lockedCurrencySide:
          type: string
          enum:
            - SENDING
            - RECEIVING
          description: >-
            Which side of the quote is locked: `SENDING` for send-fixed or
            `RECEIVING` for receive-fixed.
        lockedCurrencyAmount:
          type: string
          pattern: ^[0-9]+$
          description: Locked amount in minor units on the selected locked currency side.
        description:
          type: string
          description: Optional business description stored with the quote request.
        senderCustomerInfo:
          type: object
          additionalProperties:
            type: string
          description: >-
            Additional payer/customer information required by the lookup
            context, keyed by field name.
      required:
        - lookupId
        - source
        - destination
        - lockedCurrencySide
        - lockedCurrencyAmount
      additionalProperties: false
    QuoteCreateMvpResponse:
      type: object
      description: >-
        Frozen MVP public quote-create response for the lookup-backed PPV quote
        lock, outward aggregate quote truth, and the linked public transaction
        flow.
      additionalProperties: false
      required:
        - quoteId
        - transactionId
        - status
        - createdAt
        - expiresAt
        - lockedCurrencySide
        - lockedCurrencyAmount
        - sendingAmount
        - receivingAmount
        - feesTotal
        - exchangeRate
      properties:
        quoteId:
          type: string
          description: Stable BLIPS quote identifier.
        transactionId:
          type: string
          description: >-
            Public transaction identifier reserved for the linked execute and
            transaction readback flow.
        status:
          type: string
          enum:
            - PENDING
            - PROCESSING
            - COMPLETED
            - FAILED
            - EXPIRED
          description: Current public quote lifecycle status after create.
        createdAt:
          type: string
          format: date-time
          description: Quote creation timestamp.
        expiresAt:
          type: string
          format: date-time
          description: RFC 3339 timestamp when this quote expires.
        lockedCurrencySide:
          type: string
          enum:
            - SENDING
            - RECEIVING
          description: Which side of the quote amount is locked.
        lockedCurrencyAmount:
          type: string
          pattern: ^[0-9]+$
          description: Locked amount in minor units on the locked currency side.
        sendingAmount:
          $ref: '#/components/schemas/MoneyAmount'
          description: Quoted sender-side amount.
        receivingAmount:
          $ref: '#/components/schemas/MoneyAmount'
          description: Quoted receiver-side amount.
        feesTotal:
          $ref: '#/components/schemas/MoneyAmount'
          description: Total quoted fees.
        exchangeRate:
          type: string
          description: >-
            Effective quoted exchange rate from sendingAmount to
            receivingAmount.
        aggregateQuote:
          $ref: '#/components/schemas/QuoteAggregateMvpResponse'
          description: >-
            Outward aggregate quote truth, including the sender and receiver
            service-fee line items locked onto this quote at create time.
    QuoteCreateMvpErrorResponse:
      type: object
      description: Public error envelope for lookup-backed PPV quote-create failures.
      additionalProperties: false
      required:
        - status
        - code
        - message
        - details
      properties:
        status:
          type: integer
          description: HTTP status code returned for the failed quote-create request.
        code:
          type: string
          description: Stable public error code for the failed quote-create request.
        message:
          type: string
          description: Human-readable summary of the quote-create failure.
        details:
          type: object
          nullable: true
          additionalProperties: true
          description: Additional structured error context when present.
    QuoteCreateMvpSource:
      type: object
      description: Sender-side internal account used to fund the lookup-backed quote.
      properties:
        accountId:
          type: string
          description: >-
            Sender internal-account ID used as the source of funds for this
            quote.
      required:
        - accountId
      additionalProperties: false
    QuoteCreateMvpDestination:
      type: object
      description: Lookup-backed PPV-addressed destination for the quote.
      properties:
        ppvAddress:
          type: string
          description: Public PPV address in plain `localPart@ppvDomain` format.
        currency:
          type: string
          description: Destination currency code resolved for the receiver flow.
      required:
        - ppvAddress
        - currency
      additionalProperties: false
    MoneyAmount:
      type: object
      properties:
        currencyCode:
          type: string
          description: ISO 4217 currency code.
        amountMinor:
          type: string
          description: Amount in minor units for that currency.
      required:
        - currencyCode
        - amountMinor
      additionalProperties: false
    QuoteAggregateMvpResponse:
      type: object
      description: >-
        Public aggregate quote amounts and outward fee line items locked onto
        the quote at create time. Platform Config service-fee policy and Sandbox
        Lightning Network Execution Profile inputs are absorbed into these
        outward results; Lightning-derived costs are not exposed as separate
        public fee fields.
      additionalProperties: false
      required:
        - quoteMode
        - onRampQuoteRef
        - railQuoteRef
        - offRampQuoteRef
        - sendingAmount
        - receivingAmount
        - totalFees
        - effectiveFxRate
        - validUntil
        - status
      properties:
        quoteMode:
          type: string
          enum:
            - SEND_FIXED
            - RECEIVE_FIXED
          description: Whether the locked quote is send-fixed or receive-fixed.
        onRampQuoteRef:
          type: string
          description: Opaque sender-side pricing reference locked onto this quote.
        railQuoteRef:
          type: string
          description: Opaque rail pricing reference locked onto this quote.
        offRampQuoteRef:
          type: string
          description: Opaque receiver-side pricing reference locked onto this quote.
        sendingAmount:
          $ref: '#/components/schemas/MoneyAmount'
          description: Quoted sender-side amount.
        receivingAmount:
          $ref: '#/components/schemas/MoneyAmount'
          description: Quoted receiver-side amount.
        totalFees:
          $ref: '#/components/schemas/MoneyAmount'
          description: Total quoted fees expressed in the sender currency.
        effectiveFxRate:
          type: string
          description: Effective quoted FX rate.
        effectiveExchangeRate:
          type: string
          description: Compatibility alias of effectiveFxRate.
        serviceFee:
          $ref: '#/components/schemas/MoneyAmount'
          description: >-
            Sender-side outward service-fee amount locked from platform fee
            policy at quote creation.
        receiverFee:
          $ref: '#/components/schemas/MoneyAmount'
          description: >-
            Receiver-side outward service-fee amount locked from platform fee
            policy at quote creation.
        recipientGets:
          $ref: '#/components/schemas/MoneyAmount'
          description: Recipient net amount for this quote.
        totalSenderPays:
          $ref: '#/components/schemas/MoneyAmount'
          description: Sender total for this quote.
        validUntil:
          type: string
          format: date-time
          description: RFC 3339 timestamp when this quote snapshot expires.
        status:
          type: string
          enum:
            - QUOTED
            - BLOCKED
            - EXPIRED
          description: Current outward aggregate quote status.
  securitySchemes:
    BasicAuth:
      type: http
      scheme: basic
      description: >-
        Integration-key Basic Auth (`clientId:clientSecret`) as documented in
        docs/public/AUTHENTICATION.md.

````