Update gateway score
curl --request POST \
--url http://localhost:8080/update-gateway-score \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"merchantId": "test_merchant",
"gateway": "stripe",
"paymentId": "pay_001",
"status": "CHARGED",
"gatewayReferenceId": "stripe_ref_001",
"enforceDynamicRoutingFailure": false
}
'import requests
url = "http://localhost:8080/update-gateway-score"
payload = {
"merchantId": "test_merchant",
"gateway": "stripe",
"paymentId": "pay_001",
"status": "CHARGED",
"gatewayReferenceId": "stripe_ref_001",
"enforceDynamicRoutingFailure": False
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
merchantId: 'test_merchant',
gateway: 'stripe',
paymentId: 'pay_001',
status: 'CHARGED',
gatewayReferenceId: 'stripe_ref_001',
enforceDynamicRoutingFailure: false
})
};
fetch('http://localhost:8080/update-gateway-score', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_PORT => "8080",
CURLOPT_URL => "http://localhost:8080/update-gateway-score",
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([
'merchantId' => 'test_merchant',
'gateway' => 'stripe',
'paymentId' => 'pay_001',
'status' => 'CHARGED',
'gatewayReferenceId' => 'stripe_ref_001',
'enforceDynamicRoutingFailure' => false
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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 := "http://localhost:8080/update-gateway-score"
payload := strings.NewReader("{\n \"merchantId\": \"test_merchant\",\n \"gateway\": \"stripe\",\n \"paymentId\": \"pay_001\",\n \"status\": \"CHARGED\",\n \"gatewayReferenceId\": \"stripe_ref_001\",\n \"enforceDynamicRoutingFailure\": false\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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("http://localhost:8080/update-gateway-score")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"merchantId\": \"test_merchant\",\n \"gateway\": \"stripe\",\n \"paymentId\": \"pay_001\",\n \"status\": \"CHARGED\",\n \"gatewayReferenceId\": \"stripe_ref_001\",\n \"enforceDynamicRoutingFailure\": false\n}")
.asString();require 'uri'
require 'net/http'
url = URI("http://localhost:8080/update-gateway-score")
http = Net::HTTP.new(url.host, url.port)
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"merchantId\": \"test_merchant\",\n \"gateway\": \"stripe\",\n \"paymentId\": \"pay_001\",\n \"status\": \"CHARGED\",\n \"gatewayReferenceId\": \"stripe_ref_001\",\n \"enforceDynamicRoutingFailure\": false\n}"
response = http.request(request)
puts response.read_body{
"message": "Score updated",
"merchant_id": "test_merchant",
"gateway": "stripe",
"payment_id": "pay_001"
}OpenAPI: Score Feedback
Update Gateway Score
Feed a transaction outcome back into the success-rate model. Call this after every transaction so the engine has accurate SR data for future routing decisions.
POST
/
update-gateway-score
Update gateway score
curl --request POST \
--url http://localhost:8080/update-gateway-score \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"merchantId": "test_merchant",
"gateway": "stripe",
"paymentId": "pay_001",
"status": "CHARGED",
"gatewayReferenceId": "stripe_ref_001",
"enforceDynamicRoutingFailure": false
}
'import requests
url = "http://localhost:8080/update-gateway-score"
payload = {
"merchantId": "test_merchant",
"gateway": "stripe",
"paymentId": "pay_001",
"status": "CHARGED",
"gatewayReferenceId": "stripe_ref_001",
"enforceDynamicRoutingFailure": False
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
merchantId: 'test_merchant',
gateway: 'stripe',
paymentId: 'pay_001',
status: 'CHARGED',
gatewayReferenceId: 'stripe_ref_001',
enforceDynamicRoutingFailure: false
})
};
fetch('http://localhost:8080/update-gateway-score', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_PORT => "8080",
CURLOPT_URL => "http://localhost:8080/update-gateway-score",
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([
'merchantId' => 'test_merchant',
'gateway' => 'stripe',
'paymentId' => 'pay_001',
'status' => 'CHARGED',
'gatewayReferenceId' => 'stripe_ref_001',
'enforceDynamicRoutingFailure' => false
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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 := "http://localhost:8080/update-gateway-score"
payload := strings.NewReader("{\n \"merchantId\": \"test_merchant\",\n \"gateway\": \"stripe\",\n \"paymentId\": \"pay_001\",\n \"status\": \"CHARGED\",\n \"gatewayReferenceId\": \"stripe_ref_001\",\n \"enforceDynamicRoutingFailure\": false\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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("http://localhost:8080/update-gateway-score")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"merchantId\": \"test_merchant\",\n \"gateway\": \"stripe\",\n \"paymentId\": \"pay_001\",\n \"status\": \"CHARGED\",\n \"gatewayReferenceId\": \"stripe_ref_001\",\n \"enforceDynamicRoutingFailure\": false\n}")
.asString();require 'uri'
require 'net/http'
url = URI("http://localhost:8080/update-gateway-score")
http = Net::HTTP.new(url.host, url.port)
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"merchantId\": \"test_merchant\",\n \"gateway\": \"stripe\",\n \"paymentId\": \"pay_001\",\n \"status\": \"CHARGED\",\n \"gatewayReferenceId\": \"stripe_ref_001\",\n \"enforceDynamicRoutingFailure\": false\n}"
response = http.request(request)
puts response.read_body{
"message": "Score updated",
"merchant_id": "test_merchant",
"gateway": "stripe",
"payment_id": "pay_001"
}Update Gateway Score
Use case
Records the observed transaction outcome for a previously selected gateway so auth-rate analytics can learn from real payment results.Authentication
Protected. Send eitherAuthorization: Bearer <jwt_token> or x-api-key: <api_key>. In sandbox, also send x-feature: decision-engine.
For local development, start with:
export BASE_URL=http://localhost:8080
export AUTH_HEADER="Authorization: Bearer <jwt_token>"
# Sandbox only:
# export BASE_URL=https://sandbox.hyperswitch.io
# export FEATURE_HEADER="x-feature: decision-engine"
Request
- Method and path:
POST /update-gateway-score - Parameters: none.
- Body: JSON body with
merchantId,paymentId,gatewayandstatus, plus optionalgatewayReferenceId,enforceDynamicRoutingFailure,txnLatency,errorInfoandisSmartRetry.
Example
Update gateway score
curl --location "$BASE_URL/update-gateway-score" \
--header "$AUTH_HEADER" \
--header "Content-Type: application/json" \
--data '{
"merchantId": "merchant_demo",
"paymentId": "pay_sr_001",
"gateway": "stripe",
"status": "CHARGED",
"gatewayReferenceId": "stripe_ref_001",
"enforceDynamicRoutingFailure": false,
"txnLatency": { "gatewayLatency": 120.5 }
}'
status must be a transaction status value - CHARGED, AUTHORIZATION_FAILED,
AUTHENTICATION_FAILED, JUSPAY_DECLINED, FAILURE, and so on. Lowercase values such as
success are rejected with a 400.
Payment attributes (amount, currency, payment method, auth type) are not part of this
payload - the engine already has them from the /decide-gateway call for this paymentId.
Any unrecognised field is silently ignored, so a misspelled key fails quietly rather than
erroring. Note in particular that latency goes in txnLatency.gatewayLatency, not latency.
Response
{
"message": "Gateway score updated successfully",
"merchant_id": "merchant_demo",
"gateway": "stripe",
"payment_id": "pay_sr_001"
}
errorInfo is supplied in the request and matches a gateway status map rule, the response
also carries a gsm_info object describing the lookup result.
Notes
- Do not call this after
NTW_BASED_ROUTINGjust to record the selected debit network; debit audit comes from/decide-gatewayanalytics. - Call it after payment authorization completes, not before.
Related
Authorizations
BearerAuthApiKeyAuth
JWT token obtained from /auth/login
Body
application/json
Example:
"test_merchant"
Example:
"stripe"
Example:
"pay_001"
Transaction status. Must be a TxnStatus value - lowercase values such as success are rejected with a 400.
Available options:
STARTED, AUTHENTICATION_FAILED, JUSPAY_DECLINED, PENDING_VBV, VBV_SUCCESSFUL, AUTHORIZED, AUTHORIZATION_FAILED, CHARGED, AUTHORIZING, COD_INITIATED, VOIDED, VOID_INITIATED, NOP, CAPTURE_INITIATED, CAPTURE_FAILED, VOID_FAILED, AUTO_REFUNDED, PARTIAL_CHARGED, TO_BE_CHARGED, PENDING, FAILURE, DECLINED Example:
"CHARGED"
Example:
"stripe_ref_001"
Observed gateway latency, in milliseconds.
Show child attributes
Show child attributes
Gateway error details for the GSM-based scoring filter. When present and the merchant flag is on, user/issuer-originated failures are skipped so the gateway is not penalised.
Set by the orchestrator when this call is a smart-retry attempt.
Was this page helpful?