curl --request POST \
--url https://east.sandbox.spade.com/transactions/report \
--header 'Content-Type: application/json' \
--header 'X-Api-Key: <api-key>' \
--data @- <<EOF
{
"enrichmentId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"errorDescription": "Enrichment has an incorrect location. Wrong postal code.",
"incorrectLocation": true,
"incorrectLocationDescription": "The location's city is incorrect.",
"incorrectCategory": false,
"incorrectCategoryDescription": "The category returned is incorrect.",
"incorrectChannel": false,
"incorrectChannelDescription": "The spending channel should have been physical.",
"incorrectCounterparty": false,
"incorrectCounterpartyDescription": "The counterparty is incorrect.",
"incorrectLogo": false,
"incorrectLogoDescription": "The logo shown is outdated.",
"incorrectWebsite": false,
"incorrectWebsiteDescription": "The website redirects to a 404.",
"incorrectPhoneNumber": false,
"incorrectPhoneNumberDescription": "The phone number is disconnected."
}
EOFimport requests
url = "https://east.sandbox.spade.com/transactions/report"
payload = {
"enrichmentId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"errorDescription": "Enrichment has an incorrect location. Wrong postal code.",
"incorrectLocation": True,
"incorrectLocationDescription": "The location's city is incorrect.",
"incorrectCategory": False,
"incorrectCategoryDescription": "The category returned is incorrect.",
"incorrectChannel": False,
"incorrectChannelDescription": "The spending channel should have been physical.",
"incorrectCounterparty": False,
"incorrectCounterpartyDescription": "The counterparty is incorrect.",
"incorrectLogo": False,
"incorrectLogoDescription": "The logo shown is outdated.",
"incorrectWebsite": False,
"incorrectWebsiteDescription": "The website redirects to a 404.",
"incorrectPhoneNumber": False,
"incorrectPhoneNumberDescription": "The phone number is disconnected."
}
headers = {
"X-Api-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-Api-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
enrichmentId: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
errorDescription: 'Enrichment has an incorrect location. Wrong postal code.',
incorrectLocation: true,
incorrectLocationDescription: 'The location\'s city is incorrect.',
incorrectCategory: false,
incorrectCategoryDescription: 'The category returned is incorrect.',
incorrectChannel: false,
incorrectChannelDescription: 'The spending channel should have been physical.',
incorrectCounterparty: false,
incorrectCounterpartyDescription: 'The counterparty is incorrect.',
incorrectLogo: false,
incorrectLogoDescription: 'The logo shown is outdated.',
incorrectWebsite: false,
incorrectWebsiteDescription: 'The website redirects to a 404.',
incorrectPhoneNumber: false,
incorrectPhoneNumberDescription: 'The phone number is disconnected.'
})
};
fetch('https://east.sandbox.spade.com/transactions/report', 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://east.sandbox.spade.com/transactions/report",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'enrichmentId' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'errorDescription' => 'Enrichment has an incorrect location. Wrong postal code.',
'incorrectLocation' => true,
'incorrectLocationDescription' => 'The location\'s city is incorrect.',
'incorrectCategory' => false,
'incorrectCategoryDescription' => 'The category returned is incorrect.',
'incorrectChannel' => false,
'incorrectChannelDescription' => 'The spending channel should have been physical.',
'incorrectCounterparty' => false,
'incorrectCounterpartyDescription' => 'The counterparty is incorrect.',
'incorrectLogo' => false,
'incorrectLogoDescription' => 'The logo shown is outdated.',
'incorrectWebsite' => false,
'incorrectWebsiteDescription' => 'The website redirects to a 404.',
'incorrectPhoneNumber' => false,
'incorrectPhoneNumberDescription' => 'The phone number is disconnected.'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-Api-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://east.sandbox.spade.com/transactions/report"
payload := strings.NewReader("{\n \"enrichmentId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"errorDescription\": \"Enrichment has an incorrect location. Wrong postal code.\",\n \"incorrectLocation\": true,\n \"incorrectLocationDescription\": \"The location's city is incorrect.\",\n \"incorrectCategory\": false,\n \"incorrectCategoryDescription\": \"The category returned is incorrect.\",\n \"incorrectChannel\": false,\n \"incorrectChannelDescription\": \"The spending channel should have been physical.\",\n \"incorrectCounterparty\": false,\n \"incorrectCounterpartyDescription\": \"The counterparty is incorrect.\",\n \"incorrectLogo\": false,\n \"incorrectLogoDescription\": \"The logo shown is outdated.\",\n \"incorrectWebsite\": false,\n \"incorrectWebsiteDescription\": \"The website redirects to a 404.\",\n \"incorrectPhoneNumber\": false,\n \"incorrectPhoneNumberDescription\": \"The phone number is disconnected.\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-Api-Key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://east.sandbox.spade.com/transactions/report")
.header("X-Api-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"enrichmentId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"errorDescription\": \"Enrichment has an incorrect location. Wrong postal code.\",\n \"incorrectLocation\": true,\n \"incorrectLocationDescription\": \"The location's city is incorrect.\",\n \"incorrectCategory\": false,\n \"incorrectCategoryDescription\": \"The category returned is incorrect.\",\n \"incorrectChannel\": false,\n \"incorrectChannelDescription\": \"The spending channel should have been physical.\",\n \"incorrectCounterparty\": false,\n \"incorrectCounterpartyDescription\": \"The counterparty is incorrect.\",\n \"incorrectLogo\": false,\n \"incorrectLogoDescription\": \"The logo shown is outdated.\",\n \"incorrectWebsite\": false,\n \"incorrectWebsiteDescription\": \"The website redirects to a 404.\",\n \"incorrectPhoneNumber\": false,\n \"incorrectPhoneNumberDescription\": \"The phone number is disconnected.\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://east.sandbox.spade.com/transactions/report")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-Api-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"enrichmentId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"errorDescription\": \"Enrichment has an incorrect location. Wrong postal code.\",\n \"incorrectLocation\": true,\n \"incorrectLocationDescription\": \"The location's city is incorrect.\",\n \"incorrectCategory\": false,\n \"incorrectCategoryDescription\": \"The category returned is incorrect.\",\n \"incorrectChannel\": false,\n \"incorrectChannelDescription\": \"The spending channel should have been physical.\",\n \"incorrectCounterparty\": false,\n \"incorrectCounterpartyDescription\": \"The counterparty is incorrect.\",\n \"incorrectLogo\": false,\n \"incorrectLogoDescription\": \"The logo shown is outdated.\",\n \"incorrectWebsite\": false,\n \"incorrectWebsiteDescription\": \"The website redirects to a 404.\",\n \"incorrectPhoneNumber\": false,\n \"incorrectPhoneNumberDescription\": \"The phone number is disconnected.\"\n}"
response = http.request(request)
puts response.read_body{
"errorReportId": "8e21c6a4-2f3d-4b7a-9c1e-5d6f0a9b7c3e",
"details": "Enrichment Successfully Reported."
}{
"invalidField": [
"This field is required."
]
}{
"details": "Incorrect authentication credentials."
}{
"details": "Internal server error."
}Report a card enrichment as incorrect
Endpoint to report a card enrichment as incorrect. An enrichmentId and an errorDescription are required fields to report an enrichment. Optional request fields such as incorrectLocation, incorrectLocationDescription, incorrectCategory, incorrectCategoryDescription, incorrectChannel, incorrectChannelDescription, incorrectCounterparty, incorrectCounterpartyDescription, incorrectLogo, incorrectLogoDescription, incorrectWebsite, incorrectWebsiteDescription, incorrectPhoneNumber, and incorrectPhoneNumberDescription, can be set to indicate what needs to be addressed in the enrichment. Once a report has been addressed, you will receive a corrected enrichment via a callback url you set with Spade. See the callback section to learn more on how we send back a corrected enrichment.
curl --request POST \
--url https://east.sandbox.spade.com/transactions/report \
--header 'Content-Type: application/json' \
--header 'X-Api-Key: <api-key>' \
--data @- <<EOF
{
"enrichmentId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"errorDescription": "Enrichment has an incorrect location. Wrong postal code.",
"incorrectLocation": true,
"incorrectLocationDescription": "The location's city is incorrect.",
"incorrectCategory": false,
"incorrectCategoryDescription": "The category returned is incorrect.",
"incorrectChannel": false,
"incorrectChannelDescription": "The spending channel should have been physical.",
"incorrectCounterparty": false,
"incorrectCounterpartyDescription": "The counterparty is incorrect.",
"incorrectLogo": false,
"incorrectLogoDescription": "The logo shown is outdated.",
"incorrectWebsite": false,
"incorrectWebsiteDescription": "The website redirects to a 404.",
"incorrectPhoneNumber": false,
"incorrectPhoneNumberDescription": "The phone number is disconnected."
}
EOFimport requests
url = "https://east.sandbox.spade.com/transactions/report"
payload = {
"enrichmentId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"errorDescription": "Enrichment has an incorrect location. Wrong postal code.",
"incorrectLocation": True,
"incorrectLocationDescription": "The location's city is incorrect.",
"incorrectCategory": False,
"incorrectCategoryDescription": "The category returned is incorrect.",
"incorrectChannel": False,
"incorrectChannelDescription": "The spending channel should have been physical.",
"incorrectCounterparty": False,
"incorrectCounterpartyDescription": "The counterparty is incorrect.",
"incorrectLogo": False,
"incorrectLogoDescription": "The logo shown is outdated.",
"incorrectWebsite": False,
"incorrectWebsiteDescription": "The website redirects to a 404.",
"incorrectPhoneNumber": False,
"incorrectPhoneNumberDescription": "The phone number is disconnected."
}
headers = {
"X-Api-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-Api-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
enrichmentId: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
errorDescription: 'Enrichment has an incorrect location. Wrong postal code.',
incorrectLocation: true,
incorrectLocationDescription: 'The location\'s city is incorrect.',
incorrectCategory: false,
incorrectCategoryDescription: 'The category returned is incorrect.',
incorrectChannel: false,
incorrectChannelDescription: 'The spending channel should have been physical.',
incorrectCounterparty: false,
incorrectCounterpartyDescription: 'The counterparty is incorrect.',
incorrectLogo: false,
incorrectLogoDescription: 'The logo shown is outdated.',
incorrectWebsite: false,
incorrectWebsiteDescription: 'The website redirects to a 404.',
incorrectPhoneNumber: false,
incorrectPhoneNumberDescription: 'The phone number is disconnected.'
})
};
fetch('https://east.sandbox.spade.com/transactions/report', 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://east.sandbox.spade.com/transactions/report",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'enrichmentId' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'errorDescription' => 'Enrichment has an incorrect location. Wrong postal code.',
'incorrectLocation' => true,
'incorrectLocationDescription' => 'The location\'s city is incorrect.',
'incorrectCategory' => false,
'incorrectCategoryDescription' => 'The category returned is incorrect.',
'incorrectChannel' => false,
'incorrectChannelDescription' => 'The spending channel should have been physical.',
'incorrectCounterparty' => false,
'incorrectCounterpartyDescription' => 'The counterparty is incorrect.',
'incorrectLogo' => false,
'incorrectLogoDescription' => 'The logo shown is outdated.',
'incorrectWebsite' => false,
'incorrectWebsiteDescription' => 'The website redirects to a 404.',
'incorrectPhoneNumber' => false,
'incorrectPhoneNumberDescription' => 'The phone number is disconnected.'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-Api-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://east.sandbox.spade.com/transactions/report"
payload := strings.NewReader("{\n \"enrichmentId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"errorDescription\": \"Enrichment has an incorrect location. Wrong postal code.\",\n \"incorrectLocation\": true,\n \"incorrectLocationDescription\": \"The location's city is incorrect.\",\n \"incorrectCategory\": false,\n \"incorrectCategoryDescription\": \"The category returned is incorrect.\",\n \"incorrectChannel\": false,\n \"incorrectChannelDescription\": \"The spending channel should have been physical.\",\n \"incorrectCounterparty\": false,\n \"incorrectCounterpartyDescription\": \"The counterparty is incorrect.\",\n \"incorrectLogo\": false,\n \"incorrectLogoDescription\": \"The logo shown is outdated.\",\n \"incorrectWebsite\": false,\n \"incorrectWebsiteDescription\": \"The website redirects to a 404.\",\n \"incorrectPhoneNumber\": false,\n \"incorrectPhoneNumberDescription\": \"The phone number is disconnected.\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-Api-Key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://east.sandbox.spade.com/transactions/report")
.header("X-Api-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"enrichmentId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"errorDescription\": \"Enrichment has an incorrect location. Wrong postal code.\",\n \"incorrectLocation\": true,\n \"incorrectLocationDescription\": \"The location's city is incorrect.\",\n \"incorrectCategory\": false,\n \"incorrectCategoryDescription\": \"The category returned is incorrect.\",\n \"incorrectChannel\": false,\n \"incorrectChannelDescription\": \"The spending channel should have been physical.\",\n \"incorrectCounterparty\": false,\n \"incorrectCounterpartyDescription\": \"The counterparty is incorrect.\",\n \"incorrectLogo\": false,\n \"incorrectLogoDescription\": \"The logo shown is outdated.\",\n \"incorrectWebsite\": false,\n \"incorrectWebsiteDescription\": \"The website redirects to a 404.\",\n \"incorrectPhoneNumber\": false,\n \"incorrectPhoneNumberDescription\": \"The phone number is disconnected.\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://east.sandbox.spade.com/transactions/report")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-Api-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"enrichmentId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"errorDescription\": \"Enrichment has an incorrect location. Wrong postal code.\",\n \"incorrectLocation\": true,\n \"incorrectLocationDescription\": \"The location's city is incorrect.\",\n \"incorrectCategory\": false,\n \"incorrectCategoryDescription\": \"The category returned is incorrect.\",\n \"incorrectChannel\": false,\n \"incorrectChannelDescription\": \"The spending channel should have been physical.\",\n \"incorrectCounterparty\": false,\n \"incorrectCounterpartyDescription\": \"The counterparty is incorrect.\",\n \"incorrectLogo\": false,\n \"incorrectLogoDescription\": \"The logo shown is outdated.\",\n \"incorrectWebsite\": false,\n \"incorrectWebsiteDescription\": \"The website redirects to a 404.\",\n \"incorrectPhoneNumber\": false,\n \"incorrectPhoneNumberDescription\": \"The phone number is disconnected.\"\n}"
response = http.request(request)
puts response.read_body{
"errorReportId": "8e21c6a4-2f3d-4b7a-9c1e-5d6f0a9b7c3e",
"details": "Enrichment Successfully Reported."
}{
"invalidField": [
"This field is required."
]
}{
"details": "Incorrect authentication credentials."
}{
"details": "Internal server error."
}Authorizations
Body
Schema for reporting an enriched transaction.
Enrichment id represented as a string UUID.
Description of incorrect details in enrichment.
1024"Enrichment has an incorrect location. Wrong postal code."
Bool indicating if the enrichment has a wrong location.
true
Description of incorrect location details in enrichment.
1024"The location's city is incorrect."
Bool indicating if the enrichment has a wrong Category.
false
Description of incorrect category details in enrichment.
1024"The category returned is incorrect."
Bool indicating if the enrichment has a wrong Channel.
false
Description of incorrect channel details in enrichment.
1024"The spending channel should have been physical."
A boolean indicating if the enrichment has an incorrect merchant name or identity. Use incorrectLogo, incorrectWebsite, or incorrectPhoneNumber instead for issues limited to those specific attributes.
false
Description of the incorrect merchant name or identity in the enrichment.
1024"The counterparty is incorrect."
A boolean indicating if the enrichment has a wrong logo.
false
Description of incorrect logo details in enrichment.
1024"The logo shown is outdated."
A boolean indicating if the enrichment has a wrong website.
false
Description of incorrect website details in enrichment.
1024"The website redirects to a 404."
A boolean indicating if the enrichment has a wrong phone number.
false
Description of incorrect phone number details in enrichment.
1024"The phone number is disconnected."
Callbacks
POSThttps://example.com/your/callback/endpointCorrectedEnrichment
Body
Outcome of a reviewed error report, delivered via the callback configured with Spade. Carries the enrichment response fields at the top level, in the same shape as the original card enrichment response, alongside fields describing the report's outcome.
The error report id, matching the errorReportId returned when the report was submitted.
"8e21c6a4-2f3d-4b7a-9c1e-5d6f0a9b7c3e"
Whether the report was accepted with a correction, or rejected.
accepted, rejected The enrichment response reflecting the outcome: the corrected data when status is accepted, or the original unchanged enrichment when status is rejected (a rejection means the original enrichment was verified correct). Never null.
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Our ID representing the enrichment, not to be confused with your provided transactionId.
An array of counterparties matched to the transaction, ordered by descending match score.
Show child attributes
Show child attributes
The mobile app information for the transaction. This object is only non-null if the transaction was matched to a mobile app.
Show child attributes
Show child attributes
A dictionary containing the custom attributes that were included in the enrichment request (if any).
Show child attributes
Show child attributes
{
"custom_attribute_1": "value_1",
"custom_attribute_2": "value_2"
}
An array of triggered actions, or null if no triggers matched.
This field is only present if your integration has the actions feature enabled.
When a transaction matches one or more registered triggers, this array contains the action details
including your custom action data. Multiple matches are possible when triggers are registered
at different scopes (account, program, user, card).
Show child attributes
Show child attributes
[
{
"id": "trigger-12345",
"type": "merchant_trigger",
"action": { "type": "REWARD", "rewardPercent": 5 },
"scope": "account",
"source": "counterparty"
}
]
Set when status is rejected; null when accepted. Treat as a growing enum, not an exhaustive list. When the underlying reason is other, this carries the reviewer's free-text description instead of the literal code other.
"location_correct_spade_verified"
Response
Your server returns this code if it accepts the callback

