curl --request POST \
--url https://app.orgo.space/api/v1/badge_users/{id}/steps \
--header 'Api-Token: <api-key>' \
--header 'Content-Type: application/json' \
--data '
{
"stepId": 42,
"status": 0,
"note": "Joined via Boston outreach drive."
}
'import requests
url = "https://app.orgo.space/api/v1/badge_users/{id}/steps"
payload = {
"stepId": 42,
"status": 0,
"note": "Joined via Boston outreach drive."
}
headers = {
"Api-Token": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Api-Token': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({stepId: 42, status: 0, note: 'Joined via Boston outreach drive.'})
};
fetch('https://app.orgo.space/api/v1/badge_users/{id}/steps', 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://app.orgo.space/api/v1/badge_users/{id}/steps",
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([
'stepId' => 42,
'status' => 0,
'note' => 'Joined via Boston outreach drive.'
]),
CURLOPT_HTTPHEADER => [
"Api-Token: <api-key>",
"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://app.orgo.space/api/v1/badge_users/{id}/steps"
payload := strings.NewReader("{\n \"stepId\": 42,\n \"status\": 0,\n \"note\": \"Joined via Boston outreach drive.\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Api-Token", "<api-key>")
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://app.orgo.space/api/v1/badge_users/{id}/steps")
.header("Api-Token", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"stepId\": 42,\n \"status\": 0,\n \"note\": \"Joined via Boston outreach drive.\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.orgo.space/api/v1/badge_users/{id}/steps")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Api-Token"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"stepId\": 42,\n \"status\": 0,\n \"note\": \"Joined via Boston outreach drive.\"\n}"
response = http.request(request)
puts response.read_body{
"id": 42,
"badge": {
"id": 42,
"name": "Boston Chapter",
"type": {
"id": 42,
"name": "Boston Chapter"
},
"translation": "string",
"logo": "https://cdn.orgo.space/tenants/acme/logo.png",
"referrals": 42,
"kind": "STANDARD",
"userType": {
"id": 42,
"name": "Boston Chapter"
},
"steps": [
{
"id": 42,
"position": 42,
"title": "Volunteer Coordinator",
"description": "Quarterly chapter meeting open to all members.",
"translation": "string",
"isOptional": true,
"isArchived": false
}
]
},
"user": {
"id": 42,
"firstName": "James",
"lastName": "Patterson",
"localCenter": {
"alias": "string",
"id": 42,
"name": "Boston Chapter"
},
"localCenterParent": "/api/v1/units/1",
"fullName": "James Patterson",
"logo": "https://cdn.orgo.space/tenants/acme/logo.png"
},
"dateCreated": "2026-01-15T10:30:00+00:00",
"commentUser": "Confirmed by phone — will arrive at 10am.",
"commentMaster": "Confirmed by phone — will arrive at 10am.",
"status": 42,
"owner": {
"id": 42,
"firstName": "James",
"lastName": "Patterson",
"localCenter": {
"alias": "string",
"id": 42,
"name": "Boston Chapter"
},
"localCenterParent": "/api/v1/units/1",
"fullName": "James Patterson",
"logo": "https://cdn.orgo.space/tenants/acme/logo.png"
},
"pointsAtAward": 42,
"badgeUserSteps": [
{
"id": 42,
"step": {
"id": 42,
"position": 42,
"title": "Volunteer Coordinator",
"description": "Quarterly chapter meeting open to all members.",
"translation": "string",
"isOptional": true,
"isArchived": false
},
"status": 42,
"note": "Joined via Boston outreach drive.",
"updatedBy": {
"id": 42,
"firstName": "James",
"lastName": "Patterson",
"localCenter": "/api/v1/local_centers/1",
"localCenterParent": "/api/v1/units/1",
"fullName": "James Patterson",
"logo": "https://cdn.orgo.space/tenants/acme/logo.png"
},
"dateCreated": "2026-01-15T10:30:00+00:00",
"dateUpdated": "2026-01-15T10:30:00+00:00"
}
],
"stepsProgress": [
"string"
]
}Record one checklist step
Sets one step of this badge assignment to began (status: 0), completed (status: 1) or back to not started (status: null, which deletes the progress row). Every change stamps the time and the author. Idempotent in (assignment, step). When the badge has autoCompleteOnSteps and required steps, the assignment’s own status is derived from them in both directions. Allowed for the member the badge belongs to while gamification.membersCanRecordSteps is on, and for HR_ASSISTANT_LOCAL on that member or HR_ASSISTANT_TENANT. Requires gamification.hasBadgeSteps.
curl --request POST \
--url https://app.orgo.space/api/v1/badge_users/{id}/steps \
--header 'Api-Token: <api-key>' \
--header 'Content-Type: application/json' \
--data '
{
"stepId": 42,
"status": 0,
"note": "Joined via Boston outreach drive."
}
'import requests
url = "https://app.orgo.space/api/v1/badge_users/{id}/steps"
payload = {
"stepId": 42,
"status": 0,
"note": "Joined via Boston outreach drive."
}
headers = {
"Api-Token": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Api-Token': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({stepId: 42, status: 0, note: 'Joined via Boston outreach drive.'})
};
fetch('https://app.orgo.space/api/v1/badge_users/{id}/steps', 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://app.orgo.space/api/v1/badge_users/{id}/steps",
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([
'stepId' => 42,
'status' => 0,
'note' => 'Joined via Boston outreach drive.'
]),
CURLOPT_HTTPHEADER => [
"Api-Token: <api-key>",
"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://app.orgo.space/api/v1/badge_users/{id}/steps"
payload := strings.NewReader("{\n \"stepId\": 42,\n \"status\": 0,\n \"note\": \"Joined via Boston outreach drive.\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Api-Token", "<api-key>")
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://app.orgo.space/api/v1/badge_users/{id}/steps")
.header("Api-Token", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"stepId\": 42,\n \"status\": 0,\n \"note\": \"Joined via Boston outreach drive.\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.orgo.space/api/v1/badge_users/{id}/steps")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Api-Token"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"stepId\": 42,\n \"status\": 0,\n \"note\": \"Joined via Boston outreach drive.\"\n}"
response = http.request(request)
puts response.read_body{
"id": 42,
"badge": {
"id": 42,
"name": "Boston Chapter",
"type": {
"id": 42,
"name": "Boston Chapter"
},
"translation": "string",
"logo": "https://cdn.orgo.space/tenants/acme/logo.png",
"referrals": 42,
"kind": "STANDARD",
"userType": {
"id": 42,
"name": "Boston Chapter"
},
"steps": [
{
"id": 42,
"position": 42,
"title": "Volunteer Coordinator",
"description": "Quarterly chapter meeting open to all members.",
"translation": "string",
"isOptional": true,
"isArchived": false
}
]
},
"user": {
"id": 42,
"firstName": "James",
"lastName": "Patterson",
"localCenter": {
"alias": "string",
"id": 42,
"name": "Boston Chapter"
},
"localCenterParent": "/api/v1/units/1",
"fullName": "James Patterson",
"logo": "https://cdn.orgo.space/tenants/acme/logo.png"
},
"dateCreated": "2026-01-15T10:30:00+00:00",
"commentUser": "Confirmed by phone — will arrive at 10am.",
"commentMaster": "Confirmed by phone — will arrive at 10am.",
"status": 42,
"owner": {
"id": 42,
"firstName": "James",
"lastName": "Patterson",
"localCenter": {
"alias": "string",
"id": 42,
"name": "Boston Chapter"
},
"localCenterParent": "/api/v1/units/1",
"fullName": "James Patterson",
"logo": "https://cdn.orgo.space/tenants/acme/logo.png"
},
"pointsAtAward": 42,
"badgeUserSteps": [
{
"id": 42,
"step": {
"id": 42,
"position": 42,
"title": "Volunteer Coordinator",
"description": "Quarterly chapter meeting open to all members.",
"translation": "string",
"isOptional": true,
"isArchived": false
},
"status": 42,
"note": "Joined via Boston outreach drive.",
"updatedBy": {
"id": 42,
"firstName": "James",
"lastName": "Patterson",
"localCenter": "/api/v1/local_centers/1",
"localCenterParent": "/api/v1/units/1",
"fullName": "James Patterson",
"logo": "https://cdn.orgo.space/tenants/acme/logo.png"
},
"dateCreated": "2026-01-15T10:30:00+00:00",
"dateUpdated": "2026-01-15T10:30:00+00:00"
}
],
"stepsProgress": [
"string"
]
}Authorizations
Server-to-server authentication. Generate a token in the admin UI at
Settings → Developers → API Access. Send the raw token in the
Api-Token header — there is no Bearer prefix.
Tokens can be marked read-only at creation time, in which case the API
rejects any non-GET request with 403 Forbidden.
Path Parameters
BadgeUser identifier
Body
Response
BadgeUser resource created
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes

