Node.js
import Shoply from "@shoplygg/node";
const shoply = new Shoply({ apiKey: process.env.SHOPLY_API_KEY });
const result = await shoply.disputes.blacklist("DISPUTE_ID");<?php
require 'vendor/autoload.php';
$shoply = new Shoply\Client(['apiKey' => getenv('SHOPLY_API_KEY')]);
$result = $shoply->disputes->blacklist('DISPUTE_ID');
import shoply
client = shoply.Client() # reads SHOPLY_API_KEY
result = client.disputes.blacklist("DISPUTE_ID")
curl --request POST \
--url https://api.shoply.gg/v1/stores/{storeId}/disputes/{disputeId}/blacklist \
--header 'Authorization: Bearer <token>'package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.shoply.gg/v1/stores/{storeId}/disputes/{disputeId}/blacklist"
req, _ := http.NewRequest("POST", 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.post("https://api.shoply.gg/v1/stores/{storeId}/disputes/{disputeId}/blacklist")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.shoply.gg/v1/stores/{storeId}/disputes/{disputeId}/blacklist")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"success": true,
"message": null,
"code": null,
"data": {
"id": "ae36fc25-3cea-4d17-acaa-4bdb43d84a0e",
"orderId": "71ed606f-3119-4f9f-b7f7-ecd25740e15b",
"email": "mila@example.com",
"provider": "stripe",
"providerName": "Stripe",
"externalId": "dp_1QdZ8x2eZvKYlo2C",
"reason": "fraudulent",
"reasonText": "Says they did not make the payment",
"stage": "chargeback",
"providerStatus": "needs_response",
"status": "needs_response",
"amount": 49,
"currency": "USD",
"dueAt": "2026-10-27T16:20:19Z",
"answer": {
"state": "draft",
"at": null,
"by": "",
"note": ""
},
"answeredFrom": "provider",
"answerPlace": "your Stripe Dashboard",
"accessTaken": true,
"dateCreated": "2026-10-22T16:20:19Z",
"dateClosed": null,
"order": {
"id": "71ed606f-3119-4f9f-b7f7-ecd25740e15b",
"status": "completed",
"amount": 49,
"currency": "USD",
"dateCreated": "2026-10-10T16:20:19Z"
},
"can": {
"edit": true,
"submit": false,
"accept": false,
"markSubmitted": true
},
"records": [
{
"key": "buyer",
"title": "The Buyer",
"facts": [
{
"key": "email",
"name": "Email",
"value": "mila@example.com",
"strong": false
},
{
"key": "name",
"name": "Name",
"value": "Mila Kowalski",
"strong": false
}
]
},
{
"key": "order",
"title": "The Order",
"facts": [
{
"key": "placed",
"name": "Placed",
"value": "Oct 10, 2026, 4:20 PM UTC",
"strong": false
},
{
"key": "paid",
"name": "Paid",
"value": "Oct 10, 2026, 4:20 PM UTC · $49.00 · Credit/Debit Card (Stripe)",
"strong": false
}
]
}
],
"activity": [
"2026-10-19 16:20 UTC · Opened their order (order page) · 203.0.113.42 (the address they paid from) · Germany · Chrome on Windows"
],
"draft": {
"decision": "fight",
"contacted": "no",
"used": "yes",
"words": "The buyer bought a license key and opened their order again from the address they paid from.",
"saved": true,
"statement": "The buyer bought a license key and opened their order again from the address they paid from.\n\nThe buyer did not contact the store before disputing the payment. What they bought was used.\n\nWhat the store's records show:\n- Email: mila@example.com\n- Name: Mila Kowalski\n- Billing Address: Berlin, Germany\n- Checkout From: 203.0.113.42 · Germany · Chrome on Windows\n- Placed: Oct 10, 2026, 4:20 PM UTC\n…"
},
"files": [],
"after": [
{
"key": "blacklist",
"done": true,
"text": "Blacklisted mila@example.com and 1 IP address"
},
{
"key": "access",
"done": true,
"text": "Their keys and files are hidden from them"
}
],
"history": [
{
"at": "2026-10-19T16:20:19Z",
"what": "The buyer opened their order",
"detail": "203.0.113.42, Germany"
}
]
}
}{
"success": false,
"message": "<string>",
"code": "<string>",
"data": null,
"errors": {}
}{
"success": false,
"message": "<string>",
"code": "<string>",
"data": null,
"errors": {}
}{
"success": false,
"message": "<string>",
"code": "<string>",
"data": null,
"errors": {}
}{
"success": false,
"message": "<string>",
"code": "<string>",
"data": null,
"errors": {}
}{
"success": false,
"message": "<string>",
"code": "<string>",
"data": null,
"errors": {}
}Disputes
Blacklist a dispute's buyer
Puts the buyer’s email and the addresses they ordered from on the blacklist, as a dispute does by itself where the store’s settings say to. Rules already there are left as they are.
Needs the disputes.write permission (Answer Disputes).
POST
/
stores
/
{storeId}
/
disputes
/
{disputeId}
/
blacklist
Node.js
import Shoply from "@shoplygg/node";
const shoply = new Shoply({ apiKey: process.env.SHOPLY_API_KEY });
const result = await shoply.disputes.blacklist("DISPUTE_ID");<?php
require 'vendor/autoload.php';
$shoply = new Shoply\Client(['apiKey' => getenv('SHOPLY_API_KEY')]);
$result = $shoply->disputes->blacklist('DISPUTE_ID');
import shoply
client = shoply.Client() # reads SHOPLY_API_KEY
result = client.disputes.blacklist("DISPUTE_ID")
curl --request POST \
--url https://api.shoply.gg/v1/stores/{storeId}/disputes/{disputeId}/blacklist \
--header 'Authorization: Bearer <token>'package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.shoply.gg/v1/stores/{storeId}/disputes/{disputeId}/blacklist"
req, _ := http.NewRequest("POST", 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.post("https://api.shoply.gg/v1/stores/{storeId}/disputes/{disputeId}/blacklist")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.shoply.gg/v1/stores/{storeId}/disputes/{disputeId}/blacklist")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"success": true,
"message": null,
"code": null,
"data": {
"id": "ae36fc25-3cea-4d17-acaa-4bdb43d84a0e",
"orderId": "71ed606f-3119-4f9f-b7f7-ecd25740e15b",
"email": "mila@example.com",
"provider": "stripe",
"providerName": "Stripe",
"externalId": "dp_1QdZ8x2eZvKYlo2C",
"reason": "fraudulent",
"reasonText": "Says they did not make the payment",
"stage": "chargeback",
"providerStatus": "needs_response",
"status": "needs_response",
"amount": 49,
"currency": "USD",
"dueAt": "2026-10-27T16:20:19Z",
"answer": {
"state": "draft",
"at": null,
"by": "",
"note": ""
},
"answeredFrom": "provider",
"answerPlace": "your Stripe Dashboard",
"accessTaken": true,
"dateCreated": "2026-10-22T16:20:19Z",
"dateClosed": null,
"order": {
"id": "71ed606f-3119-4f9f-b7f7-ecd25740e15b",
"status": "completed",
"amount": 49,
"currency": "USD",
"dateCreated": "2026-10-10T16:20:19Z"
},
"can": {
"edit": true,
"submit": false,
"accept": false,
"markSubmitted": true
},
"records": [
{
"key": "buyer",
"title": "The Buyer",
"facts": [
{
"key": "email",
"name": "Email",
"value": "mila@example.com",
"strong": false
},
{
"key": "name",
"name": "Name",
"value": "Mila Kowalski",
"strong": false
}
]
},
{
"key": "order",
"title": "The Order",
"facts": [
{
"key": "placed",
"name": "Placed",
"value": "Oct 10, 2026, 4:20 PM UTC",
"strong": false
},
{
"key": "paid",
"name": "Paid",
"value": "Oct 10, 2026, 4:20 PM UTC · $49.00 · Credit/Debit Card (Stripe)",
"strong": false
}
]
}
],
"activity": [
"2026-10-19 16:20 UTC · Opened their order (order page) · 203.0.113.42 (the address they paid from) · Germany · Chrome on Windows"
],
"draft": {
"decision": "fight",
"contacted": "no",
"used": "yes",
"words": "The buyer bought a license key and opened their order again from the address they paid from.",
"saved": true,
"statement": "The buyer bought a license key and opened their order again from the address they paid from.\n\nThe buyer did not contact the store before disputing the payment. What they bought was used.\n\nWhat the store's records show:\n- Email: mila@example.com\n- Name: Mila Kowalski\n- Billing Address: Berlin, Germany\n- Checkout From: 203.0.113.42 · Germany · Chrome on Windows\n- Placed: Oct 10, 2026, 4:20 PM UTC\n…"
},
"files": [],
"after": [
{
"key": "blacklist",
"done": true,
"text": "Blacklisted mila@example.com and 1 IP address"
},
{
"key": "access",
"done": true,
"text": "Their keys and files are hidden from them"
}
],
"history": [
{
"at": "2026-10-19T16:20:19Z",
"what": "The buyer opened their order",
"detail": "203.0.113.42, Germany"
}
]
}
}{
"success": false,
"message": "<string>",
"code": "<string>",
"data": null,
"errors": {}
}{
"success": false,
"message": "<string>",
"code": "<string>",
"data": null,
"errors": {}
}{
"success": false,
"message": "<string>",
"code": "<string>",
"data": null,
"errors": {}
}{
"success": false,
"message": "<string>",
"code": "<string>",
"data": null,
"errors": {}
}{
"success": false,
"message": "<string>",
"code": "<string>",
"data": null,
"errors": {}
}Authorizations
A secret API key, made under Developers in the dashboard: Authorization: Bearer shoply_sk_...
Headers
A word of your own for this one change, up to 180 letters, digits, dots, dashes, underscores and colons. Sent again with the same key, the request is not carried out twice: the first answer comes back, with Idempotent-Replay: true.
Path Parameters
The store's ID. A key reaches the store it was made in: GET /key answers which.
The dispute, by its ID.

