List Customers
curl --request GET \
--url https://your-site.com/wp-json/latepoint-api/v1/customers \
--header 'X-API-Key: <x-api-key>'import requests
url = "https://your-site.com/wp-json/latepoint-api/v1/customers"
headers = {"X-API-Key": "<x-api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-API-Key': '<x-api-key>'}};
fetch('https://your-site.com/wp-json/latepoint-api/v1/customers', 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://your-site.com/wp-json/latepoint-api/v1/customers",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-API-Key: <x-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"
"net/http"
"io"
)
func main() {
url := "https://your-site.com/wp-json/latepoint-api/v1/customers"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-API-Key", "<x-api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://your-site.com/wp-json/latepoint-api/v1/customers")
.header("X-API-Key", "<x-api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://your-site.com/wp-json/latepoint-api/v1/customers")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-API-Key"] = '<x-api-key>'
response = http.request(request)
puts response.read_body{
"success": true,
"data": [
{
"id": 123,
"first_name": "<string>",
"last_name": "<string>",
"email": "<string>",
"phone": "<string>",
"status": "<string>",
"is_guest": "<string>",
"admin_notes": "<string>",
"created_at": "<string>",
"updated_at": "<string>",
"stats": {
"total_bookings": "<string>",
"completed_bookings": 123,
"cancelled_bookings": 123,
"future_bookings": "<string>",
"total_spent": "<string>",
"last_booking_date": "<string>",
"next_booking_date": "<string>"
},
"custom_fields": {}
}
],
"pagination": {
"page": 123,
"per_page": 123,
"total": 123,
"total_pages": 123,
"has_next_page": true,
"has_previous_page": true
}
}Customers
List Customers
Get a list of all registered customers
GET
/
wp-json
/
latepoint-api
/
v1
/
customers
List Customers
curl --request GET \
--url https://your-site.com/wp-json/latepoint-api/v1/customers \
--header 'X-API-Key: <x-api-key>'import requests
url = "https://your-site.com/wp-json/latepoint-api/v1/customers"
headers = {"X-API-Key": "<x-api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-API-Key': '<x-api-key>'}};
fetch('https://your-site.com/wp-json/latepoint-api/v1/customers', 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://your-site.com/wp-json/latepoint-api/v1/customers",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-API-Key: <x-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"
"net/http"
"io"
)
func main() {
url := "https://your-site.com/wp-json/latepoint-api/v1/customers"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-API-Key", "<x-api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://your-site.com/wp-json/latepoint-api/v1/customers")
.header("X-API-Key", "<x-api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://your-site.com/wp-json/latepoint-api/v1/customers")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-API-Key"] = '<x-api-key>'
response = http.request(request)
puts response.read_body{
"success": true,
"data": [
{
"id": 123,
"first_name": "<string>",
"last_name": "<string>",
"email": "<string>",
"phone": "<string>",
"status": "<string>",
"is_guest": "<string>",
"admin_notes": "<string>",
"created_at": "<string>",
"updated_at": "<string>",
"stats": {
"total_bookings": "<string>",
"completed_bookings": 123,
"cancelled_bookings": 123,
"future_bookings": "<string>",
"total_spent": "<string>",
"last_booking_date": "<string>",
"next_booking_date": "<string>"
},
"custom_fields": {}
}
],
"pagination": {
"page": 123,
"per_page": 123,
"total": 123,
"total_pages": 123,
"has_next_page": true,
"has_previous_page": true
}
}Description
This endpoint returns a paginated list of all customers registered in the system. You can filter, search and sort the results according to your needs.Authentication
string
required
Your LatePoint API Key with read permissions
Query Parameters
Pagination
integer
default:"1"
Page number to retrieve
integer
default:"20"
Number of customers per page (maximum 100)
Filters
string
Filter by customer statusPossible values:
active- Active customersinactive- Inactive customersblocked- Blocked customers
string
Show only customers created after this date (format: YYYY-MM-DD)
string
Show only customers created before this date (format: YYYY-MM-DD)
boolean
Filter customers who have or don’t have bookings
true- Only customers with bookingsfalse- Only customers without bookings
Dynamic Field Filters
string
Filter by customer’s first name (partial match)
string
Filter by customer’s last name (partial match)
string
Filter by customer’s email address (partial match)
string
Filter by customer’s phone number (partial match)
boolean
Filter by guest status
true- Only guest customersfalse- Only registered customers
integer
Filter by WordPress user ID (exact match)
string
Filter by creation date (partial match, format: YYYY-MM-DD)
string
Filter by last update date (partial match, format: YYYY-MM-DD)
Search
string
Search customers by first name, last name, or email (partial match)
Response
Successful Response (200 OK)
boolean
Always
true on successarray
Array of customer objects
Show Customer Structure
Show Customer Structure
integer
Unique customer ID
string
Customer’s first name
string
Customer’s last name
string
Customer’s email
string
Customer’s phone number
string
Customer status (e.g.
active, pending_verification, blocked)string
Whether the customer is a guest (
"1") or registered ("0")string
Internal notes (admin only)
string
Customer registration date
string
Last update date
object
Customer booking statistics (always included)
object
Customer custom field values (always included, empty array if none)
object
Examples
List All Customers
curl -X GET "https://your-site.com/wp-json/latepoint-api/v1/customers" \
-H "X-API-Key: lp_live_1234567890abcdef"
const response = await fetch('https://your-site.com/wp-json/latepoint-api/v1/customers', {
headers: {
'X-API-Key': 'lp_live_1234567890abcdef'
}
});
const customers = await response.json();
console.log(customers);
import requests
response = requests.get(
'https://your-site.com/wp-json/latepoint-api/v1/customers',
headers={
'X-API-Key': 'lp_live_1234567890abcdef'
}
)
customers = response.json()
print(customers)
<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => 'https://your-site.com/wp-json/latepoint-api/v1/customers',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'X-API-Key: lp_live_1234567890abcdef'
]
]);
$response = curl_exec($curl);
$customers = json_decode($response, true);
curl_close($curl);
print_r($customers);
?>
Search Customers with Dynamic Filters
curl -X GET "https://your-site.com/wp-json/latepoint-api/v1/customers?first_name=Carlos&last_name=Lopez&status=active" \
-H "X-API-Key: lp_live_1234567890abcdef"
const params = new URLSearchParams({
first_name: 'Carlos',
email: 'lopez',
status: 'active'
});
const response = await fetch(`https://your-site.com/wp-json/latepoint-api/v1/customers?${params}`, {
headers: {
'X-API-Key': 'lp_live_1234567890abcdef'
}
});
const customers = await response.json();
console.log(customers);
import requests
params = {
'first_name': 'Ana',
'email': 'gmail.com',
'status': 'active',
'is_guest': 'false'
}
response = requests.get(
'https://your-site.com/wp-json/latepoint-api/v1/customers',
headers={'X-API-Key': 'lp_live_1234567890abcdef'},
params=params
)
customers = response.json()
print(customers)
Filter by Phone and Guest Status
curl -X GET "https://your-site.com/wp-json/latepoint-api/v1/customers?phone=555&is_guest=true&include=stats" \
-H "X-API-Key: lp_live_1234567890abcdef"
// Get guest customers with specific phone pattern
const params = new URLSearchParams({
phone: '555',
is_guest: 'true',
status: 'active',
per_page: 50
});
const response = await fetch(`https://your-site.com/wp-json/latepoint-api/v1/customers?${params}`, {
headers: {
'X-API-Key': 'lp_live_1234567890abcdef'
}
});
const guestCustomers = await response.json();
console.log(`Guest customers with 555 in phone: ${guestCustomers.data.length}`);
Filter by Creation Date
curl -X GET "https://your-site.com/wp-json/latepoint-api/v1/customers?created_at=2024-01&has_bookings=true" \
-H "X-API-Key: lp_live_1234567890abcdef"
// Get customers created in January 2024 who have bookings
const params = new URLSearchParams({
created_at: '2024-01',
has_bookings: 'true'
});
const response = await fetch(`https://your-site.com/wp-json/latepoint-api/v1/customers?${params}`, {
headers: {
'X-API-Key': 'lp_live_1234567890abcdef'
}
});
const januaryCustomers = await response.json();
console.log(`Customers from January 2024: ${januaryCustomers.data.length}`);
Paginate Through All Customers
JavaScript
async function getAllCustomers() {
let allCustomers = [];
let currentPage = 1;
let hasNextPage = true;
while (hasNextPage) {
const params = new URLSearchParams({ page: currentPage, per_page: 100 });
const response = await fetch(`https://your-site.com/wp-json/latepoint-api/v1/customers?${params}`, {
headers: { 'X-API-Key': 'YOUR_API_KEY' }
});
const result = await response.json();
if (result.success) {
allCustomers = allCustomers.concat(result.data);
hasNextPage = result.pagination.has_next_page;
currentPage++;
console.log(`Page ${currentPage - 1}/${result.pagination.total_pages}`);
} else {
break;
}
}
return allCustomers;
}
Example Response
{
"success": true,
"data": [
{
"id": "30",
"first_name": "Carlos",
"last_name": "Rodriguez",
"email": "carlos@example.com",
"phone": "+59887222333",
"status": "pending_verification",
"is_guest": "1",
"notes": "",
"admin_notes": "",
"wordpress_user_id": null,
"created_at": "2025-09-24 06:10:34",
"updated_at": "2026-01-27 22:23:23",
"stats": {
"total_bookings": "3",
"completed_bookings": 3,
"cancelled_bookings": 0,
"future_bookings": "0",
"total_spent": "46.00",
"last_booking_date": "2026-03-02",
"next_booking_date": null
},
"custom_fields": {
"cf_JLIkv6Md": "24"
}
}
],
"pagination": {
"page": 1,
"per_page": 10,
"total": 29,
"total_pages": 3,
"has_next_page": true,
"has_previous_page": false
}
}
Error Responses
Error 401 - Unauthorized
{
"code": "rest_forbidden",
"message": "Unauthorized",
"data": { "status": 401 }
}
Common Use Cases
Filter by Name and Status
GET /wp-json/latepoint-api/v1/customers?first_name=Carlos&status=active
X-API-Key: YOUR_API_KEY
Search by Email Domain
GET /wp-json/latepoint-api/v1/customers?email=gmail.com&per_page=50
X-API-Key: YOUR_API_KEY
Customers Created This Year
GET /wp-json/latepoint-api/v1/customers?created_after=2025-01-01&per_page=100
X-API-Key: YOUR_API_KEY
Stats and custom fields are always included in every customer in the response — you do not need to pass any
include parameter.Sorting: Results are always returned sorted by
created_at DESC. Sorting is not configurable on this endpoint.