Getting Started
Triple offers two integration paths. Pick the one that matches what you already have:
- Path A: Embed intake. Use this if the cardholder is about to describe the dispute in your app and you want Triple to collect the statement, classify the case, and run the evaluation.
- Path B: Call evaluations directly. Use this if you already have the transaction, card, and evidence in structured form.
Both paths land you in the same place: an evaluation result with a confidence score, a proposed card-network reason code, and the gaps weakening the case.
Prerequisites
- A Triple account with API access
- Access to authorization and clearing data for your disputes
- HTTPS endpoint for receiving webhook notifications (recommended)
Step 1: Get your API key
API keys are managed through the Triple Dashboard:
- Log in to your Triple Dashboard
- Navigate to Settings → API Keys
- Click Create API Key
- Copy and securely store your key
Your API key will only be shown once. Store it securely and never expose it in client-side code.
Path A: Embed intake
The fastest path. Triple's hosted form or chatbot runs inside your app in an iframe. When the cardholder finishes, we hand you back an evaluation.
The intake endpoints and events shown below are under active development. Field names and event shapes may change before GA.
1. Create an intake session
The intake request mirrors the evaluations request: transaction and card use the same shape as POST /evaluations/, so you can pass the same data without reshaping it.
curl -X POST https://api.disputes.sandbox.tripledev.app/api/intake/sessions/ \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"transaction": {
"transaction_id": "txn_12345",
"card_scheme": "MC",
"channel_type": "ECOMMERCE",
"merchant_name": "ACME Store",
"merchant_country": "USA",
"transaction_amount": 299.99,
"transaction_currency": "USD",
"merchant_id": "MERCHANT123",
"transaction_timestamp": "2024-01-20T10:30:00Z",
"settlement_timestamp": "2024-01-22T00:00:00Z",
"arn": "12345678901234567890123",
"rrn": "123456789012",
"merchant_category_code": "5311",
"terminal_id": "term_01",
"mobile_wallet": null,
"avs_result": "NO_MATCH",
"cvv_match": false,
"eci_code": "05",
"batch_id": "batch_001"
},
"card": {
"bin": "54133388",
"last_4": "1234",
"emv_chip_enabled": true,
"emv_pin_preferring": false
},
"cardholder": {
"external_id": "cust_9f3a2"
}
}'
You get back a short-lived URL:
{
"id": "is_a1b2c3",
"url": "https://intake.triple.app/s/is_a1b2c3",
"expires_at": "2026-04-23T16:30:00Z",
"status": "pending"
}
2. Embed the returned URL
<iframe
src="https://intake.triple.app/s/is_a1b2c3"
width="480"
height="640"
allow="clipboard-write"
></iframe>
3. Listen for completion
When the cardholder finishes, Triple posts a message to the parent window and (if configured) fires a webhook.
window.addEventListener('message', (event) => {
if (event.origin !== 'https://intake.triple.app') return;
if (event.data?.type === 'triple.intake.completed') {
const { intake_session_id, evaluation_id } = event.data;
// evaluation_id is ready to fetch
}
});
4. Fetch the evaluation result
Same endpoint as Path B, using the evaluation_id you just received. See Receive the result below for the shape.
See Intake integration for the full reference.
Path B: Call evaluations directly
Use this path when your system already holds the transaction, card, and evidence for the dispute.
1. Submit an evaluation
curl -X POST https://api.disputes.sandbox.tripledev.app/api/evaluations/ \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"dispute": {
"disputed_amount": 299.99,
"disputed_currency": "USD"
},
"transaction": {
"transaction_id": "txn_12345",
"card_scheme": "MC",
"channel_type": "ECOMMERCE",
"merchant_name": "ACME Store",
"merchant_country": "USA",
"transaction_amount": 299.99,
"transaction_currency": "USD",
"merchant_id": "MERCHANT123",
"transaction_timestamp": "2024-01-20T10:30:00Z",
"settlement_timestamp": "2024-01-22T00:00:00Z",
"arn": "12345678901234567890123",
"rrn": "123456789012",
"merchant_category_code": "5311",
"terminal_id": "term_01",
"mobile_wallet": null,
"avs_result": "NO_MATCH",
"cvv_match": false,
"eci_code": "05",
"batch_id": "batch_001"
},
"card": {
"bin": "54133388",
"last_4": "1234",
"emv_chip_enabled": true,
"emv_pin_preferring": false
},
"evidences": {
"cardholder_statement": "I did not make this purchase. My card was in my possession at all times."
}
}'
Notice there is no category field in the request above. Triple classifies the dispute internally from the transaction, card, and evidence you sent. You don't map your own reason codes to Triple's categories.
The API returns an evaluation ID:
{
"id": "550e8400-e29b-41d4-a716-446655440000"
}
Store this ID. You will need it to retrieve the evaluation result.
2. Store the evaluation ID
Evaluations are processed asynchronously, so persist the id you got back.
Receive the result
However the evaluation started (Path A or Path B), results come back the same way. The recommended approach is configuring a webhook endpoint, where your server receives an HTTP POST as soon as the evaluation finishes.
As a fallback, you can poll the result endpoint using the evaluation ID:
curl https://api.disputes.sandbox.tripledev.app/api/evaluations/{evaluation_id}/result \
-H "Authorization: Bearer $API_KEY"
The result contains:
- Category: The dispute category Triple classified the case as
- Confidence:
high,moderate_high,moderate_low, orlow - Reason code: Proposed card-network reason code (may be
nullif the evidence isn't enough for a precise mapping) - Failed checks: Specific issues that affected the confidence score, or missing information
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"category": "fraud",
"confidence": "high",
"reason_code": "4837",
"failed_checks": []
}
Next steps
- Intake overview: what the hosted form and chatbot collect
- Intake integration: the full session and iframe reference
- Learn how evaluations work, including how Triple classifies the dispute
- Set up webhooks to receive results as soon as they are ready
- Evaluation payload: field-by-field reference
- API Reference