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

# Reject a pending transfer approval

> Rejects a held transfer approval and records the reason as a notice on the
quote, which is marked expired.




## OpenAPI

````yaml https://raw.githubusercontent.com/bushaHQ/openapi/refs/heads/main/openapi-spec.yaml post /v1/quotes/pending-approvals/{id}/reject
openapi: 3.0.0
info:
  title: Busha API
  contact:
    email: developers@busha.co
  description: >
    ## Introduction

    The **Busha API** is designed to provide businesses with tools for
    borderless financial transactions and operations, enabling modern, global
    money management. It serves as the backbone for facilitating:

    - Creation and management of multi-currency balances

    - Retrieval of real-time cryptocurrency rates

    - Substantial data insights for business owners


    Whether you’re a product-driven fintech or a developer building
    integrations, this API significantly accelerates implementation while
    reducing financial complexities.

    For detailed guides on API integration, visit our [official
    documentation]().



    ## Authentication

    All API requests require a **Bearer Token** for authentication, passed in
    the `Authorization` header.

    Your authorization value is a base64 encoded value of your api key and your
    secret key.

    You can obtain API tokens via your Busha user or business account.
    Authentication is mandatory to ensure secure and authorized interactions
    with the API.

    The API keys from the dashboard provides a base64 encoding of the your
    authorization tokens.


    Your generated Key should look like this:

    `VURtNXhWcHueantkpaiewjo0S044MWsadfojienuoxRTiWDJaeWJaTGxxanZ3Ym10OU1RZnVWajVW=`


    Example Header:

    ``` curl

    Authorization: Bearer
    VURtNXhWcHueantkpaiewjo0S044MWsadfojienuoxRTiWDJaeWJaTGxxanZ3Ym10OU1RZnVWajVW=

    ```


    ## Error Handling

    #Standardized error responses ensure predictable interactions. Errors are
    detailed for easy debugging and understanding:

    | **Error Code** | **HTTP Status Code** | **Description** |

    | --- | --- | --- |

    | `bad_request` | 400 | Invalid input or malformed request |

    | `unauthorized` | 401 | Invalid or missing authentication |

    | `not_found` | 404 | Resource not found |

    | `service_unavailable` | 503 | Server error |


    Basic Error Example:

    ``` json

    {
      "error": {
        "name": "bad_request",
        "message": "Invalid input data"
      }
    }

    ```


    Schema Error Body Example:

    ``` json

    {
      "error": {
        "name": "bad_request",
        "message": "Invalid input data"
      },
      "schema": {
        "reason": "The request body is defined as an object. However, it does not meet the schema requirements of the specification",
        "fix": "Ensure that the object being submitted, matches the schema correctly"
      }
    }

    ```


    Field Error Body Example:

    ``` json

    {
      "error": {
        "name": "bad_request",
        "message": "Invalid input data"
      },
      "fields": {
        "field1": [
          {
            "reason": "The request body is defined as an object. However, it does not meet the schema requirements of the specification",
          },
        ],
        "field2": [
          {
            "reason": "The request body is defined as an object. However, it does not meet the schema requirements of the specification",
          }
        ],
      }
    }

    ```


    ## Pagination

    Pagination uses cursors provided as:

    The API supports **cursor-based pagination** for endpoints with large
    datasets. Pagination uses a `next_cursor` and `previous_cursor` returned in
    the response.

    Example Response Format:

    ``` json

    {
      "current_entries_size": 10,
      "next_cursor": "base64_cursor_value",
      "previous_cursor": "base64_previous_cursor_value"
    }

    ```


    ## Rate Limiting

    Rate limits determine how many API calls can be made in a rolling minute.
    This ensures fair and optimized use of system resources.


    The rate limits allowed by each resource will be provided with the header:

    ```curl

    x-rate-limit 100

    ```

    If this header does not exist, then the rate limit is set at a default 100
    req/min


    Requests exceeding the allocated quota will receive a `429 Too Many
    Requests` response.


    ##  Common Parameters

    Common parameters enhance consistency across endpoints:
      | **Parameter Name** | **Location** | **Description** | **Example** |
      | --- | --- | --- | --- |
      | `X-BU-PROFILE-ID` | Header | User profile identifier | `BUS_qwejinoiuiqw93ejjw` |
      | `id` | Path | Unique NanoID identifier | `dpt_jweqafajsndiun34fd` |
      | `cursor` | Query | Pagination cursor | `base64_cursor_string` |

    #### Paginated Response Example
      ``` json
      {
        "status": "success",
        "message": "Data retrieved",
        "pagination": {
          "next_cursor": "value_for_next_page",
          "current_entries_size": 20
        },
        "data": [...]
      }
      ```
  version: 1.0.0
servers:
  - url: https://api.sandbox.busha.so
    description: Sandbox Environment
  - url: https://api.busha.io
    description: Production Environment
security: []
tags:
  - name: Balances
    description: Handles account balances across different currencies.
    x-displayName: Balances
  - name: Bills
    description: Lorem Ipsum
    x-displayName: Bills
  - name: Cards
    description: Lorem Ipsum
    x-displayName: Cards
  - name: Cashback
    description: Main tag for cashback service endpoints
    x-displayName: Cashback
  - name: Currencies
    description: >
      Endpoints to manage supported currencies, their properties, and network
      details.
    x-displayName: Currencies
  - name: Customers
    x-internal: false
    description: Handle customer requests and responses
    x-displayName: Customers
  - name: Files
    description: Provides APIs to handle files upload
    x-displayName: Files
  - name: Futures
    description: Futures account management
    x-displayName: Futures
  - name: Insights
    description: Business analytics insights endpoints
    x-displayName: Insights
  - name: Mandate
    x-displayName: Mandate
  - name: Miscellaneous
    description: Provides auxiliary APIs to complement and enhance other services.
    x-displayName: Miscellaneous
  - name: News
    description: News article endpoints
    x-displayName: News
  - name: Pairs
    description: Access trading pair information and rates
    x-displayName: Pairs
  - name: PaymentLinks
    description: Payment Links
    x-displayName: PaymentLinks
  - name: PaymentRequests
    description: Payment request
    x-displayName: PaymentRequests
  - name: Pledges
    description: Customer-authorized pledge lifecycle APIs
    x-displayName: Pledges
  - name: PriceAlerts
    description: Price alert management endpoints
    x-displayName: PriceAlerts
  - name: Quotes
    description: Handle quotes requests and responses
    x-displayName: Quotes
  - name: Recipients
    x-displayName: Recipients
  - name: Stocks
    x-displayName: Stocks
  - name: Transactions
    x-displayName: Transactions
  - name: Transfers
    x-displayName: Transfers
  - name: Widget
    description: Widget operations
    x-displayName: Widget
paths:
  /v1/quotes/pending-approvals/{id}/reject:
    post:
      tags:
        - Quotes
      summary: Reject a pending transfer approval
      description: >
        Rejects a held transfer approval and records the reason as a notice on
        the

        quote, which is marked expired.
      operationId: rejectTransferApproval
      parameters:
        - $ref: '#/components/parameters/PathParamNanoID'
        - $ref: '#/components/parameters/ProfileHeader'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/RejectTransferApprovalRequest'
      responses:
        '200':
          $ref: '#/components/responses/QuoteResponse'
        4XX:
          $ref: '#/components/responses/QuoteError4XX'
        5XX:
          $ref: '#/components/responses/QuoteError5XX'
      security:
        - Auth:
            - transfer_approval:write
components:
  parameters:
    PathParamNanoID:
      in: path
      name: id
      required: true
      schema:
        type: string
        format: nanoid
        example: bus_123456789
      x-oapi-codegen-extra-tags:
        validate: required|nanoid
    ProfileHeader:
      in: header
      name: X-BU-PROFILE-ID
      required: false
      description: User profile header
      schema:
        type: string
        example: BUS_YOK8tp5Zga01qOKEsqp07
  schemas:
    RejectTransferApprovalRequest:
      type: object
      required:
        - reason
      properties:
        reason:
          type: string
          description: The reason shown to the requester on the quote.
          example: This transfer was rejected by your business owner.
    BaseSchema:
      description: General response Values
      type: object
      required:
        - status
        - message
      properties:
        status:
          type: string
          x-order: 1
          x-go-type: string
          enum:
            - success
            - error
          example: success
        message:
          type: string
          x-order: 2
          example: message for success
    Quote:
      type: object
      required:
        - id
        - source_currency
        - target_currency
        - source_amount
        - target_amount
        - profile_id
        - reference
        - created_at
        - updated_at
        - status
        - rate
        - fees
      properties:
        id:
          $ref: '#/components/schemas/ResourceID'
        source_currency:
          allOf:
            - $ref: '#/components/schemas/Currency'
          x-order: 5
        target_currency:
          allOf:
            - $ref: '#/components/schemas/Currency'
          x-order: 6
        source_amount:
          allOf:
            - $ref: '#/components/schemas/Decimal'
          x-order: 7
        target_amount:
          allOf:
            - $ref: '#/components/schemas/Decimal'
          x-order: 8
        profile_id:
          $ref: '#/components/schemas/NanoID'
        rate:
          allOf:
            - $ref: '#/components/schemas/QuoteRate'
          x-order: 9
        fees:
          type: array
          x-order: 10
          items:
            $ref: '#/components/schemas/Fee'
        pay_in:
          allOf:
            - $ref: '#/components/schemas/PaymentObj'
          x-order: 11
        pay_out:
          allOf:
            - $ref: '#/components/schemas/PaymentObj'
          x-order: 12
        reference:
          allOf:
            - $ref: '#/components/schemas/QuoteReference'
          x-order: 12
        status:
          type: string
          x-order: 13
          enum:
            - pending
            - accepted
            - expired
          example: pending
        expires_at:
          type: string
          x-order: 14
          format: date-time
          description: >-
            When the quote stops holding its price, seconds after it was made
            (30 seconds unless its book sets its own lifetime). Create the
            transfer before this time; show it as a countdown and ask for a new
            quote when it passes.
          example: '2023-12-01T15:04:05Z'
        created_at:
          type: string
          x-order: 15
          format: date-time
          example: '2023-10-15T12:15:30Z'
        updated_at:
          type: string
          x-order: 16
          format: date-time
          example: '2023-10-15T12:20:45Z'
        two_step:
          $ref: '#/components/schemas/TwoStep'
        quote_rate:
          allOf:
            - $ref: '#/components/schemas/QuoteRate'
          x-order: 17
          description: >-
            This shows the rate used to derive the amount when quote_currency is
            provided.
    ErrorResponse:
      type: object
      required:
        - error
      properties:
        error:
          type: object
          required:
            - name
            - message
          properties:
            name:
              type: string
              x-order: 40
              example: bad_request
            message:
              type: string
              example: Invalid Request
        fields:
          type: object
        schema:
          type: array
          items:
            $ref: '#/components/schemas/SchemaViolation'
      example:
        error:
          name: bad_request
          message: Invalid Request
    ResourceID:
      type: string
      x-order: 1
      example: bus_123456789
      format: string
      description: A valid id
      x-oapi-codegen-extra-tags:
        validate: required|nanoid
    Currency:
      type: string
      x-order: 20
      example: BTC
      format: string
      maxLength: 10
      minLength: 1
      description: A valid currency
      x-oapi-codegen-extra-tags:
        validate: required|min_len:1|max_len:10
        filter: trim|upper
    Decimal:
      type: string
      description: decimal value
      example: '100'
      x-go-type: decimal.Decimal
      x-go-type-import:
        path: github.com/shopspring/decimal
        name: decimal
    NanoID:
      type: string
      x-order: 2
      example: bus_123456789
      format: nanoid
      description: A valid id
      x-oapi-codegen-extra-tags:
        validate: required|nanoid
    QuoteRate:
      type: object
      properties:
        product:
          type: string
          example: BTCUSDT
        rate_explained:
          type: string
          example: 1 BTC = 1000 USDT
        source_currency:
          $ref: '#/components/schemas/Currency'
        target_currency:
          $ref: '#/components/schemas/Currency'
        rate:
          $ref: '#/components/schemas/Decimal'
        side:
          type: string
          enum:
            - buy
            - sell
          example: sell
        type:
          type: string
          enum:
            - FIXED
          example: FIXED
        base_rate:
          $ref: '#/components/schemas/Decimal'
        discount:
          $ref: '#/components/schemas/QuoteRateDiscount'
    Fee:
      type: object
      x-order: 40
      required:
        - name
        - amount
        - type
      properties:
        name:
          type: string
          example: processing_fee
        amount:
          $ref: '#/components/schemas/AmountWithCurrency'
        converted_amount:
          $ref: '#/components/schemas/AmountWithCurrency'
        type:
          $ref: '#/components/schemas/FeeType'
    PaymentObj:
      allOf:
        - $ref: '#/components/schemas/PayOutObj'
        - type: object
          properties:
            profile_id:
              type: string
              example: profile-id-1234
            memo:
              type: string
              example: address memo
            recipient_details:
              $ref: '#/components/schemas/RecipientDetails'
            blockchain_hash:
              type: string
              x-order: 16
              example: 31b99c79e2fb7554d0a9421867a53a80e6810cdfd2b06826eec1b2a22974b171
            blockchain_url:
              type: string
              x-order: 16
              example: >-
                https://explorer.com/tx/31b99c79e2fb7554d0a9421867a53a80e6810cdfd2b06826eec1b2a22974b171
            session_id:
              type: string
              x-order: 16
              example: 31b99c79e2fb7554d0a9421867a53a80e6810cdfd2b06826eec1b2a22974b171
            from_address:
              type: string
              x-order: 16
              example: 31b99c79e2fb7554d0a9421867a53a80e6810cdfd2b06826eec1b2a22974b171
            expires_at:
              type: string
              format: date-time
              example: '2023-10-15T12:15:30Z'
    QuoteReference:
      type: string
      x-order: 2
      example: QUO_123456abc
      maxLength: 64
      minLength: 12
    TwoStep:
      type: object
      required:
        - type
        - message
        - resend_allowed
      x-order: 17
      properties:
        type:
          type: string
          enum:
            - authenticator
            - approval
          example: authenticator
          description: >-
            the type of two step verification required; approval hands the
            transfer to the business owner
        message:
          type: string
          example: Enter your 2FA code to continue
        resend_allowed:
          type: boolean
          example: false
          description: If the code can be resent
    SchemaViolation:
      type: object
      description: >
        One thing wrong with the request body: in prose for a person, and in a
        code and a pointer for a program. `reason` and `fix` are written by the
        validation library and their wording changes between releases of it;
        `code` and `pointer` do not, so branch on those.
      properties:
        reason:
          type: string
          description: >-
            What is wrong, in prose. For a person reading a log, not for code to
            match on.
          example: missing property 'additional_info'
        fix:
          type: string
          description: What to do about it, in prose.
          example: Ensure that the object being submitted, matches the schema correctly
        code:
          type: string
          description: >
            What is wrong, as a stable token. `missing-property` for a required
            property left out, `type-mismatch` for a value of the wrong JSON
            type, `enum-mismatch` for a value outside the documented set,
            `pattern-mismatch` for a string that fails its pattern,
            `unknown-property` for a property the endpoint does not declare,
            `malformed-json` for a body that is not JSON at all, and
            `constraint-<keyword>` for any other JSON Schema keyword the body
            tripped.
          example: missing-property
        pointer:
          type: string
          description: >
            Where it is wrong: an RFC 6901 JSON Pointer into the request body.
            The empty string points at the body itself, which is the answer when
            no single property is at fault.
          example: /additional_info
        schema_validation_error:
          type: array
          description: The validator's own specifics, where it produced any.
          items:
            type: string
          example:
            - 'minLength: got 3, want 12'
    QuoteRateDiscount:
      type: object
      description: >
        A volume discount the trade size earned. `rate` already includes it.
        Absent when no discount applied.
      required:
        - percentage
        - saved
        - tier
      properties:
        percentage:
          allOf:
            - $ref: '#/components/schemas/Decimal'
          description: Percent off the base rate. "0.10" is 0.10%.
          example: '0.10'
        saved:
          allOf:
            - $ref: '#/components/schemas/AmountWithCurrency'
          description: >
            What the discount is worth before fees: extra of the currency
            received, or less of the currency paid.
        tier:
          $ref: '#/components/schemas/QuoteRateDiscountTier'
    AmountWithCurrency:
      type: object
      description: Amount with currency
      required:
        - amount
        - currency
      properties:
        amount:
          $ref: '#/components/schemas/Decimal'
        currency:
          $ref: '#/components/schemas/Currency'
    FeeType:
      type: string
      enum:
        - FIXED
        - PERCENTAGE
        - TIERED
      example: FIXED
    PayOutObj:
      type: object
      required:
        - type
      properties:
        type:
          type: string
          example: address
          description: |
            The payout type. NOTE: `sweep` is reserved for Busha Business
            dashboard sessions (master <-> sub-account internal transfers)
            and is rejected on public API-key requests.
          enum:
            - address
            - bank_transfer
            - mobile_money
            - paybill
            - till
            - payout_batch
            - balance
            - savings
            - direct_debit
            - sweep
            - internal
        recipient_id:
          type: string
          example: 64ae8c26ea1033204c805a8a
          description: >
            This represents the recipient ID, used for `mobile_money` and
            `bank_transfer` types.

            For `payout_batch`, this should contain the payout batch ID.
        address:
          type: string
          example: tb1qj4263506wyu8khrz2dwce0agk8lhyjgy269rxr
          description: >
            This could be the address, user email or username for type
            `address`. For type `sweep`, this is the email of the destination
            account. Required when the sender is the master (master -> sub);
            optional when the sender is a sub-account (the destination master is
            resolved automatically from the sub's parent business).

            For type `internal`, this is the destination Busha profile ID,
            destination email, or a public key that resolves to the owning
            business profile.
        network:
          type: string
          example: BTC
          description: >
            This specifies the blockchain network associated with the address
            receiving the payment, typically used with address type payouts.
        memo:
          type: string
          example: memo
          description: >
            This refers to the memo required for blockchain networks that
            mandate a memo for cryptocurrency transactions.
        narration:
          type: string
          example: Payment for services
          description: >
            A narration or description for the withdrawal. Required for USD bank
            transfer withdrawals.
        payment_invoice_url:
          type: string
          example: https://example.com/invoice.pdf
          description: >
            URL of the payment invoice or supporting document. Required for
            business account USD withdrawals

            and personal account USD withdrawals exceeding $10,000.
    RecipientDetails:
      type: object
      properties:
        account_name:
          type: string
        bank_name:
          type: string
        account_number:
          type: string
        country_code:
          type: string
          example: NG
        provider:
          type: string
        iban:
          type: string
          example: NG12345678901234567890
        currency:
          type: string
        phone_number:
          type: string
        name:
          type: string
        email:
          type: string
          example: sbsbs@busha.co
        bank_code:
          type: string
          example: '100020'
    QuoteRateDiscountTier:
      type: object
      description: The rung the trade reached.
      required:
        - from
        - currency
      properties:
        from:
          allOf:
            - $ref: '#/components/schemas/Decimal'
          description: The rung starts at trades of this size.
          example: '10000'
        currency:
          $ref: '#/components/schemas/Currency'
  responses:
    QuoteResponse:
      description: Quote Response
      content:
        application/json:
          schema:
            allOf:
              - $ref: '#/components/schemas/BaseSchema'
              - type: object
                required:
                  - data
                properties:
                  data:
                    $ref: '#/components/schemas/Quote'
    QuoteError4XX:
      description: Default
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          examples:
            default:
              $ref: '#/components/examples/DefaultError'
            not_found_error:
              $ref: '#/components/examples/NotFoundError'
            unauthorized_error:
              $ref: '#/components/examples/UnAuthorizedError'
            request_validation_error:
              $ref: '#/components/examples/RequestValidationError'
            schema_validation_error:
              $ref: '#/components/examples/SchemaValidationError'
    QuoteError5XX:
      description: Server error when processing the quote request
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          examples:
            internal_server_error:
              $ref: '#/components/examples/InternalServerError'
            service_unavailable_error:
              $ref: '#/components/examples/ServiceUnavailableError'
  examples:
    DefaultError:
      description: Default error
      value:
        error:
          name: bad_request
          message: Invalid request
    NotFoundError:
      description: Not Found error
      value:
        error:
          name: resource_not_found
          message: Resource Not Found
    UnAuthorizedError:
      description: Unauthorized Error
      value:
        error:
          name: unauthorized
          message: Unauthorized request
    RequestValidationError:
      description: Request Validation error example
      value:
        error:
          name: request_validation
          message: Validation error
        fields:
          field1:
            - reason: One of target and source amount must be set
          field2:
            - reason: One of target and source amount must be set
    SchemaValidationError:
      description: >
        Schema validation error example. One entry per violation, each with its
        own `code` and `pointer` naming what is wrong and where; branch on those
        rather than on the prose beside them.
      value:
        error:
          name: schema_validation
          message: Error Validating Requests
        schema:
          - reason: Missing property 'market'
            fix: >-
              Ensure that the object being submitted, matches the schema
              correctly
            code: missing-property
            pointer: /market
            schema_validation_error:
              - missing property 'market'
          - reason: 'MinLength: got 3, want 12'
            fix: >-
              Ensure that the object being submitted, matches the schema
              correctly
            code: constraint-minlength
            pointer: /additional_info/name
            schema_validation_error:
              - 'minLength: got 3, want 12'
    InternalServerError:
      description: Internal Server Error
      value:
        error:
          name: internal_server_error
          message: Internal Server Error
    ServiceUnavailableError:
      description: Service Unavailable Error
      value:
        error:
          name: service_unavailable
          message: Service Unavailable
  securitySchemes:
    Auth:
      type: http
      scheme: bearer
      description: Bearer Authentication

````

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