> ## 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.

# Get Dispute

> Retrieve full details for a single dispute, including the current evidence draft and latest submission metadata.



## OpenAPI

````yaml /docs/openapi/openapi.json get /v1/disputes/{dispute_id}
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/disputes/{dispute_id}:
    get:
      tags:
        - Disputes
      summary: Get Dispute
      description: >-
        Retrieve full details for a single dispute, including the current
        evidence draft and latest submission metadata.
      operationId: getDispute
      parameters:
        - name: dispute_id
          in: path
          required: true
          description: Unique identifier for the dispute.
          schema:
            type: string
      responses:
        '200':
          description: Dispute retrieved successfully.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DisputeResponse'
              example:
                dispute_id: dsp_3e7b1c9a2f48
                charge_id: ch_8f3a1c9b4e72
                amount: '75.00'
                currency: USD
                status: under_review
                is_response_editable: false
                reason: fraudulent
                response_deadline_at: '2026-03-23T23:59:59.000Z'
                evidence:
                  customer_name: Amara Osei
                  customer_email_address: customer@example.com
                  product_description: Annual SaaS subscription, plan ID PLAN-PRO-001
                  service_date: '2026-03-01'
                  notes: Customer confirmed delivery via email on March 5.
                  customer_communication_attachment_id: upl_9f2c7b3d1e45
                latest_submission:
                  submission_id: dse_a1b2c3d4e5f6
                  status: submitted
                  trigger_source: merchant_submit
                  submitted_at: '2026-03-10T09:15:00.000Z'
                  failed_at: null
                  attempt_sequence: 1
                created_at: '2026-03-09T08:00:00.000Z'
                updated_at: '2026-03-10T09:15:00.000Z'
        '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:
  schemas:
    DisputeResponse:
      type: object
      description: >-
        Detailed dispute payload including evidence and latest submission
        metadata.
      properties:
        dispute_id:
          type: string
          description: Unique dispute identifier.
        charge_id:
          type: string
          nullable: true
          description: Associated payment/charge identifier, if linked.
        amount:
          type: string
          description: Disputed amount as a decimal string.
        currency:
          type: string
          description: ISO 4217 currency code for the disputed amount.
        status:
          type: string
          description: >-
            The current state of the dispute. A flat dispute fee is debited from
            your balance as soon as the dispute record is created, whichever of
            these states it starts in, and it is not charged again or refunded
            at resolution. `needs_response`: the dispute is open against you and
            you must submit evidence before `response_deadline_at`; no further
            funds have moved beyond that fee. `under_review`: your evidence has
            been submitted and the outcome is being decided; no further funds
            have moved beyond that fee. `won`: the dispute was decided in your
            favour and you keep the funds, and this state is terminal. `lost`:
            the dispute was decided against you, and the disputed amount is
            additionally debited from your balance, and this state is terminal.
            `closed`: the dispute was closed with no further action available to
            you, and this state is terminal.
          enum:
            - needs_response
            - under_review
            - won
            - lost
            - closed
          example: under_review
        is_response_editable:
          type: boolean
          description: Whether evidence is still editable for this dispute.
        reason:
          type: string
          nullable: true
          description: Dispute reason code reported by the payment network.
        response_deadline_at:
          type: string
          format: date-time
          nullable: true
          description: Evidence submission deadline in ISO 8601 format.
        evidence:
          $ref: '#/components/schemas/DisputeEvidence'
        latest_submission:
          allOf:
            - $ref: '#/components/schemas/DisputeSubmission'
          nullable: true
          description: Most recent submission attempt for this dispute.
        created_at:
          type: string
          format: date-time
          description: Dispute creation timestamp.
        updated_at:
          type: string
          format: date-time
          description: Most recent update timestamp.
      required:
        - dispute_id
        - amount
        - currency
        - status
        - is_response_editable
        - evidence
        - created_at
        - updated_at
    DisputeEvidence:
      type: object
      description: Evidence fields attached to a dispute response.
      properties:
        access_activity_log:
          type: string
          description: >-
            An access or activity log showing the customer used what they paid
            for.
        billing_address:
          type: string
          nullable: true
          description: Customer's billing address.
        cancellation_policy_attachment_id:
          type: string
          description: Upload id of your cancellation policy document.
        cancellation_policy_disclosure:
          type: string
          nullable: true
          description: Cancellation policy shown to the customer.
        customer_communication_attachment_id:
          type: string
          nullable: true
          description: Uploaded customer communication document identifier.
        customer_email_address:
          type: string
          nullable: true
          description: Email address of the customer.
        customer_name:
          type: string
          nullable: true
          description: Full name of the customer.
        notes:
          type: string
          nullable: true
          description: Additional context supporting the dispute response.
        product_description:
          type: string
          nullable: true
          description: Description of delivered goods or services.
        refund_policy_attachment_id:
          type: string
          description: Upload id of your refund policy document.
        refund_policy_disclosure:
          type: string
          nullable: true
          description: Refund policy shown to the customer.
        refund_refusal_explanation:
          type: string
          nullable: true
          description: Reason a refund was not granted.
        service_date:
          type: string
          nullable: true
          description: Date the service was delivered.
        uncategorized_attachment_id:
          type: string
          nullable: true
          description: Uploaded supporting document identifier.
    DisputeSubmission:
      type: object
      description: Metadata for a dispute evidence submission attempt.
      properties:
        submission_id:
          type: string
          description: Unique identifier for this submission attempt.
        status:
          type: string
          description: Submission delivery status.
        trigger_source:
          type: string
          description: What triggered the submission attempt.
        submitted_at:
          type: string
          format: date-time
          nullable: true
          description: Timestamp when submission was delivered.
        failed_at:
          type: string
          format: date-time
          nullable: true
          description: Timestamp when submission failed, if applicable.
        attempt_sequence:
          type: integer
          description: Submission attempt sequence number.
      required:
        - submission_id
        - status
        - trigger_source
        - attempt_sequence
    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
  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
  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.