curl --request GET \
--url https://api.staging.payrails.io/dispute/disputes/runs \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.staging.payrails.io/dispute/disputes/runs"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.staging.payrails.io/dispute/disputes/runs', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.staging.payrails.io/dispute/disputes/runs",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.staging.payrails.io/dispute/disputes/runs"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.staging.payrails.io/dispute/disputes/runs")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.staging.payrails.io/dispute/disputes/runs")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"results": [
{
"id": "92a56c44-9fb8-4cf7-afeb-97f9c82155a6",
"runType": "dispute-pull-window",
"status": "done",
"resolution": "success",
"params": {
"providerConfigId": "c429f419-9d4e-425d-b4ce-8457c3eb027c",
"paymentProviderConfigId": "1f3cb3c4-3d8d-4f3c-94ad-30a0a17fde6d",
"dateFrom": "2026-06-02T14:14:00Z",
"dateTo": "2026-06-02T14:16:00Z"
},
"summary": {
"disputesPulled": 2,
"disputesUpserted": 2,
"paymentsPulled": 0,
"paymentsUpserted": 2,
"unsupportedOps": []
},
"parentRunId": "05ce2e81-8359-4ed8-8ee4-66912c16fb1a",
"createdAt": "2026-06-02T15:28:00.781722Z",
"updatedAt": "2026-06-02T15:28:03.034171Z",
"completedAt": "2026-06-02T15:28:03.033166Z"
},
{
"id": "05ce2e81-8359-4ed8-8ee4-66912c16fb1a",
"runType": "dispute-pull-controller",
"status": "done",
"resolution": "success",
"params": {
"providerConfigId": "c429f419-9d4e-425d-b4ce-8457c3eb027c",
"dateFrom": "2026-06-02T14:14:00Z",
"dateTo": "2026-06-02T14:16:00Z"
},
"summary": {
"cursorEnd": "2026-06-02T14:16:00Z",
"childRunId": "92a56c44-9fb8-4cf7-afeb-97f9c82155a6"
},
"createdAt": "2026-06-02T15:28:00.690000Z",
"updatedAt": "2026-06-02T15:28:03.100000Z",
"completedAt": "2026-06-02T15:28:03.099000Z"
}
],
"links": {
"self": "https://api.staging.payrails.io/dispute/disputes/runs?page[size]=2"
}
}{
"errors": [
{
"id": "a24bc325-3929-4d9d-9c08-b3aa532685b7",
"code": "request.malformed",
"detail": "The request has malformed syntax",
"docUrl": "https://docs.payrails.com/docs/resources/error-codes#requestmalformed"
}
]
}{
"errors": [
{
"id": "a24bc325-3929-4d9d-9c08-b3aa532685b7",
"code": "request.unauthorized",
"detail": "The request lacks necessary credentials to perform the specified action",
"docUrl": "https://docs.payrails.com/docs/resources/error-codes#requestunauthorized"
}
]
}{
"errors": [
{
"id": "e7db22b3-914e-4975-928e-9edfb0885bea",
"code": "request.forbidden",
"detail": "The request credentials lack the required permissions to perform the specified action",
"docUrl": "https://docs.payrails.com/docs/resources/error-codes#requestforbidden"
}
]
}{
"errors": [
{
"id": "a24bc325-3929-4d9d-9c08-b3aa532685b7",
"code": "request.rate-limit",
"detail": "Too many requests",
"docUrl": "https://docs.payrails.com/docs/resources/error-codes#requestrate-limit"
}
]
}List dispute service runs
List asynchronous runs in the dispute service, scoped to the workspaces you can access. Runs back operations such as a backfill, which pulls disputes and their related payments from the provider into your dispute and payment records. Use the filters to narrow by run type, status, or resolution; results are ordered most-recent first.
curl --request GET \
--url https://api.staging.payrails.io/dispute/disputes/runs \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.staging.payrails.io/dispute/disputes/runs"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.staging.payrails.io/dispute/disputes/runs', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.staging.payrails.io/dispute/disputes/runs",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.staging.payrails.io/dispute/disputes/runs"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.staging.payrails.io/dispute/disputes/runs")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.staging.payrails.io/dispute/disputes/runs")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"results": [
{
"id": "92a56c44-9fb8-4cf7-afeb-97f9c82155a6",
"runType": "dispute-pull-window",
"status": "done",
"resolution": "success",
"params": {
"providerConfigId": "c429f419-9d4e-425d-b4ce-8457c3eb027c",
"paymentProviderConfigId": "1f3cb3c4-3d8d-4f3c-94ad-30a0a17fde6d",
"dateFrom": "2026-06-02T14:14:00Z",
"dateTo": "2026-06-02T14:16:00Z"
},
"summary": {
"disputesPulled": 2,
"disputesUpserted": 2,
"paymentsPulled": 0,
"paymentsUpserted": 2,
"unsupportedOps": []
},
"parentRunId": "05ce2e81-8359-4ed8-8ee4-66912c16fb1a",
"createdAt": "2026-06-02T15:28:00.781722Z",
"updatedAt": "2026-06-02T15:28:03.034171Z",
"completedAt": "2026-06-02T15:28:03.033166Z"
},
{
"id": "05ce2e81-8359-4ed8-8ee4-66912c16fb1a",
"runType": "dispute-pull-controller",
"status": "done",
"resolution": "success",
"params": {
"providerConfigId": "c429f419-9d4e-425d-b4ce-8457c3eb027c",
"dateFrom": "2026-06-02T14:14:00Z",
"dateTo": "2026-06-02T14:16:00Z"
},
"summary": {
"cursorEnd": "2026-06-02T14:16:00Z",
"childRunId": "92a56c44-9fb8-4cf7-afeb-97f9c82155a6"
},
"createdAt": "2026-06-02T15:28:00.690000Z",
"updatedAt": "2026-06-02T15:28:03.100000Z",
"completedAt": "2026-06-02T15:28:03.099000Z"
}
],
"links": {
"self": "https://api.staging.payrails.io/dispute/disputes/runs?page[size]=2"
}
}{
"errors": [
{
"id": "a24bc325-3929-4d9d-9c08-b3aa532685b7",
"code": "request.malformed",
"detail": "The request has malformed syntax",
"docUrl": "https://docs.payrails.com/docs/resources/error-codes#requestmalformed"
}
]
}{
"errors": [
{
"id": "a24bc325-3929-4d9d-9c08-b3aa532685b7",
"code": "request.unauthorized",
"detail": "The request lacks necessary credentials to perform the specified action",
"docUrl": "https://docs.payrails.com/docs/resources/error-codes#requestunauthorized"
}
]
}{
"errors": [
{
"id": "e7db22b3-914e-4975-928e-9edfb0885bea",
"code": "request.forbidden",
"detail": "The request credentials lack the required permissions to perform the specified action",
"docUrl": "https://docs.payrails.com/docs/resources/error-codes#requestforbidden"
}
]
}{
"errors": [
{
"id": "a24bc325-3929-4d9d-9c08-b3aa532685b7",
"code": "request.rate-limit",
"detail": "Too many requests",
"docUrl": "https://docs.payrails.com/docs/resources/error-codes#requestrate-limit"
}
]
}Authorizations
You can use an OAuth2 JWT bearer token in the Authorization header of your API requests for supported endpoints: Authorization: Bearer <YOUR_JWT_HERE>.
These tokens are valid for 10 minutes and can be requested via the access token endpoint endpoint.
Query Parameters
Filter runs by run type (for example dispute-pull-controller or dispute-pull-window).
Filter runs by status.
queued, dispatched, done Filter runs by resolution (the outcome of a completed run).
success, failed, cancelled Response
Success.
A paginated list of dispute service runs.
Hide child attributes
Hide child attributes
Unique identifier of the run.
The kind of work the run performs, for example dispute-pull-controller (owns the cursor for one provider configuration) or dispute-pull-window (pulls disputes and their related payments for one time window).
"dispute-pull-controller"
Lifecycle state of the run.
queued, dispatched, done Date and time when the run was created.
Date and time when the run was last updated.
Workspace the run belongs to. Omitted for runs that are not scoped to a single workspace.
Outcome of a completed run. Absent until the run reaches done.
success, failed, cancelled Error messages collected during execution, when the run did not fully succeed.
The arguments the run was started with. The shape depends on runType; a dispute-pull run carries providerConfigId, optional paymentProviderConfigId, and the dateFrom / dateTo window.
Aggregate result of the run. The shape depends on runType; a dispute-pull window reports disputesPulled, disputesUpserted, paymentsPulled, paymentsUpserted and any unsupportedOps.
Trigger metadata for the run, such as the resolved window or cursor.
For a child run, the identifier of the run that spawned it (for example a dispute-pull window's controller). Absent for top-level runs.
Date and time when the run started executing.
Date and time when the run finished. Absent until the run reaches done.
The run's execution attempts, most recent first. Included only when a single run is retrieved by id.
Hide child attributes
Hide child attributes
Unique identifier of the run job.
Identifier of the run this attempt belongs to.
Lifecycle state of the attempt.
queued, dispatched, done Date and time when the attempt was created.
Idempotency reference for the attempt.
Reference to the external execution backing this attempt, when applicable.
Outcome of the attempt. Absent until the attempt reaches done.
success, failed, cancelled Error messages collected during the attempt.
Aggregate result of the attempt; shape depends on the run type.
Trigger metadata for the attempt, such as the resolved window or cursor.
Date and time when the attempt started executing.
Date and time when the attempt finished.