Invite test customer
curl --request POST \
--url https://api.sandbox.natural.com/simulations/invite-customer \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: <idempotency-key>' \
--data '
{
"data": {
"attributes": {
"agentIds": [
"agt_550e8400e29b41d4a716446655440000"
],
"permissions": [
"wallets.create",
"wallets.deposit",
"wallets.withdraw",
"wallets.transfer"
],
"type": "ORG"
}
}
}
'import requests
url = "https://api.sandbox.natural.com/simulations/invite-customer"
payload = { "data": { "attributes": {
"agentIds": ["agt_550e8400e29b41d4a716446655440000"],
"permissions": ["wallets.create", "wallets.deposit", "wallets.withdraw", "wallets.transfer"],
"type": "ORG"
} } }
headers = {
"Idempotency-Key": "<idempotency-key>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'Idempotency-Key': '<idempotency-key>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
data: {
attributes: {
agentIds: ['agt_550e8400e29b41d4a716446655440000'],
permissions: ['wallets.create', 'wallets.deposit', 'wallets.withdraw', 'wallets.transfer'],
type: 'ORG'
}
}
})
};
fetch('https://api.sandbox.natural.com/simulations/invite-customer', 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://api.sandbox.natural.com/simulations/invite-customer",
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([
'data' => [
'attributes' => [
'agentIds' => [
'agt_550e8400e29b41d4a716446655440000'
],
'permissions' => [
'wallets.create',
'wallets.deposit',
'wallets.withdraw',
'wallets.transfer'
],
'type' => 'ORG'
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"Idempotency-Key: <idempotency-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"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.sandbox.natural.com/simulations/invite-customer"
payload := strings.NewReader("{\n \"data\": {\n \"attributes\": {\n \"agentIds\": [\n \"agt_550e8400e29b41d4a716446655440000\"\n ],\n \"permissions\": [\n \"wallets.create\",\n \"wallets.deposit\",\n \"wallets.withdraw\",\n \"wallets.transfer\"\n ],\n \"type\": \"ORG\"\n }\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Idempotency-Key", "<idempotency-key>")
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("https://api.sandbox.natural.com/simulations/invite-customer")
.header("Idempotency-Key", "<idempotency-key>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"data\": {\n \"attributes\": {\n \"agentIds\": [\n \"agt_550e8400e29b41d4a716446655440000\"\n ],\n \"permissions\": [\n \"wallets.create\",\n \"wallets.deposit\",\n \"wallets.withdraw\",\n \"wallets.transfer\"\n ],\n \"type\": \"ORG\"\n }\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.sandbox.natural.com/simulations/invite-customer")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Idempotency-Key"] = '<idempotency-key>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"data\": {\n \"attributes\": {\n \"agentIds\": [\n \"agt_550e8400e29b41d4a716446655440000\"\n ],\n \"permissions\": [\n \"wallets.create\",\n \"wallets.deposit\",\n \"wallets.withdraw\",\n \"wallets.transfer\"\n ],\n \"type\": \"ORG\"\n }\n }\n}"
response = http.request(request)
puts response.read_body{
"data": [
{
"type": "agentDelegationInvitation",
"id": "adi_550e8400e29b41d4a71644665544000e",
"attributes": {
"developerName": "Acme Co",
"email": "test+7f21c4@fixtures.sandbox.natural.test",
"phone": null,
"url": "https://www.natural.com/connect/adi_550e8400e29b41d4a71644665544000e",
"agentName": "Invoice Agent",
"permissions": [
"wallets.create",
"wallets.deposit",
"wallets.withdraw",
"wallets.transfer",
"party.read"
],
"limits": null,
"status": "PENDING",
"effectiveStatus": "PENDING",
"expiresAt": "2026-02-03T15:30:00.000Z",
"acceptedAt": null,
"declinedAt": null,
"cancelReason": null,
"tags": {},
"createdAt": "2026-01-04T15:30:00.000Z",
"updatedAt": "2026-01-04T15:30:00.000Z"
},
"relationships": {
"agent": {
"data": {
"type": "agent",
"id": "agt_550e8400e29b41d4a716446655440000"
}
},
"customerParty": {
"data": null
}
}
}
],
"meta": {
"customer": {
"partyId": "pty_7c9e6679e29b41d4a716446655440001",
"handle": "@brightside-labs",
"partyType": "ORG"
}
}
}{
"errors": [
{
"code": "invalid_value",
"detail": "The information you entered isn't valid. Please check it and try again.",
"status": "400",
"meta": {
"supportId": "req_a1b2c3d4e5f6"
}
}
]
}{
"errors": [
{
"code": "unauthenticated",
"detail": "Authentication is required.",
"status": "401",
"meta": {
"supportId": "req_a1b2c3d4e5f6"
}
}
]
}{
"errors": [
{
"code": "forbidden",
"detail": "You do not have permission to perform this action.",
"status": "403",
"meta": {
"supportId": "req_a1b2c3d4e5f6"
}
}
]
}{
"errors": [
{
"code": "not_found",
"detail": "The requested resource was not found.",
"status": "404",
"meta": {
"supportId": "req_a1b2c3d4e5f6"
}
}
]
}{
"errors": [
{
"code": "conflict",
"detail": "The request conflicts with the current resource state.",
"status": "409",
"meta": {
"supportId": "req_a1b2c3d4e5f6"
}
}
]
}{
"errors": [
{
"code": "invalid_value",
"detail": "The information you entered isn't valid. Please check it and try again.",
"status": "422",
"source": {
"pointer": "/data/attributes/email"
},
"meta": {
"supportId": "req_a1b2c3d4e5f6"
}
}
]
}{
"errors": [
{
"code": "mfa_required",
"detail": "MFA verification required",
"status": "428",
"meta": {
"supportId": "req_a1b2c3d4e5f6"
}
}
]
}{
"errors": [
{
"code": "rate_limited",
"detail": "Too many requests. Please try again later.",
"status": "429",
"meta": {
"supportId": "req_a1b2c3d4e5f6"
}
}
]
}{
"errors": [
{
"code": "server_error",
"detail": "Something went wrong.",
"status": "500",
"meta": {
"supportId": "req_a1b2c3d4e5f6"
}
}
]
}{
"errors": [
{
"code": "not_implemented",
"detail": "This operation is not available.",
"status": "501",
"meta": {
"supportId": "req_a1b2c3d4e5f6"
}
}
]
}{
"errors": [
{
"code": "bad_gateway",
"detail": "We couldn't complete that request because one of Natural's services returned an unexpected response. Please try again.",
"status": "502",
"meta": {
"supportId": "req_a1b2c3d4e5f6"
}
}
]
}{
"errors": [
{
"code": "service_unavailable",
"detail": "The service is temporarily unavailable.",
"status": "503",
"meta": {
"supportId": "req_a1b2c3d4e5f6"
}
}
]
}Simulations
Sandbox: Invite a test customer
Create a test customer and a pending invitation for each agent you name
POST
/
simulations
/
invite-customer
Invite test customer
curl --request POST \
--url https://api.sandbox.natural.com/simulations/invite-customer \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: <idempotency-key>' \
--data '
{
"data": {
"attributes": {
"agentIds": [
"agt_550e8400e29b41d4a716446655440000"
],
"permissions": [
"wallets.create",
"wallets.deposit",
"wallets.withdraw",
"wallets.transfer"
],
"type": "ORG"
}
}
}
'import requests
url = "https://api.sandbox.natural.com/simulations/invite-customer"
payload = { "data": { "attributes": {
"agentIds": ["agt_550e8400e29b41d4a716446655440000"],
"permissions": ["wallets.create", "wallets.deposit", "wallets.withdraw", "wallets.transfer"],
"type": "ORG"
} } }
headers = {
"Idempotency-Key": "<idempotency-key>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'Idempotency-Key': '<idempotency-key>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
data: {
attributes: {
agentIds: ['agt_550e8400e29b41d4a716446655440000'],
permissions: ['wallets.create', 'wallets.deposit', 'wallets.withdraw', 'wallets.transfer'],
type: 'ORG'
}
}
})
};
fetch('https://api.sandbox.natural.com/simulations/invite-customer', 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://api.sandbox.natural.com/simulations/invite-customer",
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([
'data' => [
'attributes' => [
'agentIds' => [
'agt_550e8400e29b41d4a716446655440000'
],
'permissions' => [
'wallets.create',
'wallets.deposit',
'wallets.withdraw',
'wallets.transfer'
],
'type' => 'ORG'
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"Idempotency-Key: <idempotency-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"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.sandbox.natural.com/simulations/invite-customer"
payload := strings.NewReader("{\n \"data\": {\n \"attributes\": {\n \"agentIds\": [\n \"agt_550e8400e29b41d4a716446655440000\"\n ],\n \"permissions\": [\n \"wallets.create\",\n \"wallets.deposit\",\n \"wallets.withdraw\",\n \"wallets.transfer\"\n ],\n \"type\": \"ORG\"\n }\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Idempotency-Key", "<idempotency-key>")
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("https://api.sandbox.natural.com/simulations/invite-customer")
.header("Idempotency-Key", "<idempotency-key>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"data\": {\n \"attributes\": {\n \"agentIds\": [\n \"agt_550e8400e29b41d4a716446655440000\"\n ],\n \"permissions\": [\n \"wallets.create\",\n \"wallets.deposit\",\n \"wallets.withdraw\",\n \"wallets.transfer\"\n ],\n \"type\": \"ORG\"\n }\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.sandbox.natural.com/simulations/invite-customer")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Idempotency-Key"] = '<idempotency-key>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"data\": {\n \"attributes\": {\n \"agentIds\": [\n \"agt_550e8400e29b41d4a716446655440000\"\n ],\n \"permissions\": [\n \"wallets.create\",\n \"wallets.deposit\",\n \"wallets.withdraw\",\n \"wallets.transfer\"\n ],\n \"type\": \"ORG\"\n }\n }\n}"
response = http.request(request)
puts response.read_body{
"data": [
{
"type": "agentDelegationInvitation",
"id": "adi_550e8400e29b41d4a71644665544000e",
"attributes": {
"developerName": "Acme Co",
"email": "test+7f21c4@fixtures.sandbox.natural.test",
"phone": null,
"url": "https://www.natural.com/connect/adi_550e8400e29b41d4a71644665544000e",
"agentName": "Invoice Agent",
"permissions": [
"wallets.create",
"wallets.deposit",
"wallets.withdraw",
"wallets.transfer",
"party.read"
],
"limits": null,
"status": "PENDING",
"effectiveStatus": "PENDING",
"expiresAt": "2026-02-03T15:30:00.000Z",
"acceptedAt": null,
"declinedAt": null,
"cancelReason": null,
"tags": {},
"createdAt": "2026-01-04T15:30:00.000Z",
"updatedAt": "2026-01-04T15:30:00.000Z"
},
"relationships": {
"agent": {
"data": {
"type": "agent",
"id": "agt_550e8400e29b41d4a716446655440000"
}
},
"customerParty": {
"data": null
}
}
}
],
"meta": {
"customer": {
"partyId": "pty_7c9e6679e29b41d4a716446655440001",
"handle": "@brightside-labs",
"partyType": "ORG"
}
}
}{
"errors": [
{
"code": "invalid_value",
"detail": "The information you entered isn't valid. Please check it and try again.",
"status": "400",
"meta": {
"supportId": "req_a1b2c3d4e5f6"
}
}
]
}{
"errors": [
{
"code": "unauthenticated",
"detail": "Authentication is required.",
"status": "401",
"meta": {
"supportId": "req_a1b2c3d4e5f6"
}
}
]
}{
"errors": [
{
"code": "forbidden",
"detail": "You do not have permission to perform this action.",
"status": "403",
"meta": {
"supportId": "req_a1b2c3d4e5f6"
}
}
]
}{
"errors": [
{
"code": "not_found",
"detail": "The requested resource was not found.",
"status": "404",
"meta": {
"supportId": "req_a1b2c3d4e5f6"
}
}
]
}{
"errors": [
{
"code": "conflict",
"detail": "The request conflicts with the current resource state.",
"status": "409",
"meta": {
"supportId": "req_a1b2c3d4e5f6"
}
}
]
}{
"errors": [
{
"code": "invalid_value",
"detail": "The information you entered isn't valid. Please check it and try again.",
"status": "422",
"source": {
"pointer": "/data/attributes/email"
},
"meta": {
"supportId": "req_a1b2c3d4e5f6"
}
}
]
}{
"errors": [
{
"code": "mfa_required",
"detail": "MFA verification required",
"status": "428",
"meta": {
"supportId": "req_a1b2c3d4e5f6"
}
}
]
}{
"errors": [
{
"code": "rate_limited",
"detail": "Too many requests. Please try again later.",
"status": "429",
"meta": {
"supportId": "req_a1b2c3d4e5f6"
}
}
]
}{
"errors": [
{
"code": "server_error",
"detail": "Something went wrong.",
"status": "500",
"meta": {
"supportId": "req_a1b2c3d4e5f6"
}
}
]
}{
"errors": [
{
"code": "not_implemented",
"detail": "This operation is not available.",
"status": "501",
"meta": {
"supportId": "req_a1b2c3d4e5f6"
}
}
]
}{
"errors": [
{
"code": "bad_gateway",
"detail": "We couldn't complete that request because one of Natural's services returned an unexpected response. Please try again.",
"status": "502",
"meta": {
"supportId": "req_a1b2c3d4e5f6"
}
}
]
}{
"errors": [
{
"code": "service_unavailable",
"detail": "The service is temporarily unavailable.",
"status": "503",
"meta": {
"supportId": "req_a1b2c3d4e5f6"
}
}
]
}Creates a synthetic Connect customer, visible only to your organization, and one
PENDING invitation for every agent you name. You provide agents only; no customer email, phone, or identity details.
Use the returned customer Party ID and invitation IDs to accept or decline each invitation. The customer grants no agent access and holds no funds until an invitation is accepted. See Simulate Connect.Authorizations
Bearer authentication: send your API key, agent key, or OAuth access token as Authorization: Bearer <credential>.
Headers
Unique key for safely retrying a request without creating duplicates.
Maximum string length:
255Deprecated: agent identity comes from the credential. Sending this header with a party API key or user credential returns 403 agent_credential_required.
Maximum string length:
36Pattern:
^agt_[0-9a-f]{32}$Caller-chosen identifier for the agent run, session, or conversation, required when an agent moves money.
Maximum string length:
1024Body
application/json
Show child attributes
Show child attributes
Was this page helpful?
⌘I