curl -X PATCH "https://api-sandbox.paywithsoap.com/api/v1/customers/cus_A3GuXEbThpqk2t6UTxEuoceVJyUEAX7V" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"first_name": "Jane",
"phone_number": "5551234567"
}'
require 'net/http'
require 'uri'
require 'json'
uri = URI.parse('https://api-sandbox.paywithsoap.com/api/v1/customers/cus_A3GuXEbThpqk2t6UTxEuoceVJyUEAX7V')
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(uri.path)
request['Authorization'] = 'Bearer YOUR_API_KEY'
request['Content-Type'] = 'application/json'
request.body = {
first_name: 'Jane',
phone_number: '5551234567'
}.to_json
response = http.request(request)
puts response.body
const axios = require('axios');
const updateCustomer = async () => {
try {
const response = await axios.patch('https://api-sandbox.paywithsoap.com/api/v1/customers/cus_A3GuXEbThpqk2t6UTxEuoceVJyUEAX7V', {
first_name: 'Jane',
phone_number: '5551234567'
}, {
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
}
});
console.log(response.data);
} catch (error) {
console.error(error);
}
};
updateCustomer();
import requests
import json
url = "https://api-sandbox.paywithsoap.com/api/v1/customers/cus_A3GuXEbThpqk2t6UTxEuoceVJyUEAX7V"
headers = {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json"
}
data = {
"first_name": "Jane",
"phone_number": "5551234567"
}
response = requests.patch(url, headers=headers, json=data)
print(response.json())
{
"id": "cus_A3GuXEbThpqk2t6UTxEuoceVJyUEAX7V",
"internal_id": "cust_123",
"email": "customer@example.com",
"first_name": "Jane",
"last_name": "Doe",
"phone_number": "5551234567",
"date_of_birth": "1990-01-01",
"created_at": "2025-03-10T16:08:14.427Z",
"updated_at": "2025-03-12T09:15:42.001Z"
}
Update Customer
Update the details of an existing customer
curl -X PATCH "https://api-sandbox.paywithsoap.com/api/v1/customers/cus_A3GuXEbThpqk2t6UTxEuoceVJyUEAX7V" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"first_name": "Jane",
"phone_number": "5551234567"
}'
require 'net/http'
require 'uri'
require 'json'
uri = URI.parse('https://api-sandbox.paywithsoap.com/api/v1/customers/cus_A3GuXEbThpqk2t6UTxEuoceVJyUEAX7V')
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(uri.path)
request['Authorization'] = 'Bearer YOUR_API_KEY'
request['Content-Type'] = 'application/json'
request.body = {
first_name: 'Jane',
phone_number: '5551234567'
}.to_json
response = http.request(request)
puts response.body
const axios = require('axios');
const updateCustomer = async () => {
try {
const response = await axios.patch('https://api-sandbox.paywithsoap.com/api/v1/customers/cus_A3GuXEbThpqk2t6UTxEuoceVJyUEAX7V', {
first_name: 'Jane',
phone_number: '5551234567'
}, {
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
}
});
console.log(response.data);
} catch (error) {
console.error(error);
}
};
updateCustomer();
import requests
import json
url = "https://api-sandbox.paywithsoap.com/api/v1/customers/cus_A3GuXEbThpqk2t6UTxEuoceVJyUEAX7V"
headers = {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json"
}
data = {
"first_name": "Jane",
"phone_number": "5551234567"
}
response = requests.patch(url, headers=headers, json=data)
print(response.json())
{
"id": "cus_A3GuXEbThpqk2t6UTxEuoceVJyUEAX7V",
"internal_id": "cust_123",
"email": "customer@example.com",
"first_name": "Jane",
"last_name": "Doe",
"phone_number": "5551234567",
"date_of_birth": "1990-01-01",
"created_at": "2025-03-10T16:08:14.427Z",
"updated_at": "2025-03-12T09:15:42.001Z"
}
customer_id (the cus_ id returned when the customer was created) in the URL.
Since this is a PATCH request, only the fields you include in the request body are changed, and any fields you leave out keep their current values. PUT on the same path is accepted as an alias and behaves identically. Updates are always scoped to the customer belonging to the merchant whose API key is used.
Every Soap API request is authenticated with a bearer token in the Authorization header:
Authorization: Bearer YOUR_API_KEY
key_....
Requests with a missing or invalid API key return 422 — never 401 — with a JSON error field, usually {"error": "API key not found."}. Branch on the status code rather than the message: GET /api/v1/device_pings/latest_geo_check does not yet return the same wording.
Never expose your API key in client-side code — it is server-side only.
first_name, last_name, email, phone_number, date_of_birth) must be provided, and any unrecognized field will cause the request to be rejected.first_name and last_name as they are at that moment, so a PATCH made before the checkout takes effect on it. Use the customer’s legal first name and surname as shown on their ID, with no nicknames, middle names, initials or suffixes in those fields. A mismatch restricts the customer with reason code KYC_DOES_NOT_MATCH_PROFILE_NAME; correct the profile here and then lift the restriction in the dashboard.curl -X PATCH "https://api-sandbox.paywithsoap.com/api/v1/customers/cus_A3GuXEbThpqk2t6UTxEuoceVJyUEAX7V" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"first_name": "Jane",
"phone_number": "5551234567"
}'
require 'net/http'
require 'uri'
require 'json'
uri = URI.parse('https://api-sandbox.paywithsoap.com/api/v1/customers/cus_A3GuXEbThpqk2t6UTxEuoceVJyUEAX7V')
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(uri.path)
request['Authorization'] = 'Bearer YOUR_API_KEY'
request['Content-Type'] = 'application/json'
request.body = {
first_name: 'Jane',
phone_number: '5551234567'
}.to_json
response = http.request(request)
puts response.body
const axios = require('axios');
const updateCustomer = async () => {
try {
const response = await axios.patch('https://api-sandbox.paywithsoap.com/api/v1/customers/cus_A3GuXEbThpqk2t6UTxEuoceVJyUEAX7V', {
first_name: 'Jane',
phone_number: '5551234567'
}, {
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
}
});
console.log(response.data);
} catch (error) {
console.error(error);
}
};
updateCustomer();
import requests
import json
url = "https://api-sandbox.paywithsoap.com/api/v1/customers/cus_A3GuXEbThpqk2t6UTxEuoceVJyUEAX7V"
headers = {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json"
}
data = {
"first_name": "Jane",
"phone_number": "5551234567"
}
response = requests.patch(url, headers=headers, json=data)
print(response.json())
{
"id": "cus_A3GuXEbThpqk2t6UTxEuoceVJyUEAX7V",
"internal_id": "cust_123",
"email": "customer@example.com",
"first_name": "Jane",
"last_name": "Doe",
"phone_number": "5551234567",
"date_of_birth": "1990-01-01",
"created_at": "2025-03-10T16:08:14.427Z",
"updated_at": "2025-03-12T09:15:42.001Z"
}
Authorizations
Bearer token authentication using your API key (key_...). Used for every endpoint except POST /api/v1/device_pings.
Path Parameters
Unique Soap identifier of the customer to update (the cus_ id returned at creation).
"cus_pQsQ4kz3Af6Mb9rCupnWj6VFzxJsmkYK"
Body
At least one updatable field must be present. Unknown fields are rejected.
Email address of the customer. Must be unique within your business.
"john@acme.com"
Customer's legal first name as shown on their ID, with no nicknames, middle names or initials. In production this is checked against the verified identity on KYC-enabled checkouts.
1"John"
Customer's legal surname as shown on their ID, with no suffixes. In production this is checked against the verified identity on KYC-enabled checkouts.
1"Doe"
10-digit US phone number with no country code, spaces or punctuation (for example 5551234567). Must be unique within your business.
^\d{10}$"8008001234"
Date of birth of the customer as YYYY-MM-DD.
"1990-01-01"
Response
Customer updated.
Unique identifier for the customer to be used for future transactions.
"cus_pQsQ4kz3Af6Mb9rCupnWj6VFzxJsmkYK"
Your identifier for the customer, as supplied; null when none was given.
"3f1b8c4e-7c2e-4c2c-8d2f-179cf0efb36b"
"john@acme.com"
Null only on accounts configured to create customers without names.
"John"
Null only on accounts configured to create customers without names.
"Doe"
"8008001234"
"1990-01-01"
"2025-03-05T18:26:43.069Z"
"2025-03-10T16:08:14.427Z"

