# Dispute Evidence Readiness Checker (`afkdigital/dispute-evidence-readiness-checker`) Actor

Check evidence inventory gaps and provider deadlines from pseudonymous merchant exports. Offline, metadata-only, manual review; no Stripe connection or response submissions.

- **URL**: https://apify.com/afkdigital/dispute-evidence-readiness-checker.md
- **Developed by:** [AFK Digital](https://apify.com/afkdigital) (community)
- **Categories:** E-commerce
- **Stats:** 1 total users, 0 monthly users, 15.4% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 dispute readiness revieweds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Dispute Evidence Readiness Checker

**A privacy-minimized, offline review queue for open payment disputes.** For seller finance/operations teams with authorized anonymized JSON or CSV exports. No Stripe connection, evidence upload, auto-response, bank submission, document authenticity checks, or win-rate predictions.

### Workflow

1. Export only pseudonymous IDs, the provider's reason/status/deadline, and an inventory of the kinds of documents you hold. Never paste a full Stripe dispute object, customer messages, names, addresses, emails, tracking numbers, IPs, card data, photographs, or document bodies.
2. Confirm authorizedDataOnly=true. Give disputes as a JSON array (disputes) **or** pasted RFC 4180 CSV (disputesCsv), never both. Optionally provide orders, deliveries, evidenceInventory using JSON arrays or corresponding \*Csv text fields.
3. Supply evaluationTime as ISO 8601 with an explicit timezone (e.g. 2026-10-12T12:00:00Z), or omit it to use the current UTC time. The optional providerDeadline for each dispute must be ISO 8601 with timezone or Unix seconds. **Missing provider deadline stays null.**
4. Read the Results Dataset for the prioritized checklist and RUN-SUMMARY for counts and omitted results. Human reviewers must verify facts, card network rules, policy disclosures and evidence *contents* with their provider before responding.

#### Example JSON (synthetic, no personal data)

```json
{
  "authorizedDataOnly": true,
  "evaluationTime": "2026-10-12T12:00:00Z",
  "maxResults": 10,
  "disputes": [
    {"disputeId":"du_demo_alpha","provider":"stripe","reason":"product_not_received","status":"needs_response","providerDeadline":"2026-10-14T12:00:00Z","orderId":"orderAlpha","fulfillmentType":"physical"},
    {"disputeId":"du_demo_beta","provider":"stripe","reason":"subscription_canceled","status":"needs_response","orderId":"orderBeta","fulfillmentType":"digital"}
  ],
  "orders": [{"recordId":"orderRecordA","orderId":"orderAlpha","evidenceTypes":["receipt"]}],
  "deliveries": [{"recordId":"deliveryRecordA","orderId":"orderAlpha","evidenceTypes":["shipping_documentation"]}],
  "evidenceInventory": [
    {"recordId":"evidenceRefA","disputeId":"du_demo_alpha","evidenceType":"delivery_confirmation","availability":"unknown"}
  ]
}
```

Additional examples: examples/input.json and examples/csv-input.json.

### CSV headers

- disputesCsv: disputeId,provider,reason,status,providerDeadline,orderId,fulfillmentType,sourceRecordId. Required: first four. Provider is stripe or other. Reason is the provider's snake_case code; fulfillmentType is physical, digital, service, or unknown. sourceRecordId is optional and defaults to disputeId.
- ordersCsv / deliveriesCsv: recordId,orderId,disputeId,evidenceTypes. At least one linking ID (orderId or disputeId). Evidence types are separated by |, e.g. receipt|product_description. Blank evidenceTypes does **not** imply the existence of any evidence.
- evidenceCsv: recordId,orderId,disputeId,evidenceType,availability. Availability is available, missing or unknown. A record providing both orderId and disputeId must match both; contradictory joins are ignored.
- Each row is restricted to its listed fields. Unknown columns are rejected to avoid accidental personal data copying. IDs must be short pseudonymous tokens with at least one letter; email, spaces and long digit runs are prohibited.
- JSON inputs use corresponding key names (evidenceInventory JSON accepts recordId, links, evidenceType and availability).

Inventory evidence types: receipt; customer_communication; shipping_documentation; delivery_confirmation; access_activity_log; service_documentation; product_description; refund_policy; refund_record; cancellation_policy; cancellation_rebuttal; cancellation_record; duplicate_charge_documentation; duplicate_charge_explanation; authorization_record; customer_signature; terms_acceptance; other_documentation.

### Results and priorities

Results have only disputeId, provider, providerReason, providerStatus, providerDeadline, evaluationTime, deadlineStatus, hoursToDeadline, reviewPriority, responsePending, suggestedEvidenceTypes, availableEvidenceTypes, missingEvidenceTypes, unconfirmedEvidenceTypes, evidenceReferenceIds, sourceRecordIds, uncertainties, evidenceContentsValidated=false and recommendedForHumanReview.

Rank: P0_OVERDUE (passed), P1_URGENT (0-24 hours), P2_HIGH (24-72 hours), P2_VERIFY_PROVIDER_DEADLINE (missing date), P3_SOON (72 hours-7 days), P4_ROUTINE (later), NO_RESPONSE_PENDING (closed, under review, won/lost). Re-run manually with fresh data: no cross-run monitoring. Review order sorted by urgency and deadline. maxResults 1-200, inputs up to 2,000 rows per category.

**Checklist is not legal or network-required evidence.** An evidence type marked available means the *inventory says a record exists*. It does not prove the document is correct, sufficient, authentic, persuasive, or ready for submission. Unknown inventory status is separate from missing. The service never predicts a win or sends a dispute response. Stripe's evidence standards vary by reason, network and case.

### Stripe field mapping (official documentation checked 2026-10-12)

The Stripe charge dispute API object exposes reason, status, evidence_details.due_by (Unix seconds) and evidence types including receipt, customer_communication, shipping_documentation, access_activity_log, product_description, cancellation_policy, duplicate_charge_documentation and others. Statuses include needs_response and warning_needs_response, under_review and closed/won/lost states. Map *only* the selected non-sensitive fields to this Actor's small schema. Direct Stripe API connection is intentionally not included in v1.

- https://docs.stripe.com/api/disputes/object
- https://docs.stripe.com/disputes/categories
- https://docs.stripe.com/disputes/responding
- https://docs.stripe.com/disputes/visual-evidence

### Data protection

Strict per-record field whitelist. The Actor refuses raw evidence object exports and unrecognized fields instead of echoing them. Validation errors use fixed error codes without field values. Identifier format rejects common PII and long card-like numeric strings. Dataset contains only status and bounded source IDs, not original order entries, shipping details, message bodies or documents. Logs contain aggregate counts only. RUN-SUMMARY contains aggregate counts and methodology. Inputs are marked isSecret in the Apify schema, but remain subject to Apify's own storage/retention policies: **pseudonymize before input**, do not use this as a private document vault. No outbound network or account tokens are needed.

### Comparison to provider and other competitors

| Product | Existing capabilities | Difference from this Actor |
|---|---|---|
| Stripe Smart Disputes | Native Stripe AI, builds and submits evidence on eligible cases | API18 is only an offline preflight inventory checklist. **Not a Smart Disputes replacement**. |
| Chargeflow Automation | Multi-platform dispute integrations, evidence gathering and submissions | API18 has no integration, raw document processing, response or recovery claim. |
| Justt | Enterprise automation and tailored case defenses | API18 is a deterministic, small-scale human review queue. |
| API18 | Pseudonymous CSV/JSON evidence gap/deadline review | No provider connection or automated evidence/response. |

Public Apify Store targeted searches for comparable actors did not establish a directly equivalent offering on the review date; this is not a claim that none exist. References: https://stripe.com/payments/dispute-management ; https://www.chargeflow.io/products/automation ; https://justt.ai/ ; see docs/COMPETITORS.md.

### Pricing

Designed as Apify Pay per event: **USD 0.003 per successfully saved dispute result**, plus **USD 0.00005 startup event** per run. Up to 200 results per run (maximum USD 0.60005 in those events, excluding any separately enabled platform usage). Verify current pricing on the Actor Store page. Execution honors user maxTotalChargeUsd for result events and records incomplete work in RUN-SUMMARY. Validation failure generates no paid result events but platform startup costs may still apply.

This product is independently developed and is not affiliated with Stripe, Chargeflow or Justt. No legal advice, guaranteed timeliness, regulatory compliance, evidence validity, favorable dispute outcomes, payment actions, response submission, file upload or refund processing.

# Actor input Schema

## `authorizedDataOnly` (type: `boolean`):

Required confirmation: records are yours or authorized and pseudonymized, with no names, emails, postal addresses, phone numbers, IP addresses or raw evidence. The prefilled confirmation applies only to the included demonstration input. If you replace the sample, check your own rights and confirm deliberately.

## `disputes` (type: `array`):

Use pseudonymous IDs plus provider, reason, status, optional providerDeadline (ISO 8601 timezone or Unix seconds), orderId and fulfillmentType. Strict whitelist; no full Stripe object.

## `disputesCsv` (type: `string`):

Paste CSV with headers disputeId,provider,reason,status and optionally providerDeadline,orderId,fulfillmentType,sourceRecordId. Do not provide disputes JSON and CSV together.

## `orders` (type: `array`):

Optional recordId, orderId and/or disputeId, evidenceTypes array only. No order addresses or receipts.

## `ordersCsv` (type: `string`):

Optional. Columns recordId,orderId,disputeId,evidenceTypes; separate multiple types with |.

## `deliveries` (type: `array`):

Optional recordId, orderId and/or disputeId, evidenceTypes array. No tracking number, delivery photo or recipient information.

## `deliveriesCsv` (type: `string`):

Optional. Columns recordId,orderId,disputeId,evidenceTypes; no addresses or tracking details.

## `evidenceInventory` (type: `array`):

Optional list of {recordId,disputeId or orderId,evidenceType,availability: available|missing|unknown}. No documents or raw text.

## `evidenceCsv` (type: `string`):

Optional. Columns recordId,disputeId,orderId,evidenceType,availability. Only metadata and pseudonymous references.

## `evaluationTime` (type: `string`):

Optional ISO 8601 with explicit Z or offset. If empty, UTC runtime time. No assumed dispute deadline.

## `maxResults` (type: `integer`):

Sort urgent and unknown-deadline response cases first; cap output.

## Actor input object example

```json
{
  "authorizedDataOnly": true,
  "disputes": [
    {
      "disputeId": "du_demo_alpha",
      "sourceRecordId": "exportDisputeA",
      "provider": "stripe",
      "reason": "product_not_received",
      "status": "needs_response",
      "providerDeadline": "2026-10-14T12:00:00Z",
      "orderId": "orderAlpha",
      "fulfillmentType": "physical"
    },
    {
      "disputeId": "du_demo_beta",
      "sourceRecordId": "exportDisputeB",
      "provider": "stripe",
      "reason": "subscription_canceled",
      "status": "needs_response",
      "orderId": "orderBeta",
      "fulfillmentType": "digital"
    },
    {
      "disputeId": "du_demo_gamma",
      "provider": "stripe",
      "reason": "duplicate",
      "status": "won",
      "providerDeadline": "2026-10-13T12:00:00Z"
    }
  ],
  "evaluationTime": "",
  "maxResults": 25
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `summary` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "authorizedDataOnly": true,
    "disputes": [
        {
            "disputeId": "du_demo_alpha",
            "sourceRecordId": "exportDisputeA",
            "provider": "stripe",
            "reason": "product_not_received",
            "status": "needs_response",
            "providerDeadline": "2026-10-14T12:00:00Z",
            "orderId": "orderAlpha",
            "fulfillmentType": "physical"
        },
        {
            "disputeId": "du_demo_beta",
            "sourceRecordId": "exportDisputeB",
            "provider": "stripe",
            "reason": "subscription_canceled",
            "status": "needs_response",
            "orderId": "orderBeta",
            "fulfillmentType": "digital"
        },
        {
            "disputeId": "du_demo_gamma",
            "provider": "stripe",
            "reason": "duplicate",
            "status": "won",
            "providerDeadline": "2026-10-13T12:00:00Z"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("afkdigital/dispute-evidence-readiness-checker").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "authorizedDataOnly": True,
    "disputes": [
        {
            "disputeId": "du_demo_alpha",
            "sourceRecordId": "exportDisputeA",
            "provider": "stripe",
            "reason": "product_not_received",
            "status": "needs_response",
            "providerDeadline": "2026-10-14T12:00:00Z",
            "orderId": "orderAlpha",
            "fulfillmentType": "physical",
        },
        {
            "disputeId": "du_demo_beta",
            "sourceRecordId": "exportDisputeB",
            "provider": "stripe",
            "reason": "subscription_canceled",
            "status": "needs_response",
            "orderId": "orderBeta",
            "fulfillmentType": "digital",
        },
        {
            "disputeId": "du_demo_gamma",
            "provider": "stripe",
            "reason": "duplicate",
            "status": "won",
            "providerDeadline": "2026-10-13T12:00:00Z",
        },
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("afkdigital/dispute-evidence-readiness-checker").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "authorizedDataOnly": true,
  "disputes": [
    {
      "disputeId": "du_demo_alpha",
      "sourceRecordId": "exportDisputeA",
      "provider": "stripe",
      "reason": "product_not_received",
      "status": "needs_response",
      "providerDeadline": "2026-10-14T12:00:00Z",
      "orderId": "orderAlpha",
      "fulfillmentType": "physical"
    },
    {
      "disputeId": "du_demo_beta",
      "sourceRecordId": "exportDisputeB",
      "provider": "stripe",
      "reason": "subscription_canceled",
      "status": "needs_response",
      "orderId": "orderBeta",
      "fulfillmentType": "digital"
    },
    {
      "disputeId": "du_demo_gamma",
      "provider": "stripe",
      "reason": "duplicate",
      "status": "won",
      "providerDeadline": "2026-10-13T12:00:00Z"
    }
  ]
}' |
apify call afkdigital/dispute-evidence-readiness-checker --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,afkdigital/dispute-evidence-readiness-checker"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/eFzWdc1GPchUr0WcG/builds/BjEb9CSTalMPb5gge/openapi.json
