Skip to main content
When a cardholder reports a problem with a transaction such as unauthorized use, merchandise that never arrived, or a billing error, you can open a dispute on their behalf using the POST /cases endpoint. Marqeta routes the dispute to the appropriate card network and initiates the chargeback process.
The POST /cases endpoint supports two types of submissions: chargeback requests, which initiate the formal dispute and recovery process, and fraud reports, which record fraud for card network reporting purposes but do not initiate chargeback recovery.
The structure of your request payload depends on the following:
  • Card network — Visa, Mastercard, and PULSE each have different payload requirements.
  • Dispute category — Such as Fraud, Consumer, Authorization, or Processing Error.
  • Reason code — The specific reason for the dispute within that category.
Marqeta provides a response that indicates that the dispute has been created successfully or provides an error message if unsuccessful.

Prerequisites

Before creating a dispute, make sure you have the following:
  • Authentication — A valid API key or access token to authenticate your request.
  • original_transaction_token — The token of the transaction being disputed. You can retrieve this using the Transactions API.
  • Card network — The network associated with the original transaction (Visa, Mastercard, or PULSE).
  • Dispute reason — The dispute reason that applies to the cardholder’s situation. See the payload reference below for the full list of supported reason codes by network.

Payload examples

This section provides payload examples to create disputes. These examples are based on scenarios with various combinations of card networks, disputes categories, and reason codes.

Walkthrough

This section walks through the following common dispute scenarios end to end:
  • a Visa consumer dispute
  • a Mastercard dispute
  • a Visa fraud report
  • a PULSE consumer dispute.

Example 1: Visa — Merchandise not received

Scenario: A cardholder purchased a jacket online but never received it. They contacted the merchant with no resolution. Step 1: Identify your parameters
  • Network: Visa
  • Category: Consumer
  • Reason code: SERVICE_NOT_PROVIDED_MERCHANDISE_NOT_RECEIVED
Step 2: Construct the payload
{
    "type": "DISPUTE",
    "memo": "Cardholder reports merchandise never received after contacting merchant",
    "dispute_details": {
        "dispute_reason": "SERVICE_NOT_PROVIDED_MERCHANDISE_NOT_RECEIVED",
        "dispute_amount": 89.99,
        "cardholder_contact_date": "2026-03-10T09:00:00Z",
        "original_transaction_token": "a2d7d73a-02c6-4865-9fa6-6c998a179b2a",
        "consumer_dispute_type_dispute_details": {
            "service_not_provided_merchandise_not_received_details": {
                "detailed_description_of_what_was_purchased_and_explanation_of_the_dispute": "Cardholder ordered a blue denim jacket (size M) on February 20, 2025\. Expected delivery was March 5, 2025\. Item was never received and merchant has not responded to two contact attempts.",
                "expected_receipt_date": "2026-03-05T00:00:00Z",
                "merchandise_or_services": "MERCHANDISE",
                "did_cardholder_attempt_to_resolve_dispute_with_merchant": true,
                "is_attempt_to_resolve_prohibited_by_local_law_or_regulations": false,
                "did_cardholder_return_merchandise": false,
                "did_cardholder_attempt_to_return_merchandise": false,
                "is_merchant_in_bankruptcy_liquidation": false,
                "third_party_gift_card_indicator": false,
                "merchandise_delivered_late": false,
                "was_merchandise_delivered_to_wrong_location": false,
                "did_merchant_cancel_merchandise": false
            }
        }
    }
}
Step 3: Send the request
In the following example, replace the <payload above> text in the last line with the JSON payload from Step 2.
curl \--request POST \
  \--url https://sandbox-api.marqeta.com/v3/cases \
  \--header 'Authorization: Basic <your_credentials>' \
  \--header 'Content-Type: application/json' \
  \--data '<payload above>'
Step 4: Review the response A successful request returns a 201 Created response with a case object. The key fields to note:
  • token — Your unique case identifier. Save this for future status checks.
  • dispute_state — The current state of the dispute in the card network workflow.
  • provisional_credit_granted — Whether a provisional credit has been applied to the cardholder’s account.

Example 2: Mastercard — Cancelled recurring transaction

Scenario: A cardholder was billed for a recurring subscription they cancelled two months ago. Step 1: Identify your parameters
  • Network: Mastercard
  • Reason code: CANCELLED_RECURRING_TRANSACTION
Mastercard payloads generally require the core dispute fields and a network_comment explaining the dispute context. For fraud reports, additional fields are required — see the Fraud Report tab under the Mastercard section for details.
Step 2: Construct the payload
{
    "type": "DISPUTE",
    "memo": "Cardholder cancelled subscription in January; merchant continued billing in February and March.",
    "network_comment": "Cardholder cancelled their monthly streaming subscription on January 15, 2025 via the merchant's online portal and received a confirmation email. Despite cancellation, the merchant charged the cardholder $14.99 on February 1 and March 1, 2025.",
    "dispute_details": {
        "original_transaction_token": "75a1d6d5-01f8-4c9a-b89d-ecf80658e801",
        "dispute_amount": 14.99,
        "dispute_reason": "CANCELLED_RECURRING_TRANSACTION",
        "cardholder_contact_date": "2026-03-05T14:00:00Z"
    }
}
Step 3: Send the request
In the following example, replace the <payload above> text in the last line with the JSON payload from Step 2.
curl \--request POST \
  \--url https://sandbox-api.marqeta.com/v3/cases \
  \--header 'Authorization: Basic <your_credentials>' \
  \--header 'Content-Type: application/json' \
  \--data '<payload above>'
Step 4: Review the response A successful request returns a 201 Created response with a case object. The key fields to note:
  • token — The unique case identifier. Save this for future status checks.
  • dispute_state — The current state of the dispute in the card network workflow.
  • network_case_number - Assigned by Mastercard when the case enters their system.
  • provisional_credit_granted — Whether a provisional credit has been applied to the cardholder’s account.

Example 3: Visa — Fraud report

Scenario: A cardholder reports that a fraudulent application for credit was submitted in the account holder’s name. Step 1: Identify your parameters
  • Network: Visa
  • Category: Fraud Report
  • Reason code: FRAUD_REPORT
  • Fraud type: FRAUDULENT_APPLICATION
Fraud reports record fraud for card network reporting but do not initiate chargeback recovery. If you want to recover funds, use a fraud-category dispute reason code instead.
Step 2: Construct the payload The following is an example of a fraud report request to the Visa card network for a fraudulent application.
In the following example, replace the text of the memo with details relevant to the fraud report.
{
    "dispute_details": {
        "dispute_reason": "FRAUD_REPORT",
        "dispute_amount": 50,
        "fraud_category_type_dispute_details": {
            "fraud_type": "FRAUDULENT_APPLICATION"
        },
        "original_transaction_token": "1c0a45c3-8212-4524-b679-610cf4d231a8",
        "cardholder_contact_date": "2026-03-12T11:30:00Z"
    },

    "memo": "This is a QE test",
    "type": "DISPUTE"
}
Step 3: Send the request
In the following example, replace the <payload above> text in the last line with the JSON payload from Step 2.
curl \--request POST \
  \--url https://sandbox-api.marqeta.com/v3/cases \
  \--header 'Authorization: Basic <your_credentials>' \
  \--header 'Content-Type: application/json' \
  \--data '<payload above>'
Step 4: Review the response A successful request returns a 201 Created response with a case object. For fraud reports, note the following key fields:
  • token — The unique case identifier. Save this for future status checks.
  • dispute_state — The current state of the fraud report in the card network workflow.
  • provisional_credit_granted — For fraud reports, this value will always be false, as no chargeback recovery is initiated.
The following case object is an example of a response sent by the Visa network that related to the payload for the fraud report shown above.
{
  "created_time": "2025-10-10T14:13:49Z",
  "last_modified_time": "2025-10-10T14:13:49Z",
  "token": "qa01-2054",
  "type": "DISPUTE",
  "memo": "This is a QE test",
  "program_short_code": "qa01",
  "user_token": "2ccc806a-d9a4-4357-aa2b-897ec86c409f",
  "state": "CLOSED",
  "dispute_details": {
    "original_transaction_token": "1c0a45c3-8212-4524-b679-610cf4d231a8",
    "original_transaction_type": "authorization.clearing",
    "dispute_amount": 50.00,
    "currency_code": "USD",
    "dispute_reason": "FRAUD_REPORT",
    "network": "Visa",
    "network_case_number": "5155784824",
    "card_token": "8db8321d-56f5-42b4-a9c3-f7d3a64bc92a",
    "provisional_credit_granted": false,
    "acquirer_fee": 0.0000,
    "associated_transaction_selection_required": true
  }
}

Example 4: PULSE — Service not provided

Scenario: A cardholder paid for a home cleaning service that was never performed. They contacted the merchant with no resolution. Step 1: Identify your parameters
  • Network: PULSE
  • Category: Consumer
  • Reason code: SERVICE_NOT_PROVIDED_MERCHANDISE_NOT_RECEIVED
Step 2: Construct the payload
{
    "type": "DISPUTE",
    "memo": "Cardholder paid for home cleaning service that was never performed.",
    "dispute_details": {
        "original_transaction_token": "c14fed48-b3f5-435e-99f2-743cbff97a0f",
        "dispute_amount": 120.00,
        "dispute_reason": "SERVICE_NOT_PROVIDED_MERCHANDISE_NOT_RECEIVED",
        "cardholder_contact_date": "2026-05-10T09:00:00Z",
        "consumer_dispute_type_dispute_details": {
            "service_not_provided_merchandise_not_received_details": {
                "agreed_delivery_date_or_service_date": "2026-05-01T00:00:00Z",
                "cash_over_indicator": "M"
            }
        }
    }
}
Step 3: Send the request
In the following example, replace the <payload above> text in the last line with the JSON payload from Step 2.
curl \--request POST \
  \--url https://sandbox-api.marqeta.com/v3/cases \
  \--header 'Authorization: Basic <your_credentials>' \
  \--header 'Content-Type: application/json' \
  \--data '<payload above>'
Step 4: Review the response A successful request returns a 201 Created response with a case object. The key fields to note:
  • token — The unique case identifier. Save this for future status checks.
  • dispute_state — The current state of the dispute in the PULSE card network workflow.
See the following example case object.
{
  "token": "case-123",
  "type": "DISPUTE",
  "state": "OPEN",
  "memo": "Cardholder paid for home cleaning service that was never performed.",
  "user_token": "usr_8b2c4d1e-9f3a-4b6c-8d2e-1f4a7b9c0e5d",
  "created_time": "2026-05-12T14:23:11.000Z",
  "last_modified_time": "2026-05-12T14:23:11.000Z",
  "dispute_details": {
    "original_transaction_token": "c14fed48-b3f5-435e-99f2-743cbff97a0f",
    "original_transaction_type": "authorization.clearing",
    "dispute_amount": 120.00,
    "currency_code": "USD",
    "dispute_reason": "SERVICE_NOT_PROVIDED_MERCHANDISE_NOT_RECEIVED",
    "dispute_reason_code": "4555",
    "network": "PULSE",
    "card_token": "crd_5e2f1a9b-3c7d-4e8f-a1b2-6d4e9f0c3a7b",
    "cardholder_contact_date": "2026-05-10T09:00:00Z",
    "provisional_credit_granted": false,
    "associated_transaction_selection_required": false,
    "consumer_dispute_type_dispute_details": {
      "service_not_provided_merchandise_not_received_details": {
        "agreed_delivery_date_or_service_date": "2026-05-01T00:00:00Z",
        "cash_over_indicator": "M"
      }
    }
  },
  "case_tags": []
}

Understanding the response

The response schema is the same regardless of card network or reason code, but not all fields will be populated in every response. The fields most relevant to your workflow are:
FieldDescription
tokenUnique identifier for this case. Use it to retrieve or update the case later.
stateThe internal case state within Marqeta’s system.
dispute_stateThe state of the dispute within the card network’s workflow. Possible values vary by card network.
provisional_credit_grantedWhether Marqeta has granted the cardholder a provisional credit while the dispute is in progress.
network_case_numberThe case number assigned by the card network. Available once the case has been submitted to the card network.
network_failure_responsePopulated if the card network rejected the submission. Use this to diagnose and correct the request.
{
    "token": "string",
    "type": "DISPUTE",
    "memo": "string",
    "network_comment": "string",
    "program_short_code": "string",
    "user_token": "string",
    "business_token": "string",
    "state": "NONE",
    "assignee": "string",
    "zendesk_ticket_id": "string",
    "type_change_time": "2026-03-12T11:30:00Z",
    "created_time": "2026-03-12T11:30:00Z",
    "last_modified_time": "2026-03-12T11:30:00Z",
    "dispute_details": {
        "original_transaction_token": "string",
        "original_transaction_id": 1234567,
        "original_transaction_type": "string",
        "dispute_amount": 89.99,
        "dispute_amount_change_reason": "MERCHANT_ISSUED_PARTIAL_REFUND",
        "currency_code": "USD",
        "dispute_reason": "SERVICE_NOT_PROVIDED_MERCHANDISE_NOT_RECEIVED",
        "dispute_reason_code": "string",
        "chargeback_token": "string",
        "network": "Visa",
        "network_case_number": "string",
        "acquirer_fee": 0,
        "associated_transaction_selection_required": true,
        "network_failure_response": "string",
        "card_token": "string",
        "regulation_type": "REG_E",
        "provisional_credit_granted": true,
        "dispute_state": "RETRIEVAL_REQUEST",
        "processing_error_type_dispute_details": {},
        "consumer_dispute_type_dispute_details": {},
        "network_case_status_details": {},
        "additional_dispute_details": {},
        "fraud_dispute_type_details": {},
        "fraud_category_type_dispute_details": {},
        "fraud_classification_type_dispute_details": {},
        "regulation_details": {},
        "partial_dispute_resolution": {},
        "cardholder_contact_date": "2026-03-10T09:00:00Z",
        "account_status": "string"
    }
}

Next steps

After creating a dispute, you can:
  • Check dispute status — Retrieve the case using GET /cases/{token} to monitor its progress through the card network workflow.
  • Update a dispute — Use PUT /cases/{token} to add information or documentation to an open case.
  • Handle card network responses — If network_failure_response is populated, review the error and resubmit with corrected fields.

Error handling

If your request is rejected by the card network, the response includes a network_failure_response field describing the reason for the rejection. Review the value of this field, correct the relevant parameters in your payload, and resubmit the request.

Payload reference

Use the tabs below to find the correct payload for your card network and dispute reason code. For Visa and PULSE payloads with conditional fields, a dependency diagram is provided alongside the flat payload example.

How to read the dependency diagrams

For Visa and PULSE payloads with conditional fields, a dependency diagram is provided alongside the flat payload example. These diagrams show which fields are conditionally required based on the values of other fields. Here is how to read them:
  • Branches — A [BRANCH: VALUE] label means the fields below it are only applicable when the parent field is set to that value.
  • IF conditions — An IF: True or IF: False label means the fields below it are only required when the parent boolean resolves to that value.
  • Optional fields — Fields marked [Optional] are not required to submit the dispute but may be relevant to your case.
Use the flat payload as your starting point, then use the dependency diagram to remove fields that don’t apply to your specific scenario.
Visa dispute payloads include conditional fields that vary by dispute category and reason code. All detail fields must be sent flattened in the request body, regardless of their interdependencies. Flattened means that all fields are included at the same level within their parent object — no conditional nesting based on the values of sibling fields. This section covers five dispute categories — Fraud, Processing Errors, Consumer, Fraud Report, and Authorization — each with flat payload examples and dependency diagrams where applicable.
Fraud disputes cover unauthorized transactions and Europay, Mastercard, and Visa (EMV) liability shift scenarios. Use the reason codes in this category when a cardholder reports a transaction they did not authorize.

EMV_LIABILITY_SHIFT_COUNTERFEIT_FRAUD

Cannot be used for Chip-initiated or fallback transactions.
{
    "type": "DISPUTE",
    "dispute_details": {
        "dispute_reason": "EMV_LIABILITY_SHIFT_COUNTERFEIT_FRAUD",
        "dispute_amount": 100.01,
        "original_transaction_token": "0802aaf5-ee33-4663-a34a-196fb9712797",
        "cardholder_contact_date": "2026-05-01T01:00:00Z",
        "fraud_dispute_type_details": {
            "general_fraud_type_dispute_details": {
                "chip_on_card": true
            }
        }
    }
}

EMV_LIABILITY_SHIFT_NON_COUNTERFEIT_FRAUD

Can only be used when the card has CVM hierarchy where PIN is preferred over signature.
{
    "type": "DISPUTE",
    "dispute_details": {
        "dispute_reason": "EMV_LIABILITY_SHIFT_NON_COUNTERFEIT_FRAUD",
        "dispute_amount": 100.01,
        "original_transaction_token": "0802aaf5-ee33-4663-a34a-196fb9712797",
        "cardholder_contact_date": "2026-05-01T01:00:00Z",
        "fraud_dispute_type_details": {
            "general_fraud_type_dispute_details": {
                "chip_on_card": false
            }
        }
    }
}

NOT_AUTHORIZED_CARD_PRESENT

Condition: Card-present environment.
{
    "type": "DISPUTE",
    "dispute_details": {
        "dispute_reason": "NOT_AUTHORIZED_CARD_PRESENT",
        "dispute_amount": 100.01,
        "original_transaction_token": "a2d7d73a-02c6-4865-9fa6-6c998a179b2a",
        "cardholder_contact_date": "2026-05-01T01:00:00Z",
        "fraud_dispute_type_details": {
            "general_fraud_type_dispute_details": {
                "chip_on_card": true
            }
        }
    }
}

NOT_AUTHORIZED_CARD_ABSENT

{
    "type": "DISPUTE",
    "dispute_details": {
        "original_transaction_token": "0bbf0259-bc8b-46f1-a2de-76135d5993eb",
        "dispute_amount": 99.99,
        "dispute_reason": "NOT_AUTHORIZED_CARD_ABSENT",
        "cardholder_contact_date": "2026-01-15T10:30:00Z",
        "fraud_dispute_type_details": {
            "general_fraud_type_dispute_details": {
                "chip_on_card": false
            }
        }
    }
}