Customer Entities
curl --request GET \
--url https://api.nozle.app/api/v1/customers/{customer_id}/entities \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.nozle.app/api/v1/customers/{customer_id}/entities"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.nozle.app/api/v1/customers/{customer_id}/entities', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.nozle.app/api/v1/customers/{customer_id}/entities"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}require 'uri'
require 'net/http'
url = URI("https://api.nozle.app/api/v1/customers/{customer_id}/entities")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.nozle.app/api/v1/customers/{customer_id}/entities",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}HttpResponse<String> response = Unirest.get("https://api.nozle.app/api/v1/customers/{customer_id}/entities")
.header("Authorization", "Bearer <token>")
.asString();Product Credits
Customer Entities
Create, list, update, suspend, reactivate, and delete customer Entities
GET
/
customers
/
{customer_id}
/
entities
Customer Entities
curl --request GET \
--url https://api.nozle.app/api/v1/customers/{customer_id}/entities \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.nozle.app/api/v1/customers/{customer_id}/entities"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.nozle.app/api/v1/customers/{customer_id}/entities', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.nozle.app/api/v1/customers/{customer_id}/entities"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}require 'uri'
require 'net/http'
url = URI("https://api.nozle.app/api/v1/customers/{customer_id}/entities")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.nozle.app/api/v1/customers/{customer_id}/entities",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}HttpResponse<String> response = Unirest.get("https://api.nozle.app/api/v1/customers/{customer_id}/entities")
.header("Authorization", "Bearer <token>")
.asString();Auth: secret key only. When API permissions are enabled, reads require
Read one Entity:
Create or replace its display fields and status:
The upsert payload is a complete snapshot. When changing only status, send the current
Delete through the lifecycle endpoint:
Deletion is not a financial cascade. It preserves all source, allocation, operation, and audit rows. Retry an uncertain mutation with the same idempotency key and identical payload.
entity:read and mutations require entity:write. Publishable keys cannot read the Entity directory.
List Entities with an optional status, limit from 1 to 100, and opaque cursor:
GET /customers/workspace_123/entities?status=active&limit=50
Authorization: Bearer sk_...
GET /customers/workspace_123/entities/user_42
Authorization: Bearer sk_...
PUT /customers/workspace_123/entities/user_42
Authorization: Bearer sk_...
Idempotency-Key: entity-user-42-v1
Content-Type: application/json
{
"name": "Asha",
"status": "active",
"metadata": { "role": "agent" }
}
name and metadata so they are not cleared.
Entity lifecycle operations never create billing events. If your product bills
per seat, your backend must track that seat separately through the Events API.
Bulk upsert accepts 1 to 500 unique external IDs:
POST /customers/workspace_123/entities/bulk-upsert
Authorization: Bearer sk_...
Idempotency-Key: entity-import-2026-07-22
Content-Type: application/json
{
"entities": [
{ "external_id": "user_42", "name": "Asha", "status": "active", "metadata": {} },
{ "external_id": "user_43", "name": "Ben", "status": "suspended", "metadata": {} }
]
}
DELETE /customers/workspace_123/entities/user_42
Authorization: Bearer sk_...
Idempotency-Key: delete-user-42