curl --request POST \
--url https://api.nexspace365.com/api/staff \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"firstName": "Ada",
"lastName": "Lovelace",
"email": "ada.lovelace@acme.example.com",
"phone": "+1-614-555-0199",
"specialty": "Forklift Operator",
"employmentType": "full_time",
"hourlyRate": 28.5,
"yearsExperience": 6,
"certifications": [
"Forklift Class II",
"OSHA 10"
],
"skills": [
"Inventory",
"Pallet Jack",
"RF Scanner"
]
}
'import requests
url = "https://api.nexspace365.com/api/staff"
payload = {
"firstName": "Ada",
"lastName": "Lovelace",
"email": "ada.lovelace@acme.example.com",
"phone": "+1-614-555-0199",
"specialty": "Forklift Operator",
"employmentType": "full_time",
"hourlyRate": 28.5,
"yearsExperience": 6,
"certifications": ["Forklift Class II", "OSHA 10"],
"skills": ["Inventory", "Pallet Jack", "RF Scanner"]
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
firstName: 'Ada',
lastName: 'Lovelace',
email: 'ada.lovelace@acme.example.com',
phone: '+1-614-555-0199',
specialty: 'Forklift Operator',
employmentType: 'full_time',
hourlyRate: 28.5,
yearsExperience: 6,
certifications: ['Forklift Class II', 'OSHA 10'],
skills: ['Inventory', 'Pallet Jack', 'RF Scanner']
})
};
fetch('https://api.nexspace365.com/api/staff', 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.nexspace365.com/api/staff",
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([
'firstName' => 'Ada',
'lastName' => 'Lovelace',
'email' => 'ada.lovelace@acme.example.com',
'phone' => '+1-614-555-0199',
'specialty' => 'Forklift Operator',
'employmentType' => 'full_time',
'hourlyRate' => 28.5,
'yearsExperience' => 6,
'certifications' => [
'Forklift Class II',
'OSHA 10'
],
'skills' => [
'Inventory',
'Pallet Jack',
'RF Scanner'
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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.nexspace365.com/api/staff"
payload := strings.NewReader("{\n \"firstName\": \"Ada\",\n \"lastName\": \"Lovelace\",\n \"email\": \"ada.lovelace@acme.example.com\",\n \"phone\": \"+1-614-555-0199\",\n \"specialty\": \"Forklift Operator\",\n \"employmentType\": \"full_time\",\n \"hourlyRate\": 28.5,\n \"yearsExperience\": 6,\n \"certifications\": [\n \"Forklift Class II\",\n \"OSHA 10\"\n ],\n \"skills\": [\n \"Inventory\",\n \"Pallet Jack\",\n \"RF Scanner\"\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
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.nexspace365.com/api/staff")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"firstName\": \"Ada\",\n \"lastName\": \"Lovelace\",\n \"email\": \"ada.lovelace@acme.example.com\",\n \"phone\": \"+1-614-555-0199\",\n \"specialty\": \"Forklift Operator\",\n \"employmentType\": \"full_time\",\n \"hourlyRate\": 28.5,\n \"yearsExperience\": 6,\n \"certifications\": [\n \"Forklift Class II\",\n \"OSHA 10\"\n ],\n \"skills\": [\n \"Inventory\",\n \"Pallet Jack\",\n \"RF Scanner\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.nexspace365.com/api/staff")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"firstName\": \"Ada\",\n \"lastName\": \"Lovelace\",\n \"email\": \"ada.lovelace@acme.example.com\",\n \"phone\": \"+1-614-555-0199\",\n \"specialty\": \"Forklift Operator\",\n \"employmentType\": \"full_time\",\n \"hourlyRate\": 28.5,\n \"yearsExperience\": 6,\n \"certifications\": [\n \"Forklift Class II\",\n \"OSHA 10\"\n ],\n \"skills\": [\n \"Inventory\",\n \"Pallet Jack\",\n \"RF Scanner\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"id": 42,
"firstName": "Ada",
"lastName": "Lovelace",
"email": "ada.lovelace@acme.example.com",
"phone": "+1-614-555-0199",
"specialty": "Forklift Operator",
"employmentType": "full_time",
"hourlyRate": 28.5,
"yearsExperience": 6,
"certifications": [
"Forklift Class II",
"OSHA 10"
],
"skills": [
"Inventory",
"Pallet Jack",
"RF Scanner"
],
"isActive": true,
"profilePhoto": null,
"emergencyContact": {
"name": "Grace Hopper",
"phone": "+1-614-555-0177",
"relationship": "Spouse"
},
"workHistory": [
{
"facility": "Westside Depot",
"position": "Warehouse Associate",
"startDate": "2020-03-01",
"endDate": "2023-11-30",
"description": "Fulfillment and receiving"
}
],
"education": [
{
"institution": "Columbus State",
"degree": "Associate, Logistics",
"graduationYear": 2019,
"gpa": 3.6
}
]
}{
"error": {
"message": "<string>",
"code": "<string>",
"details": {},
"suggestion": "<string>",
"retryable": true
},
"requestId": "<string>"
}{
"error": {
"message": "Invalid or revoked API key",
"code": "UNAUTHENTICATED",
"suggestion": "Send a valid `Authorization: Bearer <token>` (nex_live_/nex_pat_ key, JWT, or OAuth access token).",
"retryable": false
}
}{
"error": {
"message": "Insufficient API key scope",
"code": "INSUFFICIENT_SCOPE",
"suggestion": "Mint or rotate a key that includes the required scope, or grant a wildcard like `resource:*`.",
"retryable": false
}
}{
"error": {
"message": "Rate limit exceeded for this API key",
"code": "API_KEY_RATE_LIMITED",
"suggestion": "Wait until X-RateLimit-Reset before retrying, or batch operations.",
"retryable": true
}
}Create new staff member
Add a new staff member to the system. Required API-key scope: staff:write
curl --request POST \
--url https://api.nexspace365.com/api/staff \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"firstName": "Ada",
"lastName": "Lovelace",
"email": "ada.lovelace@acme.example.com",
"phone": "+1-614-555-0199",
"specialty": "Forklift Operator",
"employmentType": "full_time",
"hourlyRate": 28.5,
"yearsExperience": 6,
"certifications": [
"Forklift Class II",
"OSHA 10"
],
"skills": [
"Inventory",
"Pallet Jack",
"RF Scanner"
]
}
'import requests
url = "https://api.nexspace365.com/api/staff"
payload = {
"firstName": "Ada",
"lastName": "Lovelace",
"email": "ada.lovelace@acme.example.com",
"phone": "+1-614-555-0199",
"specialty": "Forklift Operator",
"employmentType": "full_time",
"hourlyRate": 28.5,
"yearsExperience": 6,
"certifications": ["Forklift Class II", "OSHA 10"],
"skills": ["Inventory", "Pallet Jack", "RF Scanner"]
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
firstName: 'Ada',
lastName: 'Lovelace',
email: 'ada.lovelace@acme.example.com',
phone: '+1-614-555-0199',
specialty: 'Forklift Operator',
employmentType: 'full_time',
hourlyRate: 28.5,
yearsExperience: 6,
certifications: ['Forklift Class II', 'OSHA 10'],
skills: ['Inventory', 'Pallet Jack', 'RF Scanner']
})
};
fetch('https://api.nexspace365.com/api/staff', 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.nexspace365.com/api/staff",
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([
'firstName' => 'Ada',
'lastName' => 'Lovelace',
'email' => 'ada.lovelace@acme.example.com',
'phone' => '+1-614-555-0199',
'specialty' => 'Forklift Operator',
'employmentType' => 'full_time',
'hourlyRate' => 28.5,
'yearsExperience' => 6,
'certifications' => [
'Forklift Class II',
'OSHA 10'
],
'skills' => [
'Inventory',
'Pallet Jack',
'RF Scanner'
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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.nexspace365.com/api/staff"
payload := strings.NewReader("{\n \"firstName\": \"Ada\",\n \"lastName\": \"Lovelace\",\n \"email\": \"ada.lovelace@acme.example.com\",\n \"phone\": \"+1-614-555-0199\",\n \"specialty\": \"Forklift Operator\",\n \"employmentType\": \"full_time\",\n \"hourlyRate\": 28.5,\n \"yearsExperience\": 6,\n \"certifications\": [\n \"Forklift Class II\",\n \"OSHA 10\"\n ],\n \"skills\": [\n \"Inventory\",\n \"Pallet Jack\",\n \"RF Scanner\"\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
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.nexspace365.com/api/staff")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"firstName\": \"Ada\",\n \"lastName\": \"Lovelace\",\n \"email\": \"ada.lovelace@acme.example.com\",\n \"phone\": \"+1-614-555-0199\",\n \"specialty\": \"Forklift Operator\",\n \"employmentType\": \"full_time\",\n \"hourlyRate\": 28.5,\n \"yearsExperience\": 6,\n \"certifications\": [\n \"Forklift Class II\",\n \"OSHA 10\"\n ],\n \"skills\": [\n \"Inventory\",\n \"Pallet Jack\",\n \"RF Scanner\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.nexspace365.com/api/staff")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"firstName\": \"Ada\",\n \"lastName\": \"Lovelace\",\n \"email\": \"ada.lovelace@acme.example.com\",\n \"phone\": \"+1-614-555-0199\",\n \"specialty\": \"Forklift Operator\",\n \"employmentType\": \"full_time\",\n \"hourlyRate\": 28.5,\n \"yearsExperience\": 6,\n \"certifications\": [\n \"Forklift Class II\",\n \"OSHA 10\"\n ],\n \"skills\": [\n \"Inventory\",\n \"Pallet Jack\",\n \"RF Scanner\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"id": 42,
"firstName": "Ada",
"lastName": "Lovelace",
"email": "ada.lovelace@acme.example.com",
"phone": "+1-614-555-0199",
"specialty": "Forklift Operator",
"employmentType": "full_time",
"hourlyRate": 28.5,
"yearsExperience": 6,
"certifications": [
"Forklift Class II",
"OSHA 10"
],
"skills": [
"Inventory",
"Pallet Jack",
"RF Scanner"
],
"isActive": true,
"profilePhoto": null,
"emergencyContact": {
"name": "Grace Hopper",
"phone": "+1-614-555-0177",
"relationship": "Spouse"
},
"workHistory": [
{
"facility": "Westside Depot",
"position": "Warehouse Associate",
"startDate": "2020-03-01",
"endDate": "2023-11-30",
"description": "Fulfillment and receiving"
}
],
"education": [
{
"institution": "Columbus State",
"degree": "Associate, Logistics",
"graduationYear": 2019,
"gpa": 3.6
}
]
}{
"error": {
"message": "<string>",
"code": "<string>",
"details": {},
"suggestion": "<string>",
"retryable": true
},
"requestId": "<string>"
}{
"error": {
"message": "Invalid or revoked API key",
"code": "UNAUTHENTICATED",
"suggestion": "Send a valid `Authorization: Bearer <token>` (nex_live_/nex_pat_ key, JWT, or OAuth access token).",
"retryable": false
}
}{
"error": {
"message": "Insufficient API key scope",
"code": "INSUFFICIENT_SCOPE",
"suggestion": "Mint or rotate a key that includes the required scope, or grant a wildcard like `resource:*`.",
"retryable": false
}
}{
"error": {
"message": "Rate limit exceeded for this API key",
"code": "API_KEY_RATE_LIMITED",
"suggestion": "Wait until X-RateLimit-Reset before retrying, or batch operations.",
"retryable": true
}
}Authorizations
JWT token authentication
Headers
Pin the request to a dated API version (e.g. 2026-05-10). Applied by app-level middleware to every /api route (server/routes/index.ts → apiVersionMiddleware), which echoes the resolved value back in the NexSpace-Version response header. Omit to get the latest version. Discover the catalog at GET /.well-known/api-versions.
^\d{4}-\d{2}-\d{2}$Replay guard for write requests. Applied by app-level middleware to every /api route (server/routes/index.ts → idempotencyMiddleware), which only acts on POST/PUT/PATCH — GET, DELETE and OPTIONS ignore the header. Re-sending the same key with an identical body within 24 hours replays the original response; the same key with a different body returns 409.
255Body
Response
Staff member created successfully
Unique staff identifier
First name
Last name
Email address
Phone number
Worker specialty or role classification (industry-specific)
Type of employment
full_time, part_time, contract, per_diem Hourly pay rate
Years of experience
Professional certifications
Skills and competencies
Whether the staff member is active
URL to profile photo
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes

