curl -G "https://api-sandbox.paywithsoap.com/api/v1/customers/search" \
-H "Authorization: Bearer YOUR_API_KEY" \
--data-urlencode "email=customer@example.com"
curl -G "https://api-sandbox.paywithsoap.com/api/v1/customers/search" \
-H "Authorization: Bearer YOUR_API_KEY" \
--data-urlencode "internal_id=3f1b8c4e-7c2e-4c2c-8d2f-179cf0efb36b"
require 'net/http'
require 'uri'
require 'json'
uri = URI.parse('https://api-sandbox.paywithsoap.com/api/v1/customers/search')
uri.query = URI.encode_www_form(email: 'customer@example.com')
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
request = Net::HTTP::Get.new(uri.request_uri)
request['Authorization'] = 'Bearer YOUR_API_KEY'
response = http.request(request)
puts response.body
const axios = require('axios');
const searchCustomer = async () => {
try {
const response = await axios.get('https://api-sandbox.paywithsoap.com/api/v1/customers/search', {
params: {
email: 'customer@example.com'
},
headers: {
'Authorization': 'Bearer YOUR_API_KEY'
}
});
console.log(response.data);
} catch (error) {
console.error(error);
}
};
searchCustomer();
import requests
url = "https://api-sandbox.paywithsoap.com/api/v1/customers/search"
headers = {
"Authorization": "Bearer YOUR_API_KEY"
}
params = {
"email": "customer@example.com"
}
response = requests.get(url, headers=headers, params=params)
print(response.json())
{
"results": [
{
"id": "cus_pQsQ4kz3Af6Mb9rCupnWj6VFzxJsmkYK",
"internal_id": "3f1b8c4e-7c2e-4c2c-8d2f-179cf0efb36b",
"email": "customer@example.com",
"first_name": "John",
"last_name": "Doe",
"phone_number": "8008001234",
"created_at": "2026-05-31T18:26:43.069Z"
}
]
}
{
"results": []
}
Search Customers
Look up an existing customer by email, phone number or internal_id
curl -G "https://api-sandbox.paywithsoap.com/api/v1/customers/search" \
-H "Authorization: Bearer YOUR_API_KEY" \
--data-urlencode "email=customer@example.com"
curl -G "https://api-sandbox.paywithsoap.com/api/v1/customers/search" \
-H "Authorization: Bearer YOUR_API_KEY" \
--data-urlencode "internal_id=3f1b8c4e-7c2e-4c2c-8d2f-179cf0efb36b"
require 'net/http'
require 'uri'
require 'json'
uri = URI.parse('https://api-sandbox.paywithsoap.com/api/v1/customers/search')
uri.query = URI.encode_www_form(email: 'customer@example.com')
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
request = Net::HTTP::Get.new(uri.request_uri)
request['Authorization'] = 'Bearer YOUR_API_KEY'
response = http.request(request)
puts response.body
const axios = require('axios');
const searchCustomer = async () => {
try {
const response = await axios.get('https://api-sandbox.paywithsoap.com/api/v1/customers/search', {
params: {
email: 'customer@example.com'
},
headers: {
'Authorization': 'Bearer YOUR_API_KEY'
}
});
console.log(response.data);
} catch (error) {
console.error(error);
}
};
searchCustomer();
import requests
url = "https://api-sandbox.paywithsoap.com/api/v1/customers/search"
headers = {
"Authorization": "Bearer YOUR_API_KEY"
}
params = {
"email": "customer@example.com"
}
response = requests.get(url, headers=headers, params=params)
print(response.json())
{
"results": [
{
"id": "cus_pQsQ4kz3Af6Mb9rCupnWj6VFzxJsmkYK",
"internal_id": "3f1b8c4e-7c2e-4c2c-8d2f-179cf0efb36b",
"email": "customer@example.com",
"first_name": "John",
"last_name": "Doe",
"phone_number": "8008001234",
"created_at": "2026-05-31T18:26:43.069Z"
}
]
}
{
"results": []
}
internal_id. Use this to look up a Soap customer_id before creating a checkout, or to check whether a customer already exists. Results are always scoped 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.
email, phone_number or internal_id must be supplied. When more than one is provided, the customer must match all of them (AND semantics), so if a customer has changed both email and phone, search by internal_id alone. Email matching is case-insensitive; phone numbers are normalized to 10 digits (a leading +1 and any non-digit characters are stripped); internal_id is an exact match against the value you supplied when creating the customer.curl -G "https://api-sandbox.paywithsoap.com/api/v1/customers/search" \
-H "Authorization: Bearer YOUR_API_KEY" \
--data-urlencode "email=customer@example.com"
curl -G "https://api-sandbox.paywithsoap.com/api/v1/customers/search" \
-H "Authorization: Bearer YOUR_API_KEY" \
--data-urlencode "internal_id=3f1b8c4e-7c2e-4c2c-8d2f-179cf0efb36b"
require 'net/http'
require 'uri'
require 'json'
uri = URI.parse('https://api-sandbox.paywithsoap.com/api/v1/customers/search')
uri.query = URI.encode_www_form(email: 'customer@example.com')
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
request = Net::HTTP::Get.new(uri.request_uri)
request['Authorization'] = 'Bearer YOUR_API_KEY'
response = http.request(request)
puts response.body
const axios = require('axios');
const searchCustomer = async () => {
try {
const response = await axios.get('https://api-sandbox.paywithsoap.com/api/v1/customers/search', {
params: {
email: 'customer@example.com'
},
headers: {
'Authorization': 'Bearer YOUR_API_KEY'
}
});
console.log(response.data);
} catch (error) {
console.error(error);
}
};
searchCustomer();
import requests
url = "https://api-sandbox.paywithsoap.com/api/v1/customers/search"
headers = {
"Authorization": "Bearer YOUR_API_KEY"
}
params = {
"email": "customer@example.com"
}
response = requests.get(url, headers=headers, params=params)
print(response.json())
{
"results": [
{
"id": "cus_pQsQ4kz3Af6Mb9rCupnWj6VFzxJsmkYK",
"internal_id": "3f1b8c4e-7c2e-4c2c-8d2f-179cf0efb36b",
"email": "customer@example.com",
"first_name": "John",
"last_name": "Doe",
"phone_number": "8008001234",
"created_at": "2026-05-31T18:26:43.069Z"
}
]
}
{
"results": []
}
Authorizations
Bearer token authentication using your API key (key_...). Used for every endpoint except POST /api/v1/device_pings.
Query Parameters
Customer email. Case-insensitive. At least one of email, phone_number or internal_id must be supplied; supplied parameters are combined with AND.
"john@acme.com"
US phone number. Non-digit characters and a leading +1 are stripped; the normalized form must be 10 digits. At least one of email, phone_number or internal_id must be supplied; supplied parameters are combined with AND.
"8008001234"
Your own reference for the customer, as supplied at creation. Exact match. At least one of email, phone_number or internal_id must be supplied; supplied parameters are combined with AND.
"3f1b8c4e-7c2e-4c2c-8d2f-179cf0efb36b"
Response
Search results. Always returns a results array, possibly empty.
Show child attributes
Show child attributes

