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

> ## Agent Instructions
> Money is always a decimal string at the currency's precision (for example "29.00"), paired with an ISO 4217 currency field. Never use minor units.
> Build against the sandbox first: base URL https://sandbox-api.bachs.io with sk_sandbox_ keys. Production is https://api.bachs.io with sk_live_ keys; going live is a key swap.
> Treat webhooks (for example collection.succeeded) as the source of truth for fulfilment, never client-side events or redirects.
> Subscriptions are created by completing a checkout for a recurring product. There is no direct create-subscription endpoint.
> IDs carry resource prefixes (cust_, prod_, sub_, chk_, inv_, ref_) and timestamps are ISO 8601 UTC.

# Update checkout settings

> Update checkout configuration for your account context, including enabled payment methods and fee preference.



## OpenAPI

````yaml /docs/openapi/openapi.json put /v1/accounts/checkout/settings
openapi: 3.0.3
info:
  title: Bachs API
  version: 1.0.0
  description: >-
    The Bachs API lets you accept payments, manage subscriptions, and move money
    across African markets.


    - **Authentication:** pass your secret key as `Authorization: Bearer
    sk_...`. See [Authentication](/authentication) for keys, scopes, and sandbox
    vs production.

    - **Errors:** errors use `detail` and `error_code`; `doc_url` and
    field-level `errors` are optional. See [Errors](/errors).

    - **Pagination:** list endpoints return `{ items, pagination }`. See
    [Pagination](/guides/pagination).

    - **Idempotency:** use `Idempotency-Key` on public `POST` and `PATCH`;
    reconcile uncertain write outcomes before retrying. See
    [Idempotency](/guides/idempotency).

    - **Base URLs and rate limits:** see the
    [Introduction](/api-reference/overview).
  contact:
    name: Bachs Support
    url: https://bachs.io
servers:
  - url: https://api.bachs.io
    description: Production
  - url: https://sandbox-api.bachs.io
    description: Sandbox
security:
  - ApiKeyAuth: []
tags:
  - name: Payments
    description: Accept payments from customers
  - name: Refunds
    description: Create and manage customer refunds
  - name: Disputes
    description: Respond to chargebacks and manage dispute evidence
  - name: Balances
    description: View balances and account information
  - name: Conversions
    description: Quote, execute, and query currency conversions
  - name: Payouts
    description: Withdraw funds to external accounts
  - name: Webhooks
    description: Receive real-time payment notifications
  - name: Authentication
    description: API key management and authentication
  - name: Customers
    description: Create and manage customers
  - name: Products
    description: Define and manage your billing catalog
  - name: Product Groups
    description: Bundle products for multi-plan checkout
  - name: Media
    description: Upload files and get an upload_id to attach to products
  - name: Checkouts
    description: Create and manage API-driven checkouts without products
  - name: Subscriptions
    description: >-
      Recurring billing. Subscriptions are created through checkout; manage them
      here.
  - name: Customer sessions
    description: >-
      Open a hosted portal session so a customer can manage their own
      subscriptions, invoices and cards.
  - name: Accounts
    description: >-
      Create the accounts your platform onboards, request their capabilities,
      walk them through their requirements, and read what they still owe.
  - name: Transfers
    description: Move funds between your platform and the accounts you own.
  - name: Platform Fees
    description: Read the platform's cut of an account's sale.
  - name: Virtual Accounts
    description: Create and read fixed bank account numbers for receiving deposits.
paths:
  /v1/accounts/checkout/settings:
    put:
      tags:
        - Accounts
      summary: Update checkout settings
      description: >-
        Update checkout configuration for your account context, including
        enabled payment methods and fee preference.
      operationId: updateCheckoutSettings
      parameters:
        - name: X-Account-Id
          in: header
          required: false
          schema:
            type: string
          description: Account ID when acting on behalf of a sub-account.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                enabled_payment_methods:
                  type: object
                  additionalProperties:
                    type: object
                    properties:
                      enabled:
                        type: boolean
                      currencies:
                        type: object
                        additionalProperties:
                          type: boolean
                  description: >-
                    The corridors to offer at checkout, keyed by exact corridor
                    (`USD_CARD`, `NGN_CARD`, `NGN_BANK_TRANSFER`,
                    `MOMO_GHS`..`MOMO_ZMW`, `CRYPTO`) -- see [payment method
                    support](/guides/payments/payment-method-support). Each
                    entry you send must carry an `enabled` boolean; `CRYPTO`
                    additionally accepts a `currencies` map of per-asset
                    booleans. This replaces the stored configuration wholesale:
                    a corridor you omit resets to its platform default rather
                    than keeping its current state.
                fee_preference:
                  type: string
                  enum:
                    - customer_pays
                    - org_pays
                  description: >-
                    Who pays the processing fee on a checkout from now on.
                    `customer_pays`: the fee is added on top of the amount the
                    customer pays, so you settle the full amount. `org_pays`:
                    you absorb the fee and it is netted out of what settles into
                    your balance. Omit the field to leave the current preference
                    untouched.
                  example: org_pays
              description: >-
                Provide one or both fields: `enabled_payment_methods` and
                `fee_preference`.
              anyOf:
                - required:
                    - enabled_payment_methods
                - required:
                    - fee_preference
            example:
              enabled_payment_methods:
                USD_CARD:
                  enabled: true
                NGN_BANK_TRANSFER:
                  enabled: true
                MOMO_GHS:
                  enabled: true
                MOMO_XAF:
                  enabled: true
                MOMO_XOF:
                  enabled: true
                CRYPTO:
                  enabled: false
                  currencies:
                    BNB_BEP20: false
                    ETH_ETH: false
                    SOL_SOL: false
                    USDC_BEP20: false
                    USDT_BEP20: false
                    USDT_ERC20: false
                    USDT_SOL: false
                    USDT_TRC20: false
              fee_preference: org_pays
      responses:
        '200':
          description: Success - Checkout settings updated
          content:
            application/json:
              schema:
                type: object
                properties:
                  organization_id:
                    type: string
                    description: >-
                      The account whose settings were updated, which is the
                      account your API key belongs to, or the account you named
                      in `X-Account-Id`.
                    example: acct_7KpQ2mNv4XbR9dLc
                  enabled_payment_methods:
                    type: object
                    additionalProperties:
                      type: object
                    description: >-
                      The stored configuration after the update, keyed by exact
                      corridor. The update replaces the whole map, so this
                      returns the corridors you sent and nothing else. Read it
                      back to confirm which corridors are now live at checkout.
                  fee_preference:
                    type: string
                    enum:
                      - customer_pays
                      - org_pays
                    description: >-
                      Who now pays the processing fee on a checkout.
                      `customer_pays`: the fee is added on top of the amount the
                      customer pays, so you settle the full amount. `org_pays`:
                      you absorb the fee and it is netted out of what settles
                      into your balance.
                    example: org_pays
                  message:
                    type: string
                    description: >-
                      A confirmation string for the update. Do not branch on it,
                      since the returned `enabled_payment_methods` and
                      `fee_preference` carry the state you should check.
                    example: Checkout settings updated successfully
              example:
                organization_id: acct_7KpQ2mNv4XbR9dLc
                enabled_payment_methods:
                  USD_CARD:
                    enabled: true
                  NGN_BANK_TRANSFER:
                    enabled: true
                  MOMO_GHS:
                    enabled: true
                  MOMO_XAF:
                    enabled: true
                  MOMO_XOF:
                    enabled: true
                  CRYPTO:
                    enabled: false
                    currencies:
                      BNB_BEP20: false
                      ETH_ETH: false
                      SOL_SOL: false
                      USDC_BEP20: false
                      USDT_BEP20: false
                      USDT_ERC20: false
                      USDT_SOL: false
                      USDT_TRC20: false
                fee_preference: org_pays
                message: Checkout settings updated successfully
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '429':
          $ref: '#/components/responses/TooManyRequests'
        '500':
          $ref: '#/components/responses/InternalServerError'
      security:
        - ApiKeyAuth: []
components:
  responses:
    BadRequest:
      description: >-
        Bad Request - Validation errors or invalid request format. Check the
        `details` object for field-specific validation errors. Common causes:
        missing required fields, invalid data types, values outside allowed
        ranges, or invalid formats.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            detail: Invalid request parameters
            error_code: VALIDATION_ERROR
            errors:
              - field: amount
                message: Amount must be a positive decimal string
                type: value_error
      headers:
        X-RateLimit-Limit:
          description: Maximum number of requests allowed per minute
          schema:
            type: integer
            example: 100
        X-RateLimit-Remaining:
          description: Number of requests remaining in the current window
          schema:
            type: integer
            example: 95
        X-RateLimit-Reset:
          description: Unix timestamp when the rate limit window resets
          schema:
            type: integer
            example: 1706102400
    Unauthorized:
      description: >-
        Unauthorized - Invalid, missing, or expired API key. Verify your API key
        is correctly formatted and included in the Authorization header as
        `Bearer sk_sandbox_...` or `Bearer sk_live_...`. Check that your key
        hasn't been revoked.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            detail: Invalid API key
            error_code: UNAUTHORIZED
      headers:
        X-RateLimit-Limit:
          description: Maximum number of requests allowed per minute
          schema:
            type: integer
            example: 100
        X-RateLimit-Remaining:
          description: Number of requests remaining in the current window
          schema:
            type: integer
            example: 95
        X-RateLimit-Reset:
          description: Unix timestamp when the rate limit window resets
          schema:
            type: integer
            example: 1706102400
    Forbidden:
      description: >-
        Forbidden - API key does not have permission for the requested resource.
        Verify you're using the correct account's API key and that you're not
        trying to access another account's data.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            detail: API key does not have permission for this operation
            error_code: FORBIDDEN
      headers:
        X-RateLimit-Limit:
          description: Maximum number of requests allowed per minute
          schema:
            type: integer
            example: 100
        X-RateLimit-Remaining:
          description: Number of requests remaining in the current window
          schema:
            type: integer
            example: 95
        X-RateLimit-Reset:
          description: Unix timestamp when the rate limit window resets
          schema:
            type: integer
            example: 1706102400
    NotFound:
      description: >-
        Not Found - The requested resource does not exist. Verify the resource
        ID is correct and that it belongs to your account.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            detail: Resource not found
            error_code: NOT_FOUND
      headers:
        X-RateLimit-Limit:
          description: Maximum number of requests allowed per minute
          schema:
            type: integer
            example: 100
        X-RateLimit-Remaining:
          description: Number of requests remaining in the current window
          schema:
            type: integer
            example: 95
        X-RateLimit-Reset:
          description: Unix timestamp when the rate limit window resets
          schema:
            type: integer
            example: 1706102400
    TooManyRequests:
      description: >-
        Too Many Requests - Rate limit exceeded. Standard tier allows 100
        requests per minute per API key. Wait a few seconds before retrying.
        Check X-RateLimit-Reset header for when the window resets.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            detail: Rate limit exceeded. Please retry after a few seconds.
            error_code: TOO_MANY_REQUESTS
      headers:
        X-RateLimit-Limit:
          description: Maximum number of requests allowed per minute
          schema:
            type: integer
            example: 100
        X-RateLimit-Remaining:
          description: Number of requests remaining in the current window (will be 0)
          schema:
            type: integer
            example: 0
        X-RateLimit-Reset:
          description: Unix timestamp when the rate limit window resets
          schema:
            type: integer
            example: 1706102400
        Retry-After:
          description: Number of seconds to wait before retrying
          schema:
            type: integer
            example: 30
    InternalServerError:
      description: >-
        Internal Server Error - An unexpected error occurred while processing
        the request. Retry with exponential backoff. If the issue persists,
        contact support with your request context.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            detail: An unexpected error occurred. Please try again later.
            error_code: INTERNAL_SERVER_ERROR
      headers:
        X-RateLimit-Limit:
          description: Maximum number of requests allowed per minute
          schema:
            type: integer
            example: 100
        X-RateLimit-Remaining:
          description: Number of requests remaining in the current window
          schema:
            type: integer
            example: 95
        X-RateLimit-Reset:
          description: Unix timestamp when the rate limit window resets
          schema:
            type: integer
            example: 1706102400
  schemas:
    Error:
      type: object
      description: Standard error response format used across all API endpoints
      properties:
        detail:
          type: string
          description: Human-readable error message explaining what went wrong.
          example: Invalid request parameters
        error_code:
          type: string
          description: >-
            Machine-readable error code. Use this to handle errors
            programmatically. Common codes: VALIDATION_ERROR, UNAUTHORIZED,
            FORBIDDEN, NOT_FOUND, CONFLICT, TOO_MANY_REQUESTS,
            INTERNAL_SERVER_ERROR, BAD_GATEWAY, SERVICE_UNAVAILABLE.
          example: VALIDATION_ERROR
        errors:
          type: array
          description: >-
            Optional field-level details on some validation errors. Other
            validation responses contain only detail and error_code. Entry
            fields depend on the validation source.
          items:
            type: object
            properties:
              field:
                type: string
                description: The field that failed validation.
                example: amount
              message:
                type: string
                description: Description of the validation failure.
                example: Amount must be a positive decimal string
              type:
                type: string
                description: Error type identifier.
                example: value_error
              code:
                type: string
                description: >-
                  Optional requirement-field rejection code. Some validation
                  entries provide code instead of type.
                example: currency_not_supported
            required:
              - field
              - message
        doc_url:
          type: string
          description: Optional link to documentation for this error; some errors omit it.
          example: https://docs.bachs.io/api-reference/error-reference#general
      required:
        - detail
        - error_code
  securitySchemes:
    ApiKeyAuth:
      type: http
      scheme: bearer
      bearerFormat: API Key
      description: >-
        Bearer token authentication. Pass your API key as `Authorization: Bearer
        sk_...`. See [Authentication](/authentication) for keys, scopes, and
        sandbox vs production.

````

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