Introduction
Mintfit V2 LMS - A modular monolith learning management system with microservice-style boundaries.
This documentation provides comprehensive information about the Mintfit V2 API.
## Architecture
Mintfit V2 is built as a **modular monolith** with strict module boundaries:
- Each module is self-contained with Services as the public API
- Modules follow Domain-Driven Design principles (Domain, Application, Infrastructure layers)
- Inter-module communication is only allowed through Service classes in the Application layer
<aside>As you scroll, you'll see code examples in different programming languages in the dark area to the right (or as part of the content on mobile).
You can switch the language used with the tabs at the top right (or from the nav menu at the top left on mobile).</aside>
Authenticating requests
This API is not authenticated.
Ad Delivery
Get ads for a specific placement (public endpoint) This endpoint is used by frontends to fetch ads for display. It returns ads based on: - Frontend and placement - Tenant context (global + tenant-specific ads) - Time constraints (starts_at/ends_at) - Priority ordering
Example request:
curl --request GET \
--get "http://localhost:8000/v1/ads/delivery?frontend=architecto&placement=architecto&tenant_id=architecto&limit=16" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"frontend\": \"b\",
\"placement\": \"n\",
\"tenant_id\": \"architecto\",
\"limit\": 22
}"
const url = new URL(
"http://localhost:8000/v1/ads/delivery"
);
const params = {
"frontend": "architecto",
"placement": "architecto",
"tenant_id": "architecto",
"limit": "16",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"frontend": "b",
"placement": "n",
"tenant_id": "architecto",
"limit": 22
};
fetch(url, {
method: "GET",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/ads/delivery';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'query' => [
'frontend' => 'architecto',
'placement' => 'architecto',
'tenant_id' => 'architecto',
'limit' => '16',
],
'json' => [
'frontend' => 'b',
'placement' => 'n',
'tenant_id' => 'architecto',
'limit' => 22,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (500):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "Internal Server Error",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Ad Management
List all ads with optional filtering
Example request:
curl --request GET \
--get "http://localhost:8000/v1/ads?per_page=20&page=1&type=banner&status=active&tenant_id=01JH...&search=promo&created_at_gte=2024-01-01&created_at_lte=2024-12-31&sort=-priority" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/ads"
);
const params = {
"per_page": "20",
"page": "1",
"type": "banner",
"status": "active",
"tenant_id": "01JH...",
"search": "promo",
"created_at_gte": "2024-01-01",
"created_at_lte": "2024-12-31",
"sort": "-priority",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/ads';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'query' => [
'per_page' => '20',
'page' => '1',
'type' => 'banner',
'status' => 'active',
'tenant_id' => '01JH...',
'search' => 'promo',
'created_at_gte' => '2024-01-01',
'created_at_lte' => '2024-12-31',
'sort' => '-priority',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "Full authentication required. Anonymous access not allowed for this endpoint.",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Create a new ad
Example request:
curl --request POST \
"http://localhost:8000/v1/ads" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/ads"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "POST",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/ads';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Get ad by ID
Example request:
curl --request GET \
--get "http://localhost:8000/v1/ads/58C6f7nnFCJ9M6rjyc6rTKMzn6" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/ads/58C6f7nnFCJ9M6rjyc6rTKMzn6"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/ads/58C6f7nnFCJ9M6rjyc6rTKMzn6';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "Full authentication required. Anonymous access not allowed for this endpoint.",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Update ad by ID
Example request:
curl --request PUT \
"http://localhost:8000/v1/ads/58C6f7nnFCJ9M6rjyc6rTKMzn6" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/ads/58C6f7nnFCJ9M6rjyc6rTKMzn6"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "PUT",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/ads/58C6f7nnFCJ9M6rjyc6rTKMzn6';
$response = $client->put(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Delete ad by ID (soft delete)
Example request:
curl --request DELETE \
"http://localhost:8000/v1/ads/58C6f7nnFCJ9M6rjyc6rTKMzn6" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/ads/58C6f7nnFCJ9M6rjyc6rTKMzn6"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "DELETE",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/ads/58C6f7nnFCJ9M6rjyc6rTKMzn6';
$response = $client->delete(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Activate an ad
Example request:
curl --request POST \
"http://localhost:8000/v1/ads/58C6f7nnFCJ9M6rjyc6rTKMzn6/activate" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/ads/58C6f7nnFCJ9M6rjyc6rTKMzn6/activate"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "POST",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/ads/58C6f7nnFCJ9M6rjyc6rTKMzn6/activate';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Pause an ad
Example request:
curl --request POST \
"http://localhost:8000/v1/ads/58C6f7nnFCJ9M6rjyc6rTKMzn6/pause" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/ads/58C6f7nnFCJ9M6rjyc6rTKMzn6/pause"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "POST",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/ads/58C6f7nnFCJ9M6rjyc6rTKMzn6/pause';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Assign ad to placement
Example request:
curl --request POST \
"http://localhost:8000/v1/ads/58C6f7nnFCJ9M6rjyc6rTKMzn6/placements/58C6f7nnFCJ9M6rjyc6rTKMzn6" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/ads/58C6f7nnFCJ9M6rjyc6rTKMzn6/placements/58C6f7nnFCJ9M6rjyc6rTKMzn6"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "POST",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/ads/58C6f7nnFCJ9M6rjyc6rTKMzn6/placements/58C6f7nnFCJ9M6rjyc6rTKMzn6';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Unassign ad from placement
Example request:
curl --request DELETE \
"http://localhost:8000/v1/ads/58C6f7nnFCJ9M6rjyc6rTKMzn6/placements/58C6f7nnFCJ9M6rjyc6rTKMzn6" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/ads/58C6f7nnFCJ9M6rjyc6rTKMzn6/placements/58C6f7nnFCJ9M6rjyc6rTKMzn6"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "DELETE",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/ads/58C6f7nnFCJ9M6rjyc6rTKMzn6/placements/58C6f7nnFCJ9M6rjyc6rTKMzn6';
$response = $client->delete(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Ad Statistics
Get summary statistics for all ads
Example request:
curl --request GET \
--get "http://localhost:8000/v1/ads/statistics/summary" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"tenant_id\": \"architecto\",
\"period_start\": \"2026-11-03T00:49:05\",
\"period_end\": \"2052-11-26\"
}"
const url = new URL(
"http://localhost:8000/v1/ads/statistics/summary"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"tenant_id": "architecto",
"period_start": "2026-11-03T00:49:05",
"period_end": "2052-11-26"
};
fetch(url, {
method: "GET",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/ads/statistics/summary';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'tenant_id' => 'architecto',
'period_start' => '2026-11-03T00:49:05',
'period_end' => '2052-11-26',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "Full authentication required. Anonymous access not allowed for this endpoint.",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Get statistics for an ad
Example request:
curl --request GET \
--get "http://localhost:8000/v1/ads/58C6f7nnFCJ9M6rjyc6rTKMzn6/statistics" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/ads/58C6f7nnFCJ9M6rjyc6rTKMzn6/statistics"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/ads/58C6f7nnFCJ9M6rjyc6rTKMzn6/statistics';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "Full authentication required. Anonymous access not allowed for this endpoint.",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Get statistics for a placement
Example request:
curl --request GET \
--get "http://localhost:8000/v1/placements/58C6f7nnFCJ9M6rjyc6rTKMzn6/statistics" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/placements/58C6f7nnFCJ9M6rjyc6rTKMzn6/statistics"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/placements/58C6f7nnFCJ9M6rjyc6rTKMzn6/statistics';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "Full authentication required. Anonymous access not allowed for this endpoint.",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Ad Tracking
Track an ad impression (public endpoint) This endpoint is called when an ad is displayed to a user. The tracking is processed asynchronously via a queued job.
Example request:
curl --request POST \
"http://localhost:8000/v1/ads/track/impression" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"ad_id\": \"architecto\",
\"placement_id\": \"architecto\",
\"placement_key\": \"architecto\",
\"frontend\": \"architecto\",
\"tenant_id\": \"architecto\"
}"
const url = new URL(
"http://localhost:8000/v1/ads/track/impression"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"ad_id": "architecto",
"placement_id": "architecto",
"placement_key": "architecto",
"frontend": "architecto",
"tenant_id": "architecto"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/ads/track/impression';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'ad_id' => 'architecto',
'placement_id' => 'architecto',
'placement_key' => 'architecto',
'frontend' => 'architecto',
'tenant_id' => 'architecto',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Track an ad click (public endpoint) This endpoint is called when a user clicks on an ad. The tracking is processed asynchronously via a queued job.
Example request:
curl --request POST \
"http://localhost:8000/v1/ads/track/click" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"ad_id\": \"architecto\",
\"placement_id\": \"architecto\",
\"placement_key\": \"architecto\",
\"frontend\": \"architecto\",
\"tenant_id\": \"architecto\"
}"
const url = new URL(
"http://localhost:8000/v1/ads/track/click"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"ad_id": "architecto",
"placement_id": "architecto",
"placement_key": "architecto",
"frontend": "architecto",
"tenant_id": "architecto"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/ads/track/click';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'ad_id' => 'architecto',
'placement_id' => 'architecto',
'placement_key' => 'architecto',
'frontend' => 'architecto',
'tenant_id' => 'architecto',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Anonymous Sessions
List anonymous sessions Returns a paginated list of the tenant's anonymous sessions with optional filtering. Requires `anonymous_sessions.read` permission.
requires authentication
Example request:
curl --request GET \
--get "http://localhost:8000/v1/anonymous-sessions?per_page=10&page=1&anonymous_id=01kav3fcmme10dwbeexyqkfndn&search=192.168&logged_in_at_gte=2026-01-01&logged_in_at_lte=2026-12-31&is_upgraded=1&sort=-logged_in_at" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/anonymous-sessions"
);
const params = {
"per_page": "10",
"page": "1",
"anonymous_id": "01kav3fcmme10dwbeexyqkfndn",
"search": "192.168",
"logged_in_at_gte": "2026-01-01",
"logged_in_at_lte": "2026-12-31",
"is_upgraded": "1",
"sort": "-logged_in_at",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/anonymous-sessions';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'query' => [
'per_page' => '10',
'page' => '1',
'anonymous_id' => '01kav3fcmme10dwbeexyqkfndn',
'search' => '192.168',
'logged_in_at_gte' => '2026-01-01',
'logged_in_at_lte' => '2026-12-31',
'is_upgraded' => '1',
'sort' => '-logged_in_at',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"message": "Anonymous sessions retrieved successfully",
"data": {
"data": [],
"total": 0,
"per_page": 10,
"current_page": 1,
"last_page": 1
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Get anonymous session Returns a single anonymous session of the tenant by ID. Requires `anonymous_sessions.read` permission.
requires authentication
Example request:
curl --request GET \
--get "http://localhost:8000/v1/anonymous-sessions/01kav3fcmme10dwbeexyqkfndn" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/anonymous-sessions/01kav3fcmme10dwbeexyqkfndn"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/anonymous-sessions/01kav3fcmme10dwbeexyqkfndn';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"message": "Anonymous session retrieved successfully",
"data": {
"id": "01kav3fcmme10dwbeexyqkfndn",
"tenant_id": "01kav3fbpbpb3wnhtadsmrmt7m",
"anonymous_id": "01kav3fcmme10dwbeexyqkfndn",
"ip_address": "127.0.0.1",
"user_agent": "Mozilla/5.0",
"logged_in_at": "2026-03-04T00:00:00+00:00",
"last_refreshed_at": null,
"refresh_count": 0,
"upgraded_to_identity_id": null,
"upgraded_at": null,
"expires_at": "2026-04-03T00:00:00+00:00"
}
}
Example response (404):
{
"success": false,
"message": "Anonymous session not found"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Attempt Management
Start a new attempt
Creates a new attempt for an attemptable entity (e.g., quiz_version). The attempt is created in 'in_progress' state. Its questions are drawn now and returned in delivery order; every later read of the attempt returns the same questions. See AttemptView for what they contain. The identity_id is automatically set from the authenticated user.
Example request:
curl --request POST \
"http://localhost:8000/v1/attempts/start" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"attemptable_type\": \"quiz_version\",
\"attemptable_id\": \"01JGQUIZVERSION0000001\",
\"metadata\": []
}"
const url = new URL(
"http://localhost:8000/v1/attempts/start"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"attemptable_type": "quiz_version",
"attemptable_id": "01JGQUIZVERSION0000001",
"metadata": []
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/attempts/start';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'attemptable_type' => 'quiz_version',
'attemptable_id' => '01JGQUIZVERSION0000001',
'metadata' => [],
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (201):
{
"success": true,
"message": "Attempt started successfully",
"data": {
"id": "01JGATTEMPT000000000001",
"identity_id": "01JGUSER00000000000001",
"attemptable_type": "quiz_version",
"attemptable_id": "01JGQUIZVERSION0000001",
"status": "in_progress",
"started_at": "2024-01-15T10:30:00Z",
"submitted_at": null,
"abandoned_at": null,
"total_score": null,
"max_possible_score": null,
"metadata": {},
"questions": [
{
"slot_id": "01JGSLOT000000000000001",
"slot_option_id": "01JGQUESTION00000000001",
"sequence_number": 1,
"points": 2,
"question": {
"type": "short_answer",
"title": {
"en": "Q1"
},
"prompt": {
"en": "Enter 42"
},
"instructions": null,
"media_id": null,
"logic": []
}
}
],
"responses": []
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Get attempts for attemptable
Retrieves paginated attempts for a specific identity and attemptable entity. Users can only view their own attempts. Staff with 'attempts.read_all' view every identity's attempts, and omit identity_id to list them all, on quizzes their tenant owns.
Example request:
curl --request GET \
--get "http://localhost:8000/v1/attempts/for-attemptable?identity_id=01JGUSER00000000000001&attemptable_type=quiz_version&attemptable_id=01JGQUIZVERSION0000001&per_page=10&page=1" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"identity_id\": \"bngzmiyvdljnikhwaykcmyuwpw\",
\"attemptable_type\": \"architecto\",
\"attemptable_id\": \"ngzmiyvdljnikhwaykcmyuwpwl\",
\"per_page\": 20,
\"page\": 43
}"
const url = new URL(
"http://localhost:8000/v1/attempts/for-attemptable"
);
const params = {
"identity_id": "01JGUSER00000000000001",
"attemptable_type": "quiz_version",
"attemptable_id": "01JGQUIZVERSION0000001",
"per_page": "10",
"page": "1",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"identity_id": "bngzmiyvdljnikhwaykcmyuwpw",
"attemptable_type": "architecto",
"attemptable_id": "ngzmiyvdljnikhwaykcmyuwpwl",
"per_page": 20,
"page": 43
};
fetch(url, {
method: "GET",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/attempts/for-attemptable';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'query' => [
'identity_id' => '01JGUSER00000000000001',
'attemptable_type' => 'quiz_version',
'attemptable_id' => '01JGQUIZVERSION0000001',
'per_page' => '10',
'page' => '1',
],
'json' => [
'identity_id' => 'bngzmiyvdljnikhwaykcmyuwpw',
'attemptable_type' => 'architecto',
'attemptable_id' => 'ngzmiyvdljnikhwaykcmyuwpwl',
'per_page' => 20,
'page' => 43,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"message": "Attempts retrieved successfully",
"data": {
"current_page": 1,
"data": [],
"total": 0
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Get attempts for a quiz across all versions.
Retrieves paginated attempts for a specific quiz (all versions). Users can only view their own attempts. Staff with 'attempts.read_all' view every identity's attempts on quizzes their tenant owns.
Example request:
curl --request GET \
--get "http://localhost:8000/v1/attempts/for-quiz?identity_id=01JGUSER00000000000001&quiz_id=01JGQUIZ00000000000001&per_page=10&page=1" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"identity_id\": \"bngzmiyvdljnikhwaykcmyuwpw\",
\"quiz_id\": \"lvqwrsitcpscqldzsnrwtujwvl\",
\"per_page\": 9,
\"page\": 80
}"
const url = new URL(
"http://localhost:8000/v1/attempts/for-quiz"
);
const params = {
"identity_id": "01JGUSER00000000000001",
"quiz_id": "01JGQUIZ00000000000001",
"per_page": "10",
"page": "1",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"identity_id": "bngzmiyvdljnikhwaykcmyuwpw",
"quiz_id": "lvqwrsitcpscqldzsnrwtujwvl",
"per_page": 9,
"page": 80
};
fetch(url, {
method: "GET",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/attempts/for-quiz';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'query' => [
'identity_id' => '01JGUSER00000000000001',
'quiz_id' => '01JGQUIZ00000000000001',
'per_page' => '10',
'page' => '1',
],
'json' => [
'identity_id' => 'bngzmiyvdljnikhwaykcmyuwpw',
'quiz_id' => 'lvqwrsitcpscqldzsnrwtujwvl',
'per_page' => 9,
'page' => 80,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "Authentication required. Please provide a valid access token.",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Record an answer
Records or updates a user's answer to a question. Supports optimistic locking via current_version parameter.
Example request:
curl --request POST \
"http://localhost:8000/v1/attempts/record-answer" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"attempt_id\": \"01JGATTEMPT000000000001\",
\"slot_option_id\": \"01JGQUESTION00000000001\",
\"answer_data\": {
\"selected_option_id\": \"b\"
},
\"time_spent_seconds\": 16,
\"current_version\": 16,
\"metadata\": []
}"
const url = new URL(
"http://localhost:8000/v1/attempts/record-answer"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"attempt_id": "01JGATTEMPT000000000001",
"slot_option_id": "01JGQUESTION00000000001",
"answer_data": {
"selected_option_id": "b"
},
"time_spent_seconds": 16,
"current_version": 16,
"metadata": []
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/attempts/record-answer';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'attempt_id' => '01JGATTEMPT000000000001',
'slot_option_id' => '01JGQUESTION00000000001',
'answer_data' => [
'selected_option_id' => 'b',
],
'time_spent_seconds' => 16,
'current_version' => 16,
'metadata' => [],
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"message": "Answer recorded successfully",
"data": {
"id": "01JGRESPONSE0000000001",
"attempt_id": "01JGATTEMPT000000000001",
"slot_option_id": "01JGQUESTION00000000001",
"answer_snapshot": {
"selected_option_id": "b"
},
"submission_state": "answered",
"points_awarded": null,
"is_correct": null,
"response_version": 1,
"first_responded_at": "2024-01-15T10:31:00Z",
"last_responded_at": "2024-01-15T10:31:00Z",
"time_spent_seconds": 45,
"metadata": null
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Record slot display
Records that a slot/question was displayed to the user, for navigation analytics. A question option must be one the attempt was scheduled; a display never changes the attempt's questions.
Example request:
curl --request POST \
"http://localhost:8000/v1/attempts/record-slot-display" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"attempt_id\": \"01JGATTEMPT000000000001\",
\"slot_id\": \"01JGSLOT000000000000001\",
\"slot_option_id\": \"architecto\",
\"navigation_method\": \"sequential\",
\"metadata\": []
}"
const url = new URL(
"http://localhost:8000/v1/attempts/record-slot-display"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"attempt_id": "01JGATTEMPT000000000001",
"slot_id": "01JGSLOT000000000000001",
"slot_option_id": "architecto",
"navigation_method": "sequential",
"metadata": []
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/attempts/record-slot-display';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'attempt_id' => '01JGATTEMPT000000000001',
'slot_id' => '01JGSLOT000000000000001',
'slot_option_id' => 'architecto',
'navigation_method' => 'sequential',
'metadata' => [],
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"message": "Slot display recorded successfully",
"data": {
"id": "01JGHISTORY00000000001",
"attempt_id": "01JGATTEMPT000000000001",
"slot_id": "01JGSLOT000000000000001",
"slot_option_id": "01JGQUESTION00000000001",
"displayed_at": "2024-01-15T10:30:30Z",
"display_sequence": 1,
"navigation_method": "sequential",
"metadata": null
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Get attempt by ID
Retrieves the attempt with its questions in delivery order and its responses. Answer keys, formula variants and grading output are only included once the attempt is submitted (review). grading_error, the stored reason a grading run failed, is only included for staff of the tenant owning the quiz; everyone else sees grading_status.
Learners read their own attempts. Staff with 'attempts.read_all' read every attempt on quizzes their tenant owns. Any other attempt is reported as not found.
Example request:
curl --request GET \
--get "http://localhost:8000/v1/attempts/01JGATTEMPT000000000001" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/attempts/01JGATTEMPT000000000001"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/attempts/01JGATTEMPT000000000001';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"message": "Attempt retrieved successfully",
"data": {
"id": "01JGATTEMPT000000000001",
"identity_id": "01JGUSER00000000000001",
"attemptable_type": "quiz_version",
"attemptable_id": "01JGQUIZVERSION0000001",
"status": "in_progress",
"started_at": "2024-01-15T10:30:00Z",
"submitted_at": null,
"abandoned_at": null,
"total_score": null,
"max_possible_score": null,
"metadata": {},
"questions": [],
"responses": []
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Delete attempt
Requires 'attempts.delete'. Deletes the caller's own attempts and, for staff, attempts on quizzes their tenant owns. Any other attempt is reported as not found and left unchanged.
Example request:
curl --request DELETE \
"http://localhost:8000/v1/attempts/01JGATTEMPT000000000001" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/attempts/01JGATTEMPT000000000001"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "DELETE",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/attempts/01JGATTEMPT000000000001';
$response = $client->delete(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Submit attempt
Submits the attempt for grading. Makes the attempt immutable.
Example request:
curl --request POST \
"http://localhost:8000/v1/attempts/01JGATTEMPT000000000001/submit" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/attempts/01JGATTEMPT000000000001/submit"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "POST",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/attempts/01JGATTEMPT000000000001/submit';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"message": "Attempt submitted successfully",
"data": {
"id": "01JGATTEMPT000000000001",
"status": "submitted",
"submitted_at": "2024-01-15T10:45:00Z"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Abandon attempt
Abandons the attempt. Makes the attempt immutable.
Example request:
curl --request POST \
"http://localhost:8000/v1/attempts/01JGATTEMPT000000000001/abandon" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/attempts/01JGATTEMPT000000000001/abandon"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "POST",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/attempts/01JGATTEMPT000000000001/abandon';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"message": "Attempt abandoned successfully",
"data": {
"id": "01JGATTEMPT000000000001",
"status": "abandoned",
"abandoned_at": "2024-01-15T10:45:00Z"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Skip a question
Marks a question as explicitly skipped.
Example request:
curl --request POST \
"http://localhost:8000/v1/attempts/01JGATTEMPT000000000001/skip/01JGQUESTION00000000001" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/attempts/01JGATTEMPT000000000001/skip/01JGQUESTION00000000001"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "POST",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/attempts/01JGATTEMPT000000000001/skip/01JGQUESTION00000000001';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"message": "Question skipped successfully",
"data": {
"id": "01JGRESPONSE0000000001",
"attempt_id": "01JGATTEMPT000000000001",
"slot_option_id": "01JGQUESTION00000000001",
"answer_snapshot": {},
"submission_state": "skipped",
"points_awarded": null,
"is_correct": null,
"response_version": 1,
"first_responded_at": "2024-01-15T10:31:00Z",
"last_responded_at": "2024-01-15T10:31:00Z",
"time_spent_seconds": null,
"metadata": null
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Block Management
Get all block schemas Returns JSON schemas for all supported block types. Schemas define the structure and validation rules for each block type. Public endpoint - no authentication required.
Example request:
curl --request GET \
--get "http://localhost:8000/v1/blocks/schemas" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/blocks/schemas"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/blocks/schemas';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"message": "Block schemas retrieved successfully",
"data": [
{
"type": "paragraph",
"schema": {
"type": "object",
"properties": {
"content": {
"type": "string"
}
}
}
},
{
"type": "headline",
"schema": {
"type": "object",
"properties": {
"content": {
"type": "string"
},
"level": {
"type": "integer",
"minimum": 1,
"maximum": 6
}
}
}
}
]
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Get schema for specific block type Returns the JSON schema for a specific block type. Supported types: paragraph, headline, image, table. Public endpoint - no authentication required.
Example request:
curl --request GET \
--get "http://localhost:8000/v1/blocks/schemas/paragraph" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/blocks/schemas/paragraph"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/blocks/schemas/paragraph';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"message": "Schema retrieved successfully for type: paragraph",
"data": {
"type": "paragraph",
"schema": {
"type": "object",
"properties": {
"content": {
"type": "string"
}
},
"required": [
"content"
]
}
}
}
Example response (404):
{
"success": false,
"message": "Block type not found: unknown"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Content Hierarchy
Get child pages of a content page
Example request:
curl --request GET \
--get "http://localhost:8000/v1/content/58C6f7nnFCJ9M6rjyc6rTKMzn6/children" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/content/58C6f7nnFCJ9M6rjyc6rTKMzn6/children"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/content/58C6f7nnFCJ9M6rjyc6rTKMzn6/children';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (500):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "Internal Server Error",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Get navigation context (parent, children, breadcrumbs, next/prev)
Reorder child pages
Example request:
curl --request POST \
"http://localhost:8000/v1/content/58C6f7nnFCJ9M6rjyc6rTKMzn6/reorder" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"ordered_ids\": [
\"architecto\"
]
}"
const url = new URL(
"http://localhost:8000/v1/content/58C6f7nnFCJ9M6rjyc6rTKMzn6/reorder"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"ordered_ids": [
"architecto"
]
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/content/58C6f7nnFCJ9M6rjyc6rTKMzn6/reorder';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'ordered_ids' => [
'architecto',
],
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Content History
Get version history for a content page
Example request:
curl --request GET \
--get "http://localhost:8000/v1/content/58C6f7nnFCJ9M6rjyc6rTKMzn6/history" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"per_page\": 1,
\"page\": 22
}"
const url = new URL(
"http://localhost:8000/v1/content/58C6f7nnFCJ9M6rjyc6rTKMzn6/history"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"per_page": 1,
"page": 22
};
fetch(url, {
method: "GET",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/content/58C6f7nnFCJ9M6rjyc6rTKMzn6/history';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'per_page' => 1,
'page' => 22,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "Full authentication required. Anonymous access not allowed for this endpoint.",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Get a specific version from history
Example request:
curl --request GET \
--get "http://localhost:8000/v1/content/58C6f7nnFCJ9M6rjyc6rTKMzn6/history/58C6f7nnFCJ9M6rjyc6rTKMzn6" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/content/58C6f7nnFCJ9M6rjyc6rTKMzn6/history/58C6f7nnFCJ9M6rjyc6rTKMzn6"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/content/58C6f7nnFCJ9M6rjyc6rTKMzn6/history/58C6f7nnFCJ9M6rjyc6rTKMzn6';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "Full authentication required. Anonymous access not allowed for this endpoint.",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Compare two versions
Example request:
curl --request POST \
"http://localhost:8000/v1/content/58C6f7nnFCJ9M6rjyc6rTKMzn6/history/compare" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"version1\": \"architecto\",
\"version2\": \"architecto\"
}"
const url = new URL(
"http://localhost:8000/v1/content/58C6f7nnFCJ9M6rjyc6rTKMzn6/history/compare"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"version1": "architecto",
"version2": "architecto"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/content/58C6f7nnFCJ9M6rjyc6rTKMzn6/history/compare';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'version1' => 'architecto',
'version2' => 'architecto',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Restore a previous version
Example request:
curl --request POST \
"http://localhost:8000/v1/content/58C6f7nnFCJ9M6rjyc6rTKMzn6/history/58C6f7nnFCJ9M6rjyc6rTKMzn6/restore" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/content/58C6f7nnFCJ9M6rjyc6rTKMzn6/history/58C6f7nnFCJ9M6rjyc6rTKMzn6/restore"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "POST",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/content/58C6f7nnFCJ9M6rjyc6rTKMzn6/history/58C6f7nnFCJ9M6rjyc6rTKMzn6/restore';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Content Management
List all content pages (paginated, filtered)
Example request:
curl --request GET \
--get "http://localhost:8000/v1/content?per_page=20&page=1&type=page&status=published&is_public=1&search=welcome&created_at_gte=2024-01-01&created_at_lte=2024-12-31&tags=category%3Anews%2Cfeatured&tag_mode=and&sort=-created_at" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/content"
);
const params = {
"per_page": "20",
"page": "1",
"type": "page",
"status": "published",
"is_public": "1",
"search": "welcome",
"created_at_gte": "2024-01-01",
"created_at_lte": "2024-12-31",
"tags": "category:news,featured",
"tag_mode": "and",
"sort": "-created_at",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/content';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'query' => [
'per_page' => '20',
'page' => '1',
'type' => 'page',
'status' => 'published',
'is_public' => '1',
'search' => 'welcome',
'created_at_gte' => '2024-01-01',
'created_at_lte' => '2024-12-31',
'tags' => 'category:news,featured',
'tag_mode' => 'and',
'sort' => '-created_at',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (500):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "Internal Server Error",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Get content by ID
Example request:
curl --request GET \
--get "http://localhost:8000/v1/content/58C6f7nnFCJ9M6rjyc6rTKMzn6" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/content/58C6f7nnFCJ9M6rjyc6rTKMzn6"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/content/58C6f7nnFCJ9M6rjyc6rTKMzn6';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (500):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "Internal Server Error",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Get content by slug
Example request:
curl --request GET \
--get "http://localhost:8000/v1/content/slug/architecto" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/content/slug/architecto"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/content/slug/architecto';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (500):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "Internal Server Error",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Create new content page
Example request:
curl --request POST \
"http://localhost:8000/v1/content" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/content"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "POST",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/content';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Update content by ID
Example request:
curl --request PUT \
"http://localhost:8000/v1/content/58C6f7nnFCJ9M6rjyc6rTKMzn6" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/content/58C6f7nnFCJ9M6rjyc6rTKMzn6"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "PUT",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/content/58C6f7nnFCJ9M6rjyc6rTKMzn6';
$response = $client->put(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Delete content by ID (soft delete)
Example request:
curl --request DELETE \
"http://localhost:8000/v1/content/58C6f7nnFCJ9M6rjyc6rTKMzn6" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/content/58C6f7nnFCJ9M6rjyc6rTKMzn6"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "DELETE",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/content/58C6f7nnFCJ9M6rjyc6rTKMzn6';
$response = $client->delete(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Update content by slug
Example request:
curl --request PUT \
"http://localhost:8000/v1/content/slug/architecto" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/content/slug/architecto"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "PUT",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/content/slug/architecto';
$response = $client->put(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Delete content by slug (soft delete)
Example request:
curl --request DELETE \
"http://localhost:8000/v1/content/slug/architecto" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/content/slug/architecto"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "DELETE",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/content/slug/architecto';
$response = $client->delete(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Publish content page
Example request:
curl --request POST \
"http://localhost:8000/v1/content/58C6f7nnFCJ9M6rjyc6rTKMzn6/publish" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/content/58C6f7nnFCJ9M6rjyc6rTKMzn6/publish"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "POST",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/content/58C6f7nnFCJ9M6rjyc6rTKMzn6/publish';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Unpublish content page (revert to draft)
Example request:
curl --request POST \
"http://localhost:8000/v1/content/58C6f7nnFCJ9M6rjyc6rTKMzn6/unpublish" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/content/58C6f7nnFCJ9M6rjyc6rTKMzn6/unpublish"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "POST",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/content/58C6f7nnFCJ9M6rjyc6rTKMzn6/unpublish';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Schedule content for future publication
Example request:
curl --request POST \
"http://localhost:8000/v1/content/58C6f7nnFCJ9M6rjyc6rTKMzn6/schedule" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"published_at\": \"2052-11-26\"
}"
const url = new URL(
"http://localhost:8000/v1/content/58C6f7nnFCJ9M6rjyc6rTKMzn6/schedule"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"published_at": "2052-11-26"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/content/58C6f7nnFCJ9M6rjyc6rTKMzn6/schedule';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'published_at' => '2052-11-26',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Content Progress
Mark content page as completed
Example request:
curl --request POST \
"http://localhost:8000/v1/content/58C6f7nnFCJ9M6rjyc6rTKMzn6/progress/complete" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/content/58C6f7nnFCJ9M6rjyc6rTKMzn6/progress/complete"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "POST",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/content/58C6f7nnFCJ9M6rjyc6rTKMzn6/progress/complete';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Update progress percentage for a content page
Example request:
curl --request POST \
"http://localhost:8000/v1/content/58C6f7nnFCJ9M6rjyc6rTKMzn6/progress" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"progress_percentage\": 1
}"
const url = new URL(
"http://localhost:8000/v1/content/58C6f7nnFCJ9M6rjyc6rTKMzn6/progress"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"progress_percentage": 1
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/content/58C6f7nnFCJ9M6rjyc6rTKMzn6/progress';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'progress_percentage' => 1,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Get current user's progress for a content page
Example request:
curl --request GET \
--get "http://localhost:8000/v1/content/58C6f7nnFCJ9M6rjyc6rTKMzn6/progress" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/content/58C6f7nnFCJ9M6rjyc6rTKMzn6/progress"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/content/58C6f7nnFCJ9M6rjyc6rTKMzn6/progress';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "Authentication required. Please provide a valid access token.",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Get progress for entire document tree (multi-page document)
Example request:
curl --request GET \
--get "http://localhost:8000/v1/content/58C6f7nnFCJ9M6rjyc6rTKMzn6/progress/tree" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/content/58C6f7nnFCJ9M6rjyc6rTKMzn6/progress/tree"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/content/58C6f7nnFCJ9M6rjyc6rTKMzn6/progress/tree';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "Authentication required. Please provide a valid access token.",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Content Rendering
Render content to HTML
Example request:
curl --request GET \
--get "http://localhost:8000/v1/content/58C6f7nnFCJ9M6rjyc6rTKMzn6/render/html" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/content/58C6f7nnFCJ9M6rjyc6rTKMzn6/render/html"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/content/58C6f7nnFCJ9M6rjyc6rTKMzn6/render/html';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (500):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "Internal Server Error",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Render content to Markdown
Example request:
curl --request GET \
--get "http://localhost:8000/v1/content/58C6f7nnFCJ9M6rjyc6rTKMzn6/render/markdown" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/content/58C6f7nnFCJ9M6rjyc6rTKMzn6/render/markdown"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/content/58C6f7nnFCJ9M6rjyc6rTKMzn6/render/markdown';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (500):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "Internal Server Error",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Render content to plain text
Example request:
curl --request GET \
--get "http://localhost:8000/v1/content/58C6f7nnFCJ9M6rjyc6rTKMzn6/render/text" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/content/58C6f7nnFCJ9M6rjyc6rTKMzn6/render/text"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/content/58C6f7nnFCJ9M6rjyc6rTKMzn6/render/text';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (500):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "Internal Server Error",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Content Tagging
List all tags used by contents
List contexts available for contents
Get tags for a specific content
Assign tag(s) to content
Remove tag(s) from content
Bulk assign tags to multiple contents
Endpoints
POST livewire/update
Example request:
curl --request POST \
"http://localhost:8000/livewire/update" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/livewire/update"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "POST",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/livewire/update';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
GET livewire/livewire.js
Example request:
curl --request GET \
--get "http://localhost:8000/livewire/livewire.js" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/livewire/livewire.js"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/livewire/livewire.js';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
Show headers
content-type: application/javascript; charset=utf-8
expires: Wed, 03 Nov 2027 00:49:04 GMT
cache-control: max-age=31536000, public
accept-ranges: bytes
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
GET livewire/livewire.min.js.map
Example request:
curl --request GET \
--get "http://localhost:8000/livewire/livewire.min.js.map" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/livewire/livewire.min.js.map"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/livewire/livewire.min.js.map';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
Show headers
content-type: application/javascript; charset=utf-8
expires: Wed, 03 Nov 2027 00:49:05 GMT
cache-control: max-age=31536000, public
accept-ranges: bytes
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
POST livewire/upload-file
Example request:
curl --request POST \
"http://localhost:8000/livewire/upload-file" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/livewire/upload-file"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "POST",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/livewire/upload-file';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
GET livewire/preview-file/{filename}
Example request:
curl --request GET \
--get "http://localhost:8000/livewire/preview-file/architecto" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/livewire/preview-file/architecto"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/livewire/preview-file/architecto';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
set-cookie: XSRF-TOKEN=eyJpdiI6IkRJVnNXcGxnRDZrbk50YkNLNkdvelE9PSIsInZhbHVlIjoiSVlKWGFXWk0zc3VrU3k3SWNFUHZIMGFtVzJZTHlXR3BTQ0hZa0R3ek9oczZuakI5VldqaXJSc0dFYTcwNTlmL2ZsY3ZLT3o1ME02R3VWRHh5a0lBUFNVTzJTa083UVVqWGdYTGQ1RmtDSTFLV2dZZzdXN3pPUC9OT3BTMytqK08iLCJtYWMiOiIxNDU3MWRkNzdhZDhkNzczYTc4MGJlZGI2NDJjZTk4OTVmZjg3YTY0ZTE2ZDc0MjQ0ZTI3MWRlMGE1ODZhZTUyIiwidGFnIjoiIn0%3D; expires=Tue, 03 Nov 2026 02:49:05 GMT; Max-Age=7200; path=/; samesite=lax; laravel-session=eyJpdiI6Ijg2SkJrUWpzR3UxeUtRR1hNbXVkQXc9PSIsInZhbHVlIjoiU054aTRkNmVHbFhoWWhrZGJwcU5NM05qTCtESytKNWFLL0ZXOW5XVGViVnNlYzJYYTRuUmtteTU4OWk4N1lyY3MyRkZMdFVleGVJRmZRR1RFR3hsUEo0Y2pNL0FjNkZlVFcxbGVLZklpb1I4ZE5yeUhib21maDZVRXdJUmdSZXIiLCJtYWMiOiJlYjVjMjZkZTVkOWEwNDg3NjFkOGQ4ZGRmYWRlNjEwMjliYzVjYzA2NGI1MjA5NzBlZTUyOGQwNDJiZjZkY2Y3IiwidGFnIjoiIn0%3D; expires=Tue, 03 Nov 2026 02:49:05 GMT; Max-Age=7200; path=/; httponly; samesite=lax
{
"success": false,
"message": "Unauthorized",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
GET prometheus
Example request:
curl --request GET \
--get "http://localhost:8000/prometheus" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/prometheus"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/prometheus';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
Show headers
content-type: text/plain; version=0.0.4; charset=utf-8
cache-control: no-cache, private
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
GET v1/ads/{id}/history
Example request:
curl --request GET \
--get "http://localhost:8000/v1/ads/58C6f7nnFCJ9M6rjyc6rTKMzn6/history" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"per_page\": 1,
\"page\": 22
}"
const url = new URL(
"http://localhost:8000/v1/ads/58C6f7nnFCJ9M6rjyc6rTKMzn6/history"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"per_page": 1,
"page": 22
};
fetch(url, {
method: "GET",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/ads/58C6f7nnFCJ9M6rjyc6rTKMzn6/history';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'per_page' => 1,
'page' => 22,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "Full authentication required. Anonymous access not allowed for this endpoint.",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
GET v1/ads/{id}/history/{historyId}
Example request:
curl --request GET \
--get "http://localhost:8000/v1/ads/58C6f7nnFCJ9M6rjyc6rTKMzn6/history/58C6f7nnFCJ9M6rjyc6rTKMzn6" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/ads/58C6f7nnFCJ9M6rjyc6rTKMzn6/history/58C6f7nnFCJ9M6rjyc6rTKMzn6"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/ads/58C6f7nnFCJ9M6rjyc6rTKMzn6/history/58C6f7nnFCJ9M6rjyc6rTKMzn6';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "Full authentication required. Anonymous access not allowed for this endpoint.",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
POST v1/ads/{id}/restore/{historyId}
Example request:
curl --request POST \
"http://localhost:8000/v1/ads/58C6f7nnFCJ9M6rjyc6rTKMzn6/restore/58C6f7nnFCJ9M6rjyc6rTKMzn6" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/ads/58C6f7nnFCJ9M6rjyc6rTKMzn6/restore/58C6f7nnFCJ9M6rjyc6rTKMzn6"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "POST",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/ads/58C6f7nnFCJ9M6rjyc6rTKMzn6/restore/58C6f7nnFCJ9M6rjyc6rTKMzn6';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
GET v1/certificate-definitions
Example request:
curl --request GET \
--get "http://localhost:8000/v1/certificate-definitions" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"per_page\": 1,
\"page\": 22,
\"certifiable_type\": \"architecto\",
\"certifiable_id\": \"architecto\",
\"is_active\": \"architecto\"
}"
const url = new URL(
"http://localhost:8000/v1/certificate-definitions"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"per_page": 1,
"page": 22,
"certifiable_type": "architecto",
"certifiable_id": "architecto",
"is_active": "architecto"
};
fetch(url, {
method: "GET",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/certificate-definitions';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'per_page' => 1,
'page' => 22,
'certifiable_type' => 'architecto',
'certifiable_id' => 'architecto',
'is_active' => 'architecto',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (400):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "A valid Tenant context is required for this request. Please provide a valid X-Tenant-ID header.",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
POST v1/certificate-definitions
Example request:
curl --request POST \
"http://localhost:8000/v1/certificate-definitions" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/certificate-definitions"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "POST",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/certificate-definitions';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
GET v1/certificate-definitions/entity/{type}/{id}
Example request:
curl --request GET \
--get "http://localhost:8000/v1/certificate-definitions/entity/architecto/architecto" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/certificate-definitions/entity/architecto/architecto"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/certificate-definitions/entity/architecto/architecto';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (400):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "A valid Tenant context is required for this request. Please provide a valid X-Tenant-ID header.",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
GET v1/certificate-definitions/{id}
Example request:
curl --request GET \
--get "http://localhost:8000/v1/certificate-definitions/architecto" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/certificate-definitions/architecto"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/certificate-definitions/architecto';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (400):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "A valid Tenant context is required for this request. Please provide a valid X-Tenant-ID header.",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
PUT v1/certificate-definitions/{id}
Example request:
curl --request PUT \
"http://localhost:8000/v1/certificate-definitions/architecto" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/certificate-definitions/architecto"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "PUT",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/certificate-definitions/architecto';
$response = $client->put(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
DELETE v1/certificate-definitions/{id}
Example request:
curl --request DELETE \
"http://localhost:8000/v1/certificate-definitions/architecto" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/certificate-definitions/architecto"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "DELETE",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/certificate-definitions/architecto';
$response = $client->delete(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Verify certificate authenticity (public endpoint)
Example request:
curl --request GET \
--get "http://localhost:8000/v1/certificates/verify/architecto" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/certificates/verify/architecto"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/certificates/verify/architecto';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (500):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "Internal Server Error",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Get current user's certificates
Example request:
curl --request GET \
--get "http://localhost:8000/v1/certificates/my" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/certificates/my"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/certificates/my';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (400):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "A valid Tenant context is required for this request. Please provide a valid X-Tenant-ID header.",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Issue a participation certificate for an enrollment.
Example request:
curl --request POST \
"http://localhost:8000/v1/certificates/enrollments/architecto/issue" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"signed_by\": \"bngzmiyvdljnikhwaykcmyuwpw\",
\"signed_by_name\": \"l\"
}"
const url = new URL(
"http://localhost:8000/v1/certificates/enrollments/architecto/issue"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"signed_by": "bngzmiyvdljnikhwaykcmyuwpw",
"signed_by_name": "l"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/certificates/enrollments/architecto/issue';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'signed_by' => 'bngzmiyvdljnikhwaykcmyuwpw',
'signed_by_name' => 'l',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Get certificate by number
Example request:
curl --request GET \
--get "http://localhost:8000/v1/certificates/number/architecto" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/certificates/number/architecto"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/certificates/number/architecto';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (400):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "A valid Tenant context is required for this request. Please provide a valid X-Tenant-ID header.",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Get certificate by ID
Example request:
curl --request GET \
--get "http://localhost:8000/v1/certificates/architecto" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/certificates/architecto"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/certificates/architecto';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (400):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "A valid Tenant context is required for this request. Please provide a valid X-Tenant-ID header.",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Download certificate PDF
Example request:
curl --request GET \
--get "http://localhost:8000/v1/certificates/architecto/download" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/certificates/architecto/download"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/certificates/architecto/download';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (400):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "A valid Tenant context is required for this request. Please provide a valid X-Tenant-ID header.",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Manually issue a certificate (admin)
Example request:
curl --request POST \
"http://localhost:8000/v1/certificates/issue" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/certificates/issue"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "POST",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/certificates/issue';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Revoke a certificate (admin). Its PDF is deleted: a revoked certificate has none.
Example request:
curl --request POST \
"http://localhost:8000/v1/certificates/architecto/revoke" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"reason\": \"b\"
}"
const url = new URL(
"http://localhost:8000/v1/certificates/architecto/revoke"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"reason": "b"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/certificates/architecto/revoke';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'reason' => 'b',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Regenerate certificate PDF (admin). A revoked certificate answers 422.
Example request:
curl --request POST \
"http://localhost:8000/v1/certificates/architecto/regenerate-pdf" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/certificates/architecto/regenerate-pdf"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "POST",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/certificates/architecto/regenerate-pdf';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Re-certify an expired certificate (admin)
Example request:
curl --request POST \
"http://localhost:8000/v1/certificates/architecto/recertify" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
const url = new URL(
"http://localhost:8000/v1/certificates/architecto/recertify"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "POST",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/certificates/architecto/recertify';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Handle password authentication.
Example request:
curl --request POST \
"http://localhost:8000/dashboard/auth" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"password\": \"|]|{+-\"
}"
const url = new URL(
"http://localhost:8000/dashboard/auth"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"password": "|]|{+-"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/dashboard/auth';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'password' => '|]|{+-',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Logout from dashboard.
Example request:
curl --request POST \
"http://localhost:8000/dashboard/logout" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/dashboard/logout"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "POST",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/dashboard/logout';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
List the packages of the caller's tenant
Learners and guests see published packages; package staff also see drafts and archived packages.
Example request:
curl --request GET \
--get "http://localhost:8000/v1/packages?per_page=20&page=1&status=published&type=quiz_path&is_public=1&search=introduction&created_at_gte=2024-01-01&created_at_lte=2024-12-31&tags=level%3Abeginner%2Ctopic%3Amath&tag_mode=and&sort=-created_at" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/packages"
);
const params = {
"per_page": "20",
"page": "1",
"status": "published",
"type": "quiz_path",
"is_public": "1",
"search": "introduction",
"created_at_gte": "2024-01-01",
"created_at_lte": "2024-12-31",
"tags": "level:beginner,topic:math",
"tag_mode": "and",
"sort": "-created_at",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/packages';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'query' => [
'per_page' => '20',
'page' => '1',
'status' => 'published',
'type' => 'quiz_path',
'is_public' => '1',
'search' => 'introduction',
'created_at_gte' => '2024-01-01',
'created_at_lte' => '2024-12-31',
'tags' => 'level:beginner,topic:math',
'tag_mode' => 'and',
'sort' => '-created_at',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": true,
"message": "Packages retrieved successfully",
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00",
"pagination": {
"current_page": 1,
"per_page": 20,
"total": 0,
"last_page": 1
}
},
"data": []
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Get a specific package
Example request:
curl --request GET \
--get "http://localhost:8000/v1/packages/architecto" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/packages/architecto"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/packages/architecto';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (500):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "Internal Server Error",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Get a package by slug
Example request:
curl --request GET \
--get "http://localhost:8000/v1/packages/slug/architecto" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/packages/slug/architecto"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/packages/slug/architecto';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (404):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "Package with slug architecto not found",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Get package with its activities
data.activities lists the activities in order; quiz activities also
name their quiz and pinned version.
Example request:
curl --request GET \
--get "http://localhost:8000/v1/packages/architecto/with-activities" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/packages/architecto/with-activities"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/packages/architecto/with-activities';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "Authentication required. Please provide a valid access token.",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Get activity content
Example request:
curl --request GET \
--get "http://localhost:8000/v1/packages/activities/architecto/content" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/packages/activities/architecto/content"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/packages/activities/architecto/content';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "Authentication required. Please provide a valid access token.",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Create a new package
Example request:
curl --request POST \
"http://localhost:8000/v1/packages" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/packages"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "POST",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/packages';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Update a package
Example request:
curl --request PUT \
"http://localhost:8000/v1/packages/architecto" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/packages/architecto"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "PUT",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/packages/architecto';
$response = $client->put(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Delete a package
Example request:
curl --request DELETE \
"http://localhost:8000/v1/packages/architecto" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/packages/architecto"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "DELETE",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/packages/architecto';
$response = $client->delete(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Publish a package
Example request:
curl --request POST \
"http://localhost:8000/v1/packages/architecto/publish" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/packages/architecto/publish"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "POST",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/packages/architecto/publish';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Archive a package
Example request:
curl --request POST \
"http://localhost:8000/v1/packages/architecto/archive" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/packages/architecto/archive"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "POST",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/packages/architecto/archive';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Add activity to package
The activity is appended after the package's last activity.
unlock_rules.prerequisite_activity_ids names activities of the same
package the activity requires, unlock_rules.required_score_percentage
the score each of them needs.
Example request:
curl --request POST \
"http://localhost:8000/v1/packages/architecto/activities" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/packages/architecto/activities"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "POST",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/packages/architecto/activities';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Update activity
Prerequisites in unlock_rules must be other activities of the same
package and must not require the activity in turn; unlock_rules: null
removes all unlock rules.
Example request:
curl --request PUT \
"http://localhost:8000/v1/packages/activities/architecto" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/packages/activities/architecto"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "PUT",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/packages/activities/architecto';
$response = $client->put(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Delete activity
Refused with 422 while navigation rules still use the activity:
errors.packages lists the slugs of the packages whose rules use it.
Activities requiring it lose it from their prerequisites.
Example request:
curl --request DELETE \
"http://localhost:8000/v1/packages/activities/architecto" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/packages/activities/architecto"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "DELETE",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/packages/activities/architecto';
$response = $client->delete(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Reorder a package's activities
activity_ids lists every activity of the package exactly once, in the
new order. Returns the package with its activities, as with-activities.
Example request:
curl --request POST \
"http://localhost:8000/v1/packages/architecto/activities/reorder" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/packages/architecto/activities/reorder"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "POST",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/packages/architecto/activities/reorder';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Preview a quiz path's navigation
What a learner would be suggested with the given results, before the
navigation is saved. The activities in results count as completed
with these results; last_activity_id names the test just taken.
Navigation errors are those of saving it. Each suggestion names its
stage (1: a rule about the test just taken, 2: a rule about an earlier
test, 3: the fallback order) and rule_index; locked_activity_ids
lists the tests a learner would not be sent to yet.
Get or create enrollment for current user (implicit enrollment)
Example request:
curl --request GET \
--get "http://localhost:8000/v1/enrollments/packages/architecto" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/enrollments/packages/architecto"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/enrollments/packages/architecto';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "Full authentication required. Anonymous access not allowed for this endpoint.",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Get current user's enrollments (My Packages)
Example request:
curl --request GET \
--get "http://localhost:8000/v1/enrollments/my" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"status\": \"b\",
\"per_page\": 22,
\"page\": 67
}"
const url = new URL(
"http://localhost:8000/v1/enrollments/my"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"status": "b",
"per_page": 22,
"page": 67
};
fetch(url, {
method: "GET",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/enrollments/my';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'status' => 'b',
'per_page' => 22,
'page' => 67,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "Full authentication required. Anonymous access not allowed for this endpoint.",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Get one of the current user's enrollments
Example request:
curl --request GET \
--get "http://localhost:8000/v1/enrollments/architecto" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/enrollments/architecto"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/enrollments/architecto';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "Full authentication required. Anonymous access not allowed for this endpoint.",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Get package progress for an enrollment
Example request:
curl --request GET \
--get "http://localhost:8000/v1/enrollments/architecto/progress" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/enrollments/architecto/progress"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/enrollments/architecto/progress';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "Full authentication required. Anonymous access not allowed for this endpoint.",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Get next activity for an enrollment
Example request:
curl --request GET \
--get "http://localhost:8000/v1/enrollments/architecto/next-activity" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/enrollments/architecto/next-activity"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/enrollments/architecto/next-activity';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "Full authentication required. Anonymous access not allowed for this endpoint.",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Start an activity
Example request:
curl --request POST \
"http://localhost:8000/v1/enrollments/architecto/activities/architecto/start" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/enrollments/architecto/activities/architecto/start"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "POST",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/enrollments/architecto/activities/architecto/start';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Complete an activity
Completion and score come from the linked item: a fully graded attempt on the quiz version, or completed content. Responds with 422 while the item is not completed.
Example request:
curl --request POST \
"http://localhost:8000/v1/enrollments/architecto/activities/architecto/complete" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/enrollments/architecto/activities/architecto/complete"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "POST",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/enrollments/architecto/activities/architecto/complete';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Get enrollments for a specific package (admin)
Example request:
curl --request GET \
--get "http://localhost:8000/v1/enrollments/packages/architecto/list" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"per_page\": 1,
\"page\": 22
}"
const url = new URL(
"http://localhost:8000/v1/enrollments/packages/architecto/list"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"per_page": 1,
"page": 22
};
fetch(url, {
method: "GET",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/enrollments/packages/architecto/list';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'per_page' => 1,
'page' => 22,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "Full authentication required. Anonymous access not allowed for this endpoint.",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Suspend enrollment (admin)
Example request:
curl --request POST \
"http://localhost:8000/v1/enrollments/architecto/suspend" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/enrollments/architecto/suspend"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "POST",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/enrollments/architecto/suspend';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Reactivate enrollment (admin)
Example request:
curl --request POST \
"http://localhost:8000/v1/enrollments/architecto/reactivate" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/enrollments/architecto/reactivate"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "POST",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/enrollments/architecto/reactivate';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
GET v1/quizzes/scheduler-drivers
Example request:
curl --request GET \
--get "http://localhost:8000/v1/quizzes/scheduler-drivers" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/quizzes/scheduler-drivers"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/quizzes/scheduler-drivers';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "Full authentication required. Anonymous access not allowed for this endpoint.",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
The title languages, subjects and difficulties the quiz list can be filtered by, as stored; base subjects and difficulty levels with their German and English labels.
Example request:
curl --request GET \
--get "http://localhost:8000/v1/quizzes/facets" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/quizzes/facets"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/quizzes/facets';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "Full authentication required. Anonymous access not allowed for this endpoint.",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
The complete version for authoring: every slot with all of its options and their question snapshots, answer keys included. Only the owning tenant's quiz staff may read it.
Example request:
curl --request GET \
--get "http://localhost:8000/v1/quizzes/versions/58C6f7nnFCJ9M6rjyc6rTKMzn6/structure" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/quizzes/versions/58C6f7nnFCJ9M6rjyc6rTKMzn6/structure"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/quizzes/versions/58C6f7nnFCJ9M6rjyc6rTKMzn6/structure';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "Full authentication required. Anonymous access not allowed for this endpoint.",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
GET v1/quizzes/slot-options/{option_id}
Example request:
curl --request GET \
--get "http://localhost:8000/v1/quizzes/slot-options/58C6f7nnFCJ9M6rjyc6rTKMzn6" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/quizzes/slot-options/58C6f7nnFCJ9M6rjyc6rTKMzn6"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/quizzes/slot-options/58C6f7nnFCJ9M6rjyc6rTKMzn6';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "Full authentication required. Anonymous access not allowed for this endpoint.",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
GET v1/quizzes
Example request:
curl --request GET \
--get "http://localhost:8000/v1/quizzes?per_page=20&page=1&is_public=1&search=math&created_at_gte=2024-01-01&created_at_lte=2024-12-31&tags=difficulty%3Ahard%2Ctopic%3Amath&tag_mode=and&languages=de%2Cde-DE&subjects=chemistry%2CRobotik&difficulties=easy&status=draft%2Cnone&published=1&has_versions=1&has_questions=1&include_summary=1&sort=-versions_count%2Ctitle.de" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/quizzes"
);
const params = {
"per_page": "20",
"page": "1",
"is_public": "1",
"search": "math",
"created_at_gte": "2024-01-01",
"created_at_lte": "2024-12-31",
"tags": "difficulty:hard,topic:math",
"tag_mode": "and",
"languages": "de,de-DE",
"subjects": "chemistry,Robotik",
"difficulties": "easy",
"status": "draft,none",
"published": "1",
"has_versions": "1",
"has_questions": "1",
"include_summary": "1",
"sort": "-versions_count,title.de",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/quizzes';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'query' => [
'per_page' => '20',
'page' => '1',
'is_public' => '1',
'search' => 'math',
'created_at_gte' => '2024-01-01',
'created_at_lte' => '2024-12-31',
'tags' => 'difficulty:hard,topic:math',
'tag_mode' => 'and',
'languages' => 'de,de-DE',
'subjects' => 'chemistry,Robotik',
'difficulties' => 'easy',
'status' => 'draft,none',
'published' => '1',
'has_versions' => '1',
'has_questions' => '1',
'include_summary' => '1',
'sort' => '-versions_count,title.de',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "Authentication required. Please provide a valid access token.",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
GET v1/quizzes/{id}
Example request:
curl --request GET \
--get "http://localhost:8000/v1/quizzes/58C6f7nnFCJ9M6rjyc6rTKMzn6" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/quizzes/58C6f7nnFCJ9M6rjyc6rTKMzn6"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/quizzes/58C6f7nnFCJ9M6rjyc6rTKMzn6';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "Authentication required. Please provide a valid access token.",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
GET v1/quizzes/{slug}
Example request:
curl --request GET \
--get "http://localhost:8000/v1/quizzes/architecto" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/quizzes/architecto"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/quizzes/architecto';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "Authentication required. Please provide a valid access token.",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
GET v1/quizzes/{quiz_id}/versions
Example request:
curl --request GET \
--get "http://localhost:8000/v1/quizzes/58C6f7nnFCJ9M6rjyc6rTKMzn6/versions" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/quizzes/58C6f7nnFCJ9M6rjyc6rTKMzn6/versions"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/quizzes/58C6f7nnFCJ9M6rjyc6rTKMzn6/versions';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "Authentication required. Please provide a valid access token.",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
GET v1/quizzes/{quiz_id}/versions/latest-published
Example request:
curl --request GET \
--get "http://localhost:8000/v1/quizzes/58C6f7nnFCJ9M6rjyc6rTKMzn6/versions/latest-published" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/quizzes/58C6f7nnFCJ9M6rjyc6rTKMzn6/versions/latest-published"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/quizzes/58C6f7nnFCJ9M6rjyc6rTKMzn6/versions/latest-published';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "Authentication required. Please provide a valid access token.",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
GET v1/quizzes/versions/{version_id}
Example request:
curl --request GET \
--get "http://localhost:8000/v1/quizzes/versions/58C6f7nnFCJ9M6rjyc6rTKMzn6" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/quizzes/versions/58C6f7nnFCJ9M6rjyc6rTKMzn6"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/quizzes/versions/58C6f7nnFCJ9M6rjyc6rTKMzn6';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "Authentication required. Please provide a valid access token.",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
The version as a learner sees it before and around an attempt: sections, information pages and question slots without their question options.
question_count is the number of questions an attempt is given. The
questions themselves are delivered by the attempt.
Example request:
curl --request GET \
--get "http://localhost:8000/v1/quizzes/versions/58C6f7nnFCJ9M6rjyc6rTKMzn6/outline" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/quizzes/versions/58C6f7nnFCJ9M6rjyc6rTKMzn6/outline"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/quizzes/versions/58C6f7nnFCJ9M6rjyc6rTKMzn6/outline';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "Authentication required. Please provide a valid access token.",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
List a version's feedback bands.
With ?score_percent=, the list is narrowed to the single band that
covers that result, so a client never has to reimplement the range rule.
Example request:
curl --request GET \
--get "http://localhost:8000/v1/quizzes/versions/58C6f7nnFCJ9M6rjyc6rTKMzn6/feedback-bands?score_percent=17" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"score_percent\": 1
}"
const url = new URL(
"http://localhost:8000/v1/quizzes/versions/58C6f7nnFCJ9M6rjyc6rTKMzn6/feedback-bands"
);
const params = {
"score_percent": "17",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"score_percent": 1
};
fetch(url, {
method: "GET",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/quizzes/versions/58C6f7nnFCJ9M6rjyc6rTKMzn6/feedback-bands';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'query' => [
'score_percent' => '17',
],
'json' => [
'score_percent' => 1,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"message": "Feedback band retrieved successfully",
"data": [
{
"id": "01k8a2b3c4d5e6f7g8h9j0k1m2",
"quiz_version_id": "01k8a2b3c4d5e6f7g8h9j0k1m3",
"min_percent": 0,
"max_percent": 50,
"content": [
{
"type": "paragraph",
"text": {
"de": "Hier lohnt sich eine Wiederholung."
}
}
],
"summary": {
"de": "Da geht noch was.",
"en": "There is room to grow."
},
"sort_order": 0,
"metadata": null,
"created_at": "2026-10-23T09:00:00+00:00"
}
],
"meta": {
"timestamp": "2026-10-23T09:00:00+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Response
Response Fields
summary
object|null
One plain-text sentence per language code about a result in the band's range, or null when the author wrote none.
GET v1/quizzes/sections/{section_id}
Example request:
curl --request GET \
--get "http://localhost:8000/v1/quizzes/sections/58C6f7nnFCJ9M6rjyc6rTKMzn6" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/quizzes/sections/58C6f7nnFCJ9M6rjyc6rTKMzn6"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/quizzes/sections/58C6f7nnFCJ9M6rjyc6rTKMzn6';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "Authentication required. Please provide a valid access token.",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
GET v1/quizzes/slots/{slot_id}
Example request:
curl --request GET \
--get "http://localhost:8000/v1/quizzes/slots/58C6f7nnFCJ9M6rjyc6rTKMzn6" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/quizzes/slots/58C6f7nnFCJ9M6rjyc6rTKMzn6"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/quizzes/slots/58C6f7nnFCJ9M6rjyc6rTKMzn6';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "Authentication required. Please provide a valid access token.",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
POST v1/quizzes
Example request:
curl --request POST \
"http://localhost:8000/v1/quizzes" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/quizzes"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "POST",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/quizzes';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
PUT v1/quizzes/{id}
Example request:
curl --request PUT \
"http://localhost:8000/v1/quizzes/58C6f7nnFCJ9M6rjyc6rTKMzn6" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/quizzes/58C6f7nnFCJ9M6rjyc6rTKMzn6"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "PUT",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/quizzes/58C6f7nnFCJ9M6rjyc6rTKMzn6';
$response = $client->put(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
DELETE v1/quizzes/{id}
Example request:
curl --request DELETE \
"http://localhost:8000/v1/quizzes/58C6f7nnFCJ9M6rjyc6rTKMzn6" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/quizzes/58C6f7nnFCJ9M6rjyc6rTKMzn6"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "DELETE",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/quizzes/58C6f7nnFCJ9M6rjyc6rTKMzn6';
$response = $client->delete(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
PUT v1/quizzes/{slug}
Example request:
curl --request PUT \
"http://localhost:8000/v1/quizzes/architecto" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/quizzes/architecto"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "PUT",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/quizzes/architecto';
$response = $client->put(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
DELETE v1/quizzes/{slug}
Example request:
curl --request DELETE \
"http://localhost:8000/v1/quizzes/architecto" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/quizzes/architecto"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "DELETE",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/quizzes/architecto';
$response = $client->delete(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
POST v1/quizzes/{quiz_id}/versions
Example request:
curl --request POST \
"http://localhost:8000/v1/quizzes/58C6f7nnFCJ9M6rjyc6rTKMzn6/versions" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/quizzes/58C6f7nnFCJ9M6rjyc6rTKMzn6/versions"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "POST",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/quizzes/58C6f7nnFCJ9M6rjyc6rTKMzn6/versions';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
PUT v1/quizzes/versions/{version_id}
Example request:
curl --request PUT \
"http://localhost:8000/v1/quizzes/versions/58C6f7nnFCJ9M6rjyc6rTKMzn6" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/quizzes/versions/58C6f7nnFCJ9M6rjyc6rTKMzn6"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "PUT",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/quizzes/versions/58C6f7nnFCJ9M6rjyc6rTKMzn6';
$response = $client->put(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Publish a draft. The version comes back with `warnings`: problems that did not keep it from being published (survey slot candidates that are not active).
Example request:
curl --request POST \
"http://localhost:8000/v1/quizzes/versions/58C6f7nnFCJ9M6rjyc6rTKMzn6/publish" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/quizzes/versions/58C6f7nnFCJ9M6rjyc6rTKMzn6/publish"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "POST",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/quizzes/versions/58C6f7nnFCJ9M6rjyc6rTKMzn6/publish';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
POST v1/quizzes/versions/{version_id}/archive
Example request:
curl --request POST \
"http://localhost:8000/v1/quizzes/versions/58C6f7nnFCJ9M6rjyc6rTKMzn6/archive" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/quizzes/versions/58C6f7nnFCJ9M6rjyc6rTKMzn6/archive"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "POST",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/quizzes/versions/58C6f7nnFCJ9M6rjyc6rTKMzn6/archive';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
POST v1/quizzes/versions/{version_id}/duplicate
Example request:
curl --request POST \
"http://localhost:8000/v1/quizzes/versions/58C6f7nnFCJ9M6rjyc6rTKMzn6/duplicate" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/quizzes/versions/58C6f7nnFCJ9M6rjyc6rTKMzn6/duplicate"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "POST",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/quizzes/versions/58C6f7nnFCJ9M6rjyc6rTKMzn6/duplicate';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
DELETE v1/quizzes/versions/{version_id}
Example request:
curl --request DELETE \
"http://localhost:8000/v1/quizzes/versions/58C6f7nnFCJ9M6rjyc6rTKMzn6" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/quizzes/versions/58C6f7nnFCJ9M6rjyc6rTKMzn6"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "DELETE",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/quizzes/versions/58C6f7nnFCJ9M6rjyc6rTKMzn6';
$response = $client->delete(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Compare two quiz versions.
Example request:
curl --request POST \
"http://localhost:8000/v1/quizzes/versions/compare" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"old_version_id\": \"architecto\",
\"new_version_id\": \"architecto\"
}"
const url = new URL(
"http://localhost:8000/v1/quizzes/versions/compare"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"old_version_id": "architecto",
"new_version_id": "architecto"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/quizzes/versions/compare';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'old_version_id' => 'architecto',
'new_version_id' => 'architecto',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
POST v1/quizzes/versions/{version_id}/sections
Example request:
curl --request POST \
"http://localhost:8000/v1/quizzes/versions/58C6f7nnFCJ9M6rjyc6rTKMzn6/sections" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/quizzes/versions/58C6f7nnFCJ9M6rjyc6rTKMzn6/sections"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "POST",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/quizzes/versions/58C6f7nnFCJ9M6rjyc6rTKMzn6/sections';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
PUT v1/quizzes/sections/{section_id}
Example request:
curl --request PUT \
"http://localhost:8000/v1/quizzes/sections/58C6f7nnFCJ9M6rjyc6rTKMzn6" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/quizzes/sections/58C6f7nnFCJ9M6rjyc6rTKMzn6"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "PUT",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/quizzes/sections/58C6f7nnFCJ9M6rjyc6rTKMzn6';
$response = $client->put(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
DELETE v1/quizzes/sections/{section_id}
Example request:
curl --request DELETE \
"http://localhost:8000/v1/quizzes/sections/58C6f7nnFCJ9M6rjyc6rTKMzn6" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/quizzes/sections/58C6f7nnFCJ9M6rjyc6rTKMzn6"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "DELETE",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/quizzes/sections/58C6f7nnFCJ9M6rjyc6rTKMzn6';
$response = $client->delete(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
POST v1/quizzes/versions/{version_id}/sections/reorder
Example request:
curl --request POST \
"http://localhost:8000/v1/quizzes/versions/58C6f7nnFCJ9M6rjyc6rTKMzn6/sections/reorder" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"section_ids\": [
\"bngzmiyvdljnikhwaykcmyuwpw\"
]
}"
const url = new URL(
"http://localhost:8000/v1/quizzes/versions/58C6f7nnFCJ9M6rjyc6rTKMzn6/sections/reorder"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"section_ids": [
"bngzmiyvdljnikhwaykcmyuwpw"
]
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/quizzes/versions/58C6f7nnFCJ9M6rjyc6rTKMzn6/sections/reorder';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'section_ids' => [
'bngzmiyvdljnikhwaykcmyuwpw',
],
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Replace the version's whole band set.
Example request:
curl --request PUT \
"http://localhost:8000/v1/quizzes/versions/58C6f7nnFCJ9M6rjyc6rTKMzn6/feedback-bands" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"bands\": [
{
\"min_percent\": 0,
\"max_percent\": 50,
\"content\": [
[]
],
\"summary\": [],
\"sort_order\": 16,
\"metadata\": []
}
]
}"
const url = new URL(
"http://localhost:8000/v1/quizzes/versions/58C6f7nnFCJ9M6rjyc6rTKMzn6/feedback-bands"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"bands": [
{
"min_percent": 0,
"max_percent": 50,
"content": [
[]
],
"summary": [],
"sort_order": 16,
"metadata": []
}
]
};
fetch(url, {
method: "PUT",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/quizzes/versions/58C6f7nnFCJ9M6rjyc6rTKMzn6/feedback-bands';
$response = $client->put(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'bands' => [
[
'min_percent' => 0.0,
'max_percent' => 50.0,
'content' => [
[],
],
'summary' => [],
'sort_order' => 16,
'metadata' => [],
],
],
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
POST v1/quizzes/sections/{section_id}/slots
Example request:
curl --request POST \
"http://localhost:8000/v1/quizzes/sections/58C6f7nnFCJ9M6rjyc6rTKMzn6/slots" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/quizzes/sections/58C6f7nnFCJ9M6rjyc6rTKMzn6/slots"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "POST",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/quizzes/sections/58C6f7nnFCJ9M6rjyc6rTKMzn6/slots';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
PUT v1/quizzes/slots/{slot_id}
Example request:
curl --request PUT \
"http://localhost:8000/v1/quizzes/slots/58C6f7nnFCJ9M6rjyc6rTKMzn6" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/quizzes/slots/58C6f7nnFCJ9M6rjyc6rTKMzn6"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "PUT",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/quizzes/slots/58C6f7nnFCJ9M6rjyc6rTKMzn6';
$response = $client->put(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
DELETE v1/quizzes/slots/{slot_id}
Example request:
curl --request DELETE \
"http://localhost:8000/v1/quizzes/slots/58C6f7nnFCJ9M6rjyc6rTKMzn6" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/quizzes/slots/58C6f7nnFCJ9M6rjyc6rTKMzn6"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "DELETE",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/quizzes/slots/58C6f7nnFCJ9M6rjyc6rTKMzn6';
$response = $client->delete(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
POST v1/quizzes/sections/{section_id}/slots/reorder
Example request:
curl --request POST \
"http://localhost:8000/v1/quizzes/sections/58C6f7nnFCJ9M6rjyc6rTKMzn6/slots/reorder" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"slot_ids\": [
\"bngzmiyvdljnikhwaykcmyuwpw\"
]
}"
const url = new URL(
"http://localhost:8000/v1/quizzes/sections/58C6f7nnFCJ9M6rjyc6rTKMzn6/slots/reorder"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"slot_ids": [
"bngzmiyvdljnikhwaykcmyuwpw"
]
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/quizzes/sections/58C6f7nnFCJ9M6rjyc6rTKMzn6/slots/reorder';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'slot_ids' => [
'bngzmiyvdljnikhwaykcmyuwpw',
],
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Bulk create slot options for a slot.
Example request:
curl --request POST \
"http://localhost:8000/v1/quizzes/slots/58C6f7nnFCJ9M6rjyc6rTKMzn6/slot-options/bulk" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"options\": [
{
\"original_question_id\": \"b\",
\"points\": 39
}
]
}"
const url = new URL(
"http://localhost:8000/v1/quizzes/slots/58C6f7nnFCJ9M6rjyc6rTKMzn6/slot-options/bulk"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"options": [
{
"original_question_id": "b",
"points": 39
}
]
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/quizzes/slots/58C6f7nnFCJ9M6rjyc6rTKMzn6/slot-options/bulk';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'options' => [
[
'original_question_id' => 'b',
'points' => 39,
],
],
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
POST v1/quizzes/slots/{slot_id}/slot-options
Example request:
curl --request POST \
"http://localhost:8000/v1/quizzes/slots/58C6f7nnFCJ9M6rjyc6rTKMzn6/slot-options" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/quizzes/slots/58C6f7nnFCJ9M6rjyc6rTKMzn6/slot-options"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "POST",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/quizzes/slots/58C6f7nnFCJ9M6rjyc6rTKMzn6/slot-options';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
PUT v1/quizzes/slot-options/{option_id}
Example request:
curl --request PUT \
"http://localhost:8000/v1/quizzes/slot-options/58C6f7nnFCJ9M6rjyc6rTKMzn6" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/quizzes/slot-options/58C6f7nnFCJ9M6rjyc6rTKMzn6"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "PUT",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/quizzes/slot-options/58C6f7nnFCJ9M6rjyc6rTKMzn6';
$response = $client->put(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
POST v1/quizzes/slot-options/{option_id}/refresh
Example request:
curl --request POST \
"http://localhost:8000/v1/quizzes/slot-options/58C6f7nnFCJ9M6rjyc6rTKMzn6/refresh" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/quizzes/slot-options/58C6f7nnFCJ9M6rjyc6rTKMzn6/refresh"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "POST",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/quizzes/slot-options/58C6f7nnFCJ9M6rjyc6rTKMzn6/refresh';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
DELETE v1/quizzes/slot-options/{option_id}
Example request:
curl --request DELETE \
"http://localhost:8000/v1/quizzes/slot-options/58C6f7nnFCJ9M6rjyc6rTKMzn6" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/quizzes/slot-options/58C6f7nnFCJ9M6rjyc6rTKMzn6"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "DELETE",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/quizzes/slot-options/58C6f7nnFCJ9M6rjyc6rTKMzn6';
$response = $client->delete(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Prometheus scrape endpoint.
Returns metrics in Prometheus text exposition format.
Example request:
curl --request GET \
--get "http://localhost:8000/v1/metrics/prometheus" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/metrics/prometheus"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/metrics/prometheus';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
Show headers
content-type: text/plain; version=0.0.4; charset=utf-8
cache-control: no-cache, private
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
# HELP mintfit_system_php_memory_bytes Current PHP memory usage in bytes
# TYPE mintfit_system_php_memory_bytes gauge
mintfit_system_php_memory_bytes{type="peak"} 82313216
mintfit_system_php_memory_bytes{type="used"} 82313216
# HELP mintfit_system_queue_jobs_pending Number of pending jobs in the queue
# TYPE mintfit_system_queue_jobs_pending gauge
mintfit_system_queue_jobs_pending{queue="default"} 0
mintfit_system_queue_jobs_pending{queue="imports"} 0
mintfit_system_queue_jobs_pending{queue="notifications"} 0
mintfit_system_queue_jobs_pending{queue="pdf"} 0
mintfit_system_queue_jobs_pending{queue="statistics"} 0
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
JSON metrics endpoint for debugging.
Example request:
curl --request GET \
--get "http://localhost:8000/v1/metrics/json" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/metrics/json"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/metrics/json';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "Full authentication required. Anonymous access not allowed for this endpoint.",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
List all metric definitions.
Example request:
curl --request GET \
--get "http://localhost:8000/v1/metrics/definitions" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/metrics/definitions"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/metrics/definitions';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "Full authentication required. Anonymous access not allowed for this endpoint.",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
List registered providers.
Example request:
curl --request GET \
--get "http://localhost:8000/v1/metrics/providers" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/metrics/providers"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/metrics/providers';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "Full authentication required. Anonymous access not allowed for this endpoint.",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
GET v1/moodle-import
Example request:
curl --request GET \
--get "http://localhost:8000/v1/moodle-import" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/moodle-import"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/moodle-import';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "Full authentication required. Anonymous access not allowed for this endpoint.",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
GET v1/moodle-import/{id}/results
Example request:
curl --request GET \
--get "http://localhost:8000/v1/moodle-import/58C6f7nnFCJ9M6rjyc6rTKMzn6/results" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/moodle-import/58C6f7nnFCJ9M6rjyc6rTKMzn6/results"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/moodle-import/58C6f7nnFCJ9M6rjyc6rTKMzn6/results';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "Full authentication required. Anonymous access not allowed for this endpoint.",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
GET v1/surveys/settings
Example request:
curl --request GET \
--get "http://localhost:8000/v1/surveys/settings" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/surveys/settings"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/surveys/settings';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "Full authentication required. Anonymous access not allowed for this endpoint.",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
PUT v1/surveys/settings
Example request:
curl --request PUT \
"http://localhost:8000/v1/surveys/settings" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/surveys/settings"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "PUT",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/surveys/settings';
$response = $client->put(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
POST v1/surveys/categories
Example request:
curl --request POST \
"http://localhost:8000/v1/surveys/categories" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/surveys/categories"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "POST",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/surveys/categories';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
PUT v1/surveys/categories/{id}
Example request:
curl --request PUT \
"http://localhost:8000/v1/surveys/categories/58C6f7nnFCJ9M6rjyc6rTKMzn6" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/surveys/categories/58C6f7nnFCJ9M6rjyc6rTKMzn6"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "PUT",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/surveys/categories/58C6f7nnFCJ9M6rjyc6rTKMzn6';
$response = $client->put(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
DELETE v1/surveys/categories/{id}
Example request:
curl --request DELETE \
"http://localhost:8000/v1/surveys/categories/58C6f7nnFCJ9M6rjyc6rTKMzn6" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/surveys/categories/58C6f7nnFCJ9M6rjyc6rTKMzn6"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "DELETE",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/surveys/categories/58C6f7nnFCJ9M6rjyc6rTKMzn6';
$response = $client->delete(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
POST v1/surveys/questions
Example request:
curl --request POST \
"http://localhost:8000/v1/surveys/questions" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/surveys/questions"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "POST",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/surveys/questions';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
PUT v1/surveys/questions/{id}
Example request:
curl --request PUT \
"http://localhost:8000/v1/surveys/questions/58C6f7nnFCJ9M6rjyc6rTKMzn6" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/surveys/questions/58C6f7nnFCJ9M6rjyc6rTKMzn6"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "PUT",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/surveys/questions/58C6f7nnFCJ9M6rjyc6rTKMzn6';
$response = $client->put(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
POST v1/surveys/questions/{id}/archive
Example request:
curl --request POST \
"http://localhost:8000/v1/surveys/questions/58C6f7nnFCJ9M6rjyc6rTKMzn6/archive" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/surveys/questions/58C6f7nnFCJ9M6rjyc6rTKMzn6/archive"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "POST",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/surveys/questions/58C6f7nnFCJ9M6rjyc6rTKMzn6/archive';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
POST v1/surveys/questions/{id}/activate
Example request:
curl --request POST \
"http://localhost:8000/v1/surveys/questions/58C6f7nnFCJ9M6rjyc6rTKMzn6/activate" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/surveys/questions/58C6f7nnFCJ9M6rjyc6rTKMzn6/activate"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "POST",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/surveys/questions/58C6f7nnFCJ9M6rjyc6rTKMzn6/activate';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
POST v1/surveys/questions/{id}/copy
Example request:
curl --request POST \
"http://localhost:8000/v1/surveys/questions/58C6f7nnFCJ9M6rjyc6rTKMzn6/copy" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/surveys/questions/58C6f7nnFCJ9M6rjyc6rTKMzn6/copy"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "POST",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/surveys/questions/58C6f7nnFCJ9M6rjyc6rTKMzn6/copy';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
DELETE v1/surveys/questions/{id}
Example request:
curl --request DELETE \
"http://localhost:8000/v1/surveys/questions/58C6f7nnFCJ9M6rjyc6rTKMzn6" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/surveys/questions/58C6f7nnFCJ9M6rjyc6rTKMzn6"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "DELETE",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/surveys/questions/58C6f7nnFCJ9M6rjyc6rTKMzn6';
$response = $client->delete(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
POST v1/surveys/selection-check
Example request:
curl --request POST \
"http://localhost:8000/v1/surveys/selection-check" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"place\": \"architecto\",
\"quiz_id\": \"architecto\",
\"quiz_version_id\": \"architecto\",
\"slot_id\": \"architecto\",
\"package_id\": \"architecto\",
\"refused_category_ids\": [
\"architecto\"
]
}"
const url = new URL(
"http://localhost:8000/v1/surveys/selection-check"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"place": "architecto",
"quiz_id": "architecto",
"quiz_version_id": "architecto",
"slot_id": "architecto",
"package_id": "architecto",
"refused_category_ids": [
"architecto"
]
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/surveys/selection-check';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'place' => 'architecto',
'quiz_id' => 'architecto',
'quiz_version_id' => 'architecto',
'slot_id' => 'architecto',
'package_id' => 'architecto',
'refused_category_ids' => [
'architecto',
],
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
GET v1/surveys/categories
Example request:
curl --request GET \
--get "http://localhost:8000/v1/surveys/categories" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/surveys/categories"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/surveys/categories';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "Full authentication required. Anonymous access not allowed for this endpoint.",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
GET v1/surveys/questions
Example request:
curl --request GET \
--get "http://localhost:8000/v1/surveys/questions" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"category_id\": \"architecto\",
\"search\": \"n\",
\"per_page\": 7,
\"page\": 66
}"
const url = new URL(
"http://localhost:8000/v1/surveys/questions"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"category_id": "architecto",
"search": "n",
"per_page": 7,
"page": 66
};
fetch(url, {
method: "GET",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/surveys/questions';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'category_id' => 'architecto',
'search' => 'n',
'per_page' => 7,
'page' => 66,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "Full authentication required. Anonymous access not allowed for this endpoint.",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
GET v1/surveys/questions/{id}
Example request:
curl --request GET \
--get "http://localhost:8000/v1/surveys/questions/58C6f7nnFCJ9M6rjyc6rTKMzn6" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/surveys/questions/58C6f7nnFCJ9M6rjyc6rTKMzn6"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/surveys/questions/58C6f7nnFCJ9M6rjyc6rTKMzn6';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "Full authentication required. Anonymous access not allowed for this endpoint.",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
GET v1/surveys/questions/{id}/results
Example request:
curl --request GET \
--get "http://localhost:8000/v1/surveys/questions/58C6f7nnFCJ9M6rjyc6rTKMzn6/results" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"revision\": \"(all\",
\"from\": \"2026-11-03T00:49:05\",
\"to\": \"2026-11-03T00:49:05\",
\"quiz_id\": \"architecto\",
\"package_id\": \"architecto\"
}"
const url = new URL(
"http://localhost:8000/v1/surveys/questions/58C6f7nnFCJ9M6rjyc6rTKMzn6/results"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"revision": "(all",
"from": "2026-11-03T00:49:05",
"to": "2026-11-03T00:49:05",
"quiz_id": "architecto",
"package_id": "architecto"
};
fetch(url, {
method: "GET",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/surveys/questions/58C6f7nnFCJ9M6rjyc6rTKMzn6/results';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'revision' => '(all',
'from' => '2026-11-03T00:49:05',
'to' => '2026-11-03T00:49:05',
'quiz_id' => 'architecto',
'package_id' => 'architecto',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "Full authentication required. Anonymous access not allowed for this endpoint.",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
The raw answers as CSV (UTF-8 with byte order mark, for spreadsheets).
Example request:
curl --request GET \
--get "http://localhost:8000/v1/surveys/export" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"question_ids\": [
\"architecto\"
],
\"from\": \"2026-11-03T00:49:05\",
\"to\": \"2026-11-03T00:49:05\"
}"
const url = new URL(
"http://localhost:8000/v1/surveys/export"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"question_ids": [
"architecto"
],
"from": "2026-11-03T00:49:05",
"to": "2026-11-03T00:49:05"
};
fetch(url, {
method: "GET",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/surveys/export';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'question_ids' => [
'architecto',
],
'from' => '2026-11-03T00:49:05',
'to' => '2026-11-03T00:49:05',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "Full authentication required. Anonymous access not allowed for this endpoint.",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
GET v1/surveys/export/codebook
Example request:
curl --request GET \
--get "http://localhost:8000/v1/surveys/export/codebook" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"question_ids\": [
\"architecto\"
]
}"
const url = new URL(
"http://localhost:8000/v1/surveys/export/codebook"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"question_ids": [
"architecto"
]
};
fetch(url, {
method: "GET",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/surveys/export/codebook';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'question_ids' => [
'architecto',
],
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "Full authentication required. Anonymous access not allowed for this endpoint.",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
GET v1/surveys/questions/options
Example request:
curl --request GET \
--get "http://localhost:8000/v1/surveys/questions/options" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/surveys/questions/options"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/surveys/questions/options';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "Full authentication required. Anonymous access not allowed for this endpoint.",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Prepare a new test start: the card before the test, if any.
Example request:
curl --request POST \
"http://localhost:8000/v1/surveys/preparations" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"quiz_version_id\": \"architecto\",
\"package_id\": \"architecto\",
\"package_activity_id\": \"architecto\"
}"
const url = new URL(
"http://localhost:8000/v1/surveys/preparations"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"quiz_version_id": "architecto",
"package_id": "architecto",
"package_activity_id": "architecto"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/surveys/preparations';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'quiz_version_id' => 'architecto',
'package_id' => 'architecto',
'package_activity_id' => 'architecto',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
The in-test cards of the caller's attempt, by survey slot.
Example request:
curl --request GET \
--get "http://localhost:8000/v1/surveys/attempts/58C6f7nnFCJ9M6rjyc6rTKMzn6/slots" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/surveys/attempts/58C6f7nnFCJ9M6rjyc6rTKMzn6/slots"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/surveys/attempts/58C6f7nnFCJ9M6rjyc6rTKMzn6/slots';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "Authentication required. Please provide a valid access token.",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
The card at a place after a test or in a topic area, or null.
Example request:
curl --request POST \
"http://localhost:8000/v1/surveys/places/before_result|after_result|topic_return|topic_complete" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/surveys/places/before_result|after_result|topic_return|topic_complete"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "POST",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/surveys/places/before_result|after_result|topic_return|topic_complete';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
POST v1/surveys/deliveries/{id}/shown
Example request:
curl --request POST \
"http://localhost:8000/v1/surveys/deliveries/58C6f7nnFCJ9M6rjyc6rTKMzn6/shown" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/surveys/deliveries/58C6f7nnFCJ9M6rjyc6rTKMzn6/shown"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "POST",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/surveys/deliveries/58C6f7nnFCJ9M6rjyc6rTKMzn6/shown';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
POST v1/surveys/deliveries/{id}/response
Example request:
curl --request POST \
"http://localhost:8000/v1/surveys/deliveries/58C6f7nnFCJ9M6rjyc6rTKMzn6/response" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"outcome\": \"architecto\"
}"
const url = new URL(
"http://localhost:8000/v1/surveys/deliveries/58C6f7nnFCJ9M6rjyc6rTKMzn6/response"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"outcome": "architecto"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/surveys/deliveries/58C6f7nnFCJ9M6rjyc6rTKMzn6/response';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'outcome' => 'architecto',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
GET v1/surveys/preferences
Example request:
curl --request GET \
--get "http://localhost:8000/v1/surveys/preferences" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/surveys/preferences"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/surveys/preferences';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "Authentication required. Please provide a valid access token.",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
PUT v1/surveys/preferences/{categoryId}
Example request:
curl --request PUT \
"http://localhost:8000/v1/surveys/preferences/58C6f7nnFCJ9M6rjyc6rTKMzn6" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"refused\": true
}"
const url = new URL(
"http://localhost:8000/v1/surveys/preferences/58C6f7nnFCJ9M6rjyc6rTKMzn6"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"refused": true
};
fetch(url, {
method: "PUT",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/surveys/preferences/58C6f7nnFCJ9M6rjyc6rTKMzn6';
$response = $client->put(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'refused' => true,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
How transfers work in the acting tenant: this instance's label and whether it is production, the tenant, the upload limit, how long archives stay, the archive format and what the caller may do.
Example request:
curl --request GET \
--get "http://localhost:8000/v1/transfer/config" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/transfer/config"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/transfer/config';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "Full authentication required. Anonymous access not allowed for this endpoint.",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Runs of the acting tenant the caller may see (exports with `transfer.export`, imports with `transfer.import`), newest first, with counts per kind and status group in `meta.facets`.
Example request:
curl --request GET \
--get "http://localhost:8000/v1/transfer/runs" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/transfer/runs"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/transfer/runs';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "Full authentication required. Anonymous access not allowed for this endpoint.",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
GET v1/transfer/runs/{run}
Example request:
curl --request GET \
--get "http://localhost:8000/v1/transfer/runs/58C6f7nnFCJ9M6rjyc6rTKMzn6" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/transfer/runs/58C6f7nnFCJ9M6rjyc6rTKMzn6"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/transfer/runs/58C6f7nnFCJ9M6rjyc6rTKMzn6';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "Full authentication required. Anonymous access not allowed for this endpoint.",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Cancel an import that is not being applied; its archive is deleted.
Example request:
curl --request POST \
"http://localhost:8000/v1/transfer/runs/58C6f7nnFCJ9M6rjyc6rTKMzn6/cancel" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/transfer/runs/58C6f7nnFCJ9M6rjyc6rTKMzn6/cancel"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "POST",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/transfer/runs/58C6f7nnFCJ9M6rjyc6rTKMzn6/cancel';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Start the next generation of a failed run: validation again, a new plan after a failed analysis or apply, or the export again.
Example request:
curl --request POST \
"http://localhost:8000/v1/transfer/runs/58C6f7nnFCJ9M6rjyc6rTKMzn6/retry" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/transfer/runs/58C6f7nnFCJ9M6rjyc6rTKMzn6/retry"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "POST",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/transfer/runs/58C6f7nnFCJ9M6rjyc6rTKMzn6/retry';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
The archive of a completed export, while it is kept.
Example request:
curl --request GET \
--get "http://localhost:8000/v1/transfer/runs/58C6f7nnFCJ9M6rjyc6rTKMzn6/archive" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/transfer/runs/58C6f7nnFCJ9M6rjyc6rTKMzn6/archive"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/transfer/runs/58C6f7nnFCJ9M6rjyc6rTKMzn6/archive';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "Full authentication required. Anonymous access not allowed for this endpoint.",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
What an export of the selection would bring, computed now.
Example request:
curl --request POST \
"http://localhost:8000/v1/transfer/exports/preview" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/transfer/exports/preview"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "POST",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/transfer/exports/preview';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Start an export run; its archive is built in the background.
Example request:
curl --request POST \
"http://localhost:8000/v1/transfer/exports" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/transfer/exports"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "POST",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/transfer/exports';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Upload an archive (multipart `file`): it is stored and validated in the background.
Example request:
curl --request POST \
"http://localhost:8000/v1/transfer/imports" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/transfer/imports"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "POST",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/transfer/imports';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Plan a validated import with its options; a changed mode discards the decisions.
Example request:
curl --request POST \
"http://localhost:8000/v1/transfer/runs/58C6f7nnFCJ9M6rjyc6rTKMzn6/plan" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/transfer/runs/58C6f7nnFCJ9M6rjyc6rTKMzn6/plan"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "POST",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/transfer/runs/58C6f7nnFCJ9M6rjyc6rTKMzn6/plan';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Analyze a planned or stale import again; decisions carry over where they fit.
Example request:
curl --request POST \
"http://localhost:8000/v1/transfer/runs/58C6f7nnFCJ9M6rjyc6rTKMzn6/replan" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/transfer/runs/58C6f7nnFCJ9M6rjyc6rTKMzn6/replan"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "POST",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/transfer/runs/58C6f7nnFCJ9M6rjyc6rTKMzn6/replan';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Change whether new topic areas, pages and ads stay drafts; the plan is resolved again.
Example request:
curl --request PATCH \
"http://localhost:8000/v1/transfer/runs/58C6f7nnFCJ9M6rjyc6rTKMzn6/options" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/transfer/runs/58C6f7nnFCJ9M6rjyc6rTKMzn6/options"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "PATCH",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/transfer/runs/58C6f7nnFCJ9M6rjyc6rTKMzn6/options';
$response = $client->patch(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
A page of the plan's or report's items, decisions first.
Example request:
curl --request GET \
--get "http://localhost:8000/v1/transfer/runs/58C6f7nnFCJ9M6rjyc6rTKMzn6/items" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/transfer/runs/58C6f7nnFCJ9M6rjyc6rTKMzn6/items"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/transfer/runs/58C6f7nnFCJ9M6rjyc6rTKMzn6/items';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "Full authentication required. Anonymous access not allowed for this endpoint.",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
GET v1/transfer/runs/{run}/items/{item}
Example request:
curl --request GET \
--get "http://localhost:8000/v1/transfer/runs/58C6f7nnFCJ9M6rjyc6rTKMzn6/items/58C6f7nnFCJ9M6rjyc6rTKMzn6" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/transfer/runs/58C6f7nnFCJ9M6rjyc6rTKMzn6/items/58C6f7nnFCJ9M6rjyc6rTKMzn6"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/transfer/runs/58C6f7nnFCJ9M6rjyc6rTKMzn6/items/58C6f7nnFCJ9M6rjyc6rTKMzn6';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "Full authentication required. Anonymous access not allowed for this endpoint.",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Decide items of a ready plan, one by one or several of one kind with one choice; the plan is resolved again for the caller.
Example request:
curl --request PUT \
"http://localhost:8000/v1/transfer/runs/58C6f7nnFCJ9M6rjyc6rTKMzn6/decisions" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/transfer/runs/58C6f7nnFCJ9M6rjyc6rTKMzn6/decisions"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "PUT",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/transfer/runs/58C6f7nnFCJ9M6rjyc6rTKMzn6/decisions';
$response = $client->put(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Resolve the stored plan for the caller.
Example request:
curl --request POST \
"http://localhost:8000/v1/transfer/runs/58C6f7nnFCJ9M6rjyc6rTKMzn6/resolve" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/transfer/runs/58C6f7nnFCJ9M6rjyc6rTKMzn6/resolve"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "POST",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/transfer/runs/58C6f7nnFCJ9M6rjyc6rTKMzn6/resolve';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Confirm the plan as the caller saw it and queue the import.
Example request:
curl --request POST \
"http://localhost:8000/v1/transfer/runs/58C6f7nnFCJ9M6rjyc6rTKMzn6/apply" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/transfer/runs/58C6f7nnFCJ9M6rjyc6rTKMzn6/apply"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "POST",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/transfer/runs/58C6f7nnFCJ9M6rjyc6rTKMzn6/apply';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Evaluation
Get manual grading queue.
requires authentication
Returns paginated list of assignments awaiting grading.
Example request:
curl --request GET \
--get "http://localhost:8000/v1/evaluation/manual-grading" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"status\": \"pending\",
\"per_page\": 1
}"
const url = new URL(
"http://localhost:8000/v1/evaluation/manual-grading"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"status": "pending",
"per_page": 1
};
fetch(url, {
method: "GET",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/evaluation/manual-grading';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'status' => 'pending',
'per_page' => 1,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "Full authentication required. Anonymous access not allowed for this endpoint.",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Get manual grading assignment details.
requires authentication
Returns full context for grading (question, answer, rubric).
Example request:
curl --request GET \
--get "http://localhost:8000/v1/evaluation/manual-grading/58C6f7nnFCJ9M6rjyc6rTKMzn6" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/evaluation/manual-grading/58C6f7nnFCJ9M6rjyc6rTKMzn6"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/evaluation/manual-grading/58C6f7nnFCJ9M6rjyc6rTKMzn6';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "Full authentication required. Anonymous access not allowed for this endpoint.",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Submit manual grade for assignment.
requires authentication
Example request:
curl --request POST \
"http://localhost:8000/v1/evaluation/manual-grading/58C6f7nnFCJ9M6rjyc6rTKMzn6/grade" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"points_awarded\": 27,
\"feedback\": \"n\",
\"rubric_scores\": [
84
]
}"
const url = new URL(
"http://localhost:8000/v1/evaluation/manual-grading/58C6f7nnFCJ9M6rjyc6rTKMzn6/grade"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"points_awarded": 27,
"feedback": "n",
"rubric_scores": [
84
]
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/evaluation/manual-grading/58C6f7nnFCJ9M6rjyc6rTKMzn6/grade';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'points_awarded' => 27,
'feedback' => 'n',
'rubric_scores' => [
84,
],
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Assign grading assignment to instructor.
requires authentication
Example request:
curl --request PUT \
"http://localhost:8000/v1/evaluation/manual-grading/58C6f7nnFCJ9M6rjyc6rTKMzn6/assign" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"assigned_to\": \"architecto\"
}"
const url = new URL(
"http://localhost:8000/v1/evaluation/manual-grading/58C6f7nnFCJ9M6rjyc6rTKMzn6/assign"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"assigned_to": "architecto"
};
fetch(url, {
method: "PUT",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/evaluation/manual-grading/58C6f7nnFCJ9M6rjyc6rTKMzn6/assign';
$response = $client->put(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'assigned_to' => 'architecto',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Regrade a single attempt.
requires authentication
Resets scores and re-dispatches grading job. Useful for fixing grading errors or updating after config changes. Only attempts on quizzes owned by the caller's tenant can be regraded; any other attempt is reported as not found.
Example request:
curl --request POST \
"http://localhost:8000/v1/evaluation/attempts/58C6f7nnFCJ9M6rjyc6rTKMzn6/regrade" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/evaluation/attempts/58C6f7nnFCJ9M6rjyc6rTKMzn6/regrade"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "POST",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/evaluation/attempts/58C6f7nnFCJ9M6rjyc6rTKMzn6/regrade';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Regrade all attempts for a quiz version.
requires authentication
Batch regrading for all submitted attempts of a quiz version. Useful after updating grading configuration.
Example request:
curl --request POST \
"http://localhost:8000/v1/evaluation/quiz-versions/58C6f7nnFCJ9M6rjyc6rTKMzn6/regrade" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/evaluation/quiz-versions/58C6f7nnFCJ9M6rjyc6rTKMzn6/regrade"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "POST",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/evaluation/quiz-versions/58C6f7nnFCJ9M6rjyc6rTKMzn6/regrade';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
List all evaluations
Example request:
curl --request GET \
--get "http://localhost:8000/v1/evaluations" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/evaluations"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/evaluations';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "Full authentication required. Anonymous access not allowed for this endpoint.",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Create new evaluation
Example request:
curl --request POST \
"http://localhost:8000/v1/evaluations" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/evaluations"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "POST",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/evaluations';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Show evaluation details
Example request:
curl --request GET \
--get "http://localhost:8000/v1/evaluations/58C6f7nnFCJ9M6rjyc6rTKMzn6" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/evaluations/58C6f7nnFCJ9M6rjyc6rTKMzn6"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/evaluations/58C6f7nnFCJ9M6rjyc6rTKMzn6';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "Full authentication required. Anonymous access not allowed for this endpoint.",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Update evaluation
Example request:
curl --request PUT \
"http://localhost:8000/v1/evaluations/58C6f7nnFCJ9M6rjyc6rTKMzn6" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/evaluations/58C6f7nnFCJ9M6rjyc6rTKMzn6"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "PUT",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/evaluations/58C6f7nnFCJ9M6rjyc6rTKMzn6';
$response = $client->put(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Delete evaluation
Example request:
curl --request DELETE \
"http://localhost:8000/v1/evaluations/58C6f7nnFCJ9M6rjyc6rTKMzn6" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/evaluations/58C6f7nnFCJ9M6rjyc6rTKMzn6"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "DELETE",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/evaluations/58C6f7nnFCJ9M6rjyc6rTKMzn6';
$response = $client->delete(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Health
Check API Health
Example request:
curl --request GET \
--get "http://localhost:8000/v1/health" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/health"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/health';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"status": "healthy"
}
Example response (503):
{
"status": "unhealthy"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Identity
Register new user Creates a new user account with identity (password). Requires at least one identifier (email, phone, or username) plus a password. `profile` accepts what account holders change about themselves (see `PATCH /v1/users/me`) except the avatar. Tenants that admit learners through single sign-on only refuse it with 403 and `errors.code` = `local_login_disabled`.
Example request:
curl --request POST \
"http://localhost:8000/v1/identity/register" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/identity/register"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "POST",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/identity/register';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (201):
{
"success": true,
"message": "Registration successful",
"data": {
"user": {
"id": "01kav3fcmme10dwbeexyqkfndn",
"email": "user@example.com",
"tenant_id": "01kav3fbpbpb3wnhtadsmrmt7m"
},
"tokens": {
"access_token": "eyJ0eXAiOiJKV1QiLCJhbGc...",
"refresh_token": "eyJ0eXAiOiJKV1QiLCJhbGc...",
"token_type": "Bearer",
"expires_in": 86400
}
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Login with credentials Authenticate with email/phone/username and password. Returns JWT access token (24h) and refresh token (30d). An account accepts 10 attempts per hour, counted together for its email address, username and phone number in any letter case; a successful login starts the count over. Accounts without a password are refused like a wrong password. Tenants that admit learners through single sign-on only accept passwords from their staff (any role other than the default role); everyone else gets 403 with `errors.code` = `local_login_disabled`.
Example request:
curl --request POST \
"http://localhost:8000/v1/identity/login" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/identity/login"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "POST",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/identity/login';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"message": "Login successful",
"data": {
"user": {
"id": "01kav3fcmme10dwbeexyqkfndn",
"email": "user@example.com"
},
"tokens": {
"access_token": "eyJ0eXAiOiJKV1QiLCJhbGc...",
"refresh_token": "eyJ0eXAiOiJKV1QiLCJhbGc...",
"token_type": "Bearer",
"expires_in": 86400
}
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Refresh access token Exchange refresh token for new access and refresh tokens. Implements OAuth2 token rotation: the old refresh token is used up. Each refresh token renews once; requests sending it until 30 seconds after its first renewal, as tabs renewing together do, receive the same new tokens. A used refresh token sent later counts as copied and ends its login. Refresh tokens of a login that was signed out or ended by the account (password reset or change, email change, signing out everywhere) are refused with 401, as is renewing a login older than the login lifetime (`JWT_LOGIN_LIFETIME`, no limit by default); its holder signs in again. A renewal that takes longer than a request may run answers 503 and does not end the login. Its refresh token may have been used up by another request meanwhile, so read the stored tokens again before renewing again.
Example request:
curl --request POST \
"http://localhost:8000/v1/identity/refresh" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/identity/refresh"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "POST",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/identity/refresh';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"message": "Token refreshed successfully",
"data": {
"access_token": "eyJ0eXAiOiJKV1QiLCJhbGc...",
"refresh_token": "eyJ0eXAiOiJKV1QiLCJhbGc...",
"token_type": "Bearer",
"expires_in": 86400
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Sign out Ends the login the refresh token belongs to: its access and refresh tokens are refused from now on. The account's other logins continue. Send the refresh token in the body and no Authorization header, as for a refresh. Signing out a login again succeeds as well.
Example request:
curl --request POST \
"http://localhost:8000/v1/identity/logout" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/identity/logout"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "POST",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/identity/logout';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"message": "Signed out",
"data": null
}
Example response (401):
{
"success": false,
"message": "Invalid or expired refresh token"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Anonymous login Generate anonymous session token without creating database records. Returns a tracking ID and tokens that can be used to link requests across modules. User can later "upgrade" to authenticated by registering with this ID.
Example request:
curl --request POST \
"http://localhost:8000/v1/identity/anonymous" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/identity/anonymous"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "POST",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/identity/anonymous';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"message": "Anonymous session created",
"data": {
"anonymous_id": "01kav3fcmme10dwbeexyqkfndn",
"tokens": {
"access_token": "eyJ0eXAiOiJKV1QiLCJhbGc...",
"refresh_token": "eyJ0eXAiOiJKV1QiLCJhbGc...",
"token_type": "Bearer",
"expires_in": 86400
}
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Claim anonymous account Converts anonymous session to authenticated account by claiming it with credentials. Requires anonymous token in Authorization header. Creates User and Identity records with the anonymous ID. Preserves data linkage across modules via shared ID. The anonymous tokens stop working; continue with the returned ones. `profile` accepts what account holders change about themselves (see `PATCH /v1/users/me`) except the avatar.
Example request:
curl --request POST \
"http://localhost:8000/v1/identity/anonymous/claim" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/identity/anonymous/claim"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "POST",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/identity/anonymous/claim';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"message": "Account upgraded successfully",
"data": {
"user": {
"id": "01kav3fcmme10dwbeexyqkfndn",
"email": "user@example.com",
"is_anonymous": false
},
"tokens": {
"access_token": "eyJ0eXAiOiJKV1QiLCJhbGc...",
"refresh_token": "eyJ0eXAiOiJKV1QiLCJhbGc...",
"token_type": "Bearer",
"expires_in": 86400
}
}
}
Example response (401):
{
"success": false,
"message": "Missing or invalid authorization token"
}
Example response (409):
{
"success": false,
"message": "Anonymous account has already been upgraded"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Change password Change password for authenticated user. Requires current password for verification. Protected route - requires valid access token. Ends the account's other logins: their access and refresh tokens are refused from now on. The login making the request stays signed in.
requires authentication
Example request:
curl --request POST \
"http://localhost:8000/v1/identity/change-password" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/identity/change-password"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "POST",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/identity/change-password';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"message": "Password changed successfully",
"data": null
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Set a password Gives a password to an account that signs in through single sign-on only, as an additional way to sign in. Uses the password rules of registration. Refused with 409 (`password_already_set`) when the account has a password and with 403 (`local_login_disabled`) in tenants that admit learners through single sign-on only.
requires authentication
Example request:
curl --request POST \
"http://localhost:8000/v1/identity/password/set" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/identity/password/set"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "POST",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/identity/password/set';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"message": "Password set successfully",
"data": null
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Sign out everywhere Ends all logins of the account, including the current one: every access and refresh token issued so far is refused from now on.
requires authentication
Example request:
curl --request POST \
"http://localhost:8000/v1/identity/logout-all" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/identity/logout-all"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "POST",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/identity/logout-all';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"message": "Signed out everywhere",
"data": null
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Login Methods
List login methods The password and the linked external accounts of the signed-in account, and the providers it can still add.
requires authentication
Example request:
curl --request GET \
--get "http://localhost:8000/v1/identity/login-methods" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/identity/login-methods"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/identity/login-methods';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"message": "Login methods retrieved successfully",
"data": {
"has_password": true,
"can_set_password": false,
"methods": [
{
"id": "01J...",
"provider": {
"key": "google",
"display_name": "Google",
"driver": "google",
"icon": "ri-google-fill"
},
"email": "anna@gmail.com",
"created_at": "2026-10-14T10:00:00+00:00",
"last_login_at": null,
"usable": true
}
],
"available": [
{
"key": "apple",
"display_name": "Apple",
"driver": "apple",
"icon": "ri-apple-fill",
"kind": "platform"
}
]
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Claim a pending external account After `sso_error=account_exists` (or `email_required`), the person signs in as usual and links the external account to it with the pending ticket.
requires authentication
Example request:
curl --request POST \
"http://localhost:8000/v1/identity/login-methods/claim" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"pending\": \"architecto\",
\"browser_secret\": \"architecto\"
}"
const url = new URL(
"http://localhost:8000/v1/identity/login-methods/claim"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"pending": "architecto",
"browser_secret": "architecto"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/identity/login-methods/claim';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'pending' => 'architecto',
'browser_secret' => 'architecto',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (409):
{
"success": false,
"message": "This external account belongs to another account.",
"errors": {
"code": "already_linked_other"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Start linking a provider Returns the URL to navigate the browser to. It carries a ticket for this account and provider that expires after five minutes. The browser returns to `return_to` with `sso_result=linked` or `sso_error`.
requires authentication
Example request:
curl --request POST \
"http://localhost:8000/v1/identity/login-methods/link-intent" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"provider\": \"google\",
\"return_to\": \"http:\\/\\/localhost:3001\\/profile\"
}"
const url = new URL(
"http://localhost:8000/v1/identity/login-methods/link-intent"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"provider": "google",
"return_to": "http:\/\/localhost:3001\/profile"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/identity/login-methods/link-intent';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'provider' => 'google',
'return_to' => 'http://localhost:3001/profile',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"message": "Link started",
"data": {
"redirect_url": "http://localhost:8000/v1/sso/redirect?tenant=...&provider=google&intent=link&ticket=..."
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Remove a login method Refused with 422 (`last_login_method`) when it is the account's last way to sign in that works under the tenant's login mode.
requires authentication
Example request:
curl --request DELETE \
"http://localhost:8000/v1/identity/login-methods/58C6f7nnFCJ9M6rjyc6rTKMzn6" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/identity/login-methods/58C6f7nnFCJ9M6rjyc6rTKMzn6"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "DELETE",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/identity/login-methods/58C6f7nnFCJ9M6rjyc6rTKMzn6';
$response = $client->delete(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (422):
{
"success": false,
"message": "The last way to sign in cannot be removed.",
"errors": {
"code": "last_login_method"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Start signing in again Confirms the person with one of the account's linked providers, for deleting an account without password. Returns the URL to navigate the browser to. The browser returns to `return_to` with `sso_reauth`, valid for five minutes, or with `sso_error`.
requires authentication
Example request:
curl --request POST \
"http://localhost:8000/v1/identity/sso/reauth-intent" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"provider\": \"google\",
\"return_to\": \"http:\\/\\/localhost:3001\\/profile\"
}"
const url = new URL(
"http://localhost:8000/v1/identity/sso/reauth-intent"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"provider": "google",
"return_to": "http:\/\/localhost:3001\/profile"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/identity/sso/reauth-intent';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'provider' => 'google',
'return_to' => 'http://localhost:3001/profile',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"message": "Sign-in started",
"data": {
"redirect_url": "http://localhost:8000/v1/sso/redirect?tenant=...&provider=google&intent=reauth&ticket=..."
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Delete the account after signing in again For accounts without password, which cannot confirm the deletion with one. Needs the `sso_reauth` proof of a fresh sign-in.
requires authentication
Example request:
curl --request DELETE \
"http://localhost:8000/v1/identity/sso/account" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"reauth\": \"architecto\"
}"
const url = new URL(
"http://localhost:8000/v1/identity/sso/account"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"reauth": "architecto"
};
fetch(url, {
method: "DELETE",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/identity/sso/account';
$response = $client->delete(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'reauth' => 'architecto',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (400):
{
"success": false,
"message": "This sign-in has expired or was already used. Please start again.",
"errors": {
"code": "expired"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Media Aliases
Resolve alias for current user/tenant (e.g., user-avatar/current)
Example request:
curl --request GET \
--get "http://localhost:8000/v1/media/alias/architecto/current" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/media/alias/architecto/current"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/media/alias/architecto/current';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (404):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "No media found for alias 'architecto/current'",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Resolve alias for current user/tenant variant
Example request:
curl --request GET \
--get "http://localhost:8000/v1/media/alias/architecto/current/variants/architecto" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/media/alias/architecto/current/variants/architecto"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/media/alias/architecto/current/variants/architecto';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (404):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "No media found for alias 'architecto/current'",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Resolve alias by specific ID (e.g., user-avatar/{userId})
Example request:
curl --request GET \
--get "http://localhost:8000/v1/media/alias/architecto/58C6f7nnFCJ9M6rjyc6rTKMzn6" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/media/alias/architecto/58C6f7nnFCJ9M6rjyc6rTKMzn6"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/media/alias/architecto/58C6f7nnFCJ9M6rjyc6rTKMzn6';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (500):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "Internal Server Error",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Resolve alias by specific ID with variant
Example request:
curl --request GET \
--get "http://localhost:8000/v1/media/alias/architecto/58C6f7nnFCJ9M6rjyc6rTKMzn6/variants/architecto" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/media/alias/architecto/58C6f7nnFCJ9M6rjyc6rTKMzn6/variants/architecto"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/media/alias/architecto/58C6f7nnFCJ9M6rjyc6rTKMzn6/variants/architecto';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (500):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "Internal Server Error",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Resolve global alias (no related_id)
Example request:
curl --request GET \
--get "http://localhost:8000/v1/media/alias/architecto" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/media/alias/architecto"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/media/alias/architecto';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (500):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "Internal Server Error",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Resolve global alias with variant
Example request:
curl --request GET \
--get "http://localhost:8000/v1/media/alias/architecto/variants/architecto" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/media/alias/architecto/variants/architecto"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/media/alias/architecto/variants/architecto';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (500):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "Internal Server Error",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Media Management
Upload new media file
Example request:
curl --request POST \
"http://localhost:8000/v1/media" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/media"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "POST",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/media';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Upload media from URL The URL must lead to a public http(s) host; addresses of private networks and redirects are refused with 422. The file has to meet the collection's file types and size limit, like a direct upload.
Example request:
curl --request POST \
"http://localhost:8000/v1/media/from-url" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"url\": \"http:\\/\\/www.bailey.biz\\/quos-velit-et-fugiat-sunt-nihil-accusantium-harum.html\",
\"privacy\": \"tenant\",
\"collection_name\": \"i\",
\"title\": \"k\",
\"description\": \"Aut ab provident perspiciatis quo omnis nostrum aut.\",
\"alt_text\": \"w\",
\"expires_at\": \"2026-11-03T00:49:05\"
}"
const url = new URL(
"http://localhost:8000/v1/media/from-url"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"url": "http:\/\/www.bailey.biz\/quos-velit-et-fugiat-sunt-nihil-accusantium-harum.html",
"privacy": "tenant",
"collection_name": "i",
"title": "k",
"description": "Aut ab provident perspiciatis quo omnis nostrum aut.",
"alt_text": "w",
"expires_at": "2026-11-03T00:49:05"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/media/from-url';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'url' => 'http://www.bailey.biz/quos-velit-et-fugiat-sunt-nihil-accusantium-harum.html',
'privacy' => 'tenant',
'collection_name' => 'i',
'title' => 'k',
'description' => 'Aut ab provident perspiciatis quo omnis nostrum aut.',
'alt_text' => 'w',
'expires_at' => '2026-11-03T00:49:05',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Batch upload multiple media files
Example request:
curl --request POST \
"http://localhost:8000/v1/media/batch" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"files\": null,
\"privacy\": \"tenant\",
\"collection_name\": \"question-block-images\",
\"titles\": [
\"Image 1\",
\"Image 2\"
]
}"
const url = new URL(
"http://localhost:8000/v1/media/batch"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"files": null,
"privacy": "tenant",
"collection_name": "question-block-images",
"titles": [
"Image 1",
"Image 2"
]
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/media/batch';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'files' => null,
'privacy' => 'tenant',
'collection_name' => 'question-block-images',
'titles' => [
'Image 1',
'Image 2',
],
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (201):
{"success": true, "message": "3 files uploaded successfully", "data": {"media": [{"id": "01...", ...}], "errors": []}}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
List all media
Example request:
curl --request GET \
--get "http://localhost:8000/v1/media?per_page=20&page=1&mime_type=image%2F&privacy=public&status=ready&collection_name=avatars&search=photo&created_at_gte=2024-01-01&created_at_lte=2024-12-31&sort=-created_at" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/media"
);
const params = {
"per_page": "20",
"page": "1",
"mime_type": "image/",
"privacy": "public",
"status": "ready",
"collection_name": "avatars",
"search": "photo",
"created_at_gte": "2024-01-01",
"created_at_lte": "2024-12-31",
"sort": "-created_at",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/media';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'query' => [
'per_page' => '20',
'page' => '1',
'mime_type' => 'image/',
'privacy' => 'public',
'status' => 'ready',
'collection_name' => 'avatars',
'search' => 'photo',
'created_at_gte' => '2024-01-01',
'created_at_lte' => '2024-12-31',
'sort' => '-created_at',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (500):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "Internal Server Error",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Get media by ID
Example request:
curl --request GET \
--get "http://localhost:8000/v1/media/58C6f7nnFCJ9M6rjyc6rTKMzn6" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/media/58C6f7nnFCJ9M6rjyc6rTKMzn6"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/media/58C6f7nnFCJ9M6rjyc6rTKMzn6';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (500):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "Internal Server Error",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Download media file binary Returns the raw file with its stored Content-Type. Formats a browser renders passively (pictures, film, sound, PDF) are served inline so question content can embed them with `<img src>`; anything else — an SVG above all, which is a script-capable document — is served as a download under a sandboxing CSP. Public media may be cached for good; other media is served with `no-store`, so every download is checked again. See MediaDelivery.
Example request:
curl --request GET \
--get "http://localhost:8000/v1/media/58C6f7nnFCJ9M6rjyc6rTKMzn6/download" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/media/58C6f7nnFCJ9M6rjyc6rTKMzn6/download"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/media/58C6f7nnFCJ9M6rjyc6rTKMzn6/download';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (500):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "Internal Server Error",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Update media metadata (file content is immutable) Only media of the caller's tenant can be changed. Another tenant's public media is refused with 403; media the caller cannot see returns 404.
Example request:
curl --request PATCH \
"http://localhost:8000/v1/media/58C6f7nnFCJ9M6rjyc6rTKMzn6" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/media/58C6f7nnFCJ9M6rjyc6rTKMzn6"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "PATCH",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/media/58C6f7nnFCJ9M6rjyc6rTKMzn6';
$response = $client->patch(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Delete media by ID (soft delete) Only media of the caller's tenant can be deleted. Another tenant's public media is refused with 403; media the caller cannot see returns 404.
Example request:
curl --request DELETE \
"http://localhost:8000/v1/media/58C6f7nnFCJ9M6rjyc6rTKMzn6" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/media/58C6f7nnFCJ9M6rjyc6rTKMzn6"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "DELETE",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/media/58C6f7nnFCJ9M6rjyc6rTKMzn6';
$response = $client->delete(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Bulk delete media files Every ID must name media the caller may delete, as for a single delete. Otherwise the request fails with that media's 403 or 404 and nothing is deleted.
Example request:
curl --request POST \
"http://localhost:8000/v1/media/bulk-delete" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"ids\": [
\"architecto\"
]
}"
const url = new URL(
"http://localhost:8000/v1/media/bulk-delete"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"ids": [
"architecto"
]
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/media/bulk-delete';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'ids' => [
'architecto',
],
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Get media usage statistics
Example request:
curl --request GET \
--get "http://localhost:8000/v1/media/stats" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/media/stats"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/media/stats';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "Full authentication required. Anonymous access not allowed for this endpoint.",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Cleanup expired media files of the caller's tenant
Example request:
curl --request POST \
"http://localhost:8000/v1/media/cleanup" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/media/cleanup"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "POST",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/media/cleanup';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
List all variants for a media file
Example request:
curl --request GET \
--get "http://localhost:8000/v1/media/58C6f7nnFCJ9M6rjyc6rTKMzn6/variants" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/media/58C6f7nnFCJ9M6rjyc6rTKMzn6/variants"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/media/58C6f7nnFCJ9M6rjyc6rTKMzn6/variants';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (500):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "Internal Server Error",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Download a specific variant Note: This endpoint returns a redirect to the actual file URL
Example request:
curl --request GET \
--get "http://localhost:8000/v1/media/58C6f7nnFCJ9M6rjyc6rTKMzn6/variants/architecto" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/media/58C6f7nnFCJ9M6rjyc6rTKMzn6/variants/architecto"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/media/58C6f7nnFCJ9M6rjyc6rTKMzn6/variants/architecto';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (500):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "Internal Server Error",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
MoodleImport
Import a Moodle activity backup (.mbz)
Example request:
curl --request POST \
"http://localhost:8000/v1/moodle-import" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/moodle-import"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "POST",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/moodle-import';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Import a Moodle question bank export (qformat_xml) A different operation from importing an activity backup: the file holds questions and categories only, so no quiz, section or slot is created. The questions land in the tenant's question bank, tagged with their Moodle category, and re-importing the same file under the same `bank_key` updates them rather than adding a second copy.
Example request:
curl --request POST \
"http://localhost:8000/v1/moodle-import/question-bank" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/moodle-import/question-bank"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "POST",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/moodle-import/question-bank';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Get import run status
Example request:
curl --request GET \
--get "http://localhost:8000/v1/moodle-import/58C6f7nnFCJ9M6rjyc6rTKMzn6" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/moodle-import/58C6f7nnFCJ9M6rjyc6rTKMzn6"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/moodle-import/58C6f7nnFCJ9M6rjyc6rTKMzn6';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "Full authentication required. Anonymous access not allowed for this endpoint.",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Notification Management
Get in-app notifications for current user
Example request:
curl --request GET \
--get "http://localhost:8000/v1/notifications" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"per_page\": 1,
\"page\": 22
}"
const url = new URL(
"http://localhost:8000/v1/notifications"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"per_page": 1,
"page": 22
};
fetch(url, {
method: "GET",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/notifications';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'per_page' => 1,
'page' => 22,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (400):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "A valid Tenant context is required for this request. Please provide a valid X-Tenant-ID header.",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Mark all in-app notifications of the current user as read
Example request:
curl --request POST \
"http://localhost:8000/v1/notifications/read-all" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/notifications/read-all"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "POST",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/notifications/read-all';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Get an in-app notification of the current user by ID
Example request:
curl --request GET \
--get "http://localhost:8000/v1/notifications/58C6f7nnFCJ9M6rjyc6rTKMzn6" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/notifications/58C6f7nnFCJ9M6rjyc6rTKMzn6"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/notifications/58C6f7nnFCJ9M6rjyc6rTKMzn6';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (400):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "A valid Tenant context is required for this request. Please provide a valid X-Tenant-ID header.",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Mark an in-app notification of the current user as read
Example request:
curl --request PATCH \
"http://localhost:8000/v1/notifications/58C6f7nnFCJ9M6rjyc6rTKMzn6/read" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/notifications/58C6f7nnFCJ9M6rjyc6rTKMzn6/read"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "PATCH",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/notifications/58C6f7nnFCJ9M6rjyc6rTKMzn6/read';
$response = $client->patch(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Notification Preferences
Get user notification preferences
Example request:
curl --request GET \
--get "http://localhost:8000/v1/notifications/preferences" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/notifications/preferences"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/notifications/preferences';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (400):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "A valid Tenant context is required for this request. Please provide a valid X-Tenant-ID header.",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Update notification preferences With `enabled` false, no notification of the category reaches the user in this tenant. Without a preference, `info` notifications do not reach the user and those of the other categories do; a new preference without `enabled` starts from that default. Required categories (`critical`, such as account security emails) are delivered regardless.
Example request:
curl --request PUT \
"http://localhost:8000/v1/notifications/preferences" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/notifications/preferences"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "PUT",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/notifications/preferences';
$response = $client->put(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Delete notification preference (reset to defaults)
Example request:
curl --request DELETE \
"http://localhost:8000/v1/notifications/preferences" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"category\": \"info\"
}"
const url = new URL(
"http://localhost:8000/v1/notifications/preferences"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"category": "info"
};
fetch(url, {
method: "DELETE",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/notifications/preferences';
$response = $client->delete(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'category' => 'info',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Pdf Management
List all available PDF templates Returns a list of all PDF templates available for document generation.
Example request:
curl --request GET \
--get "http://localhost:8000/v1/pdf/templates" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/pdf/templates"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/pdf/templates';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"data": {
"templates": [
{
"slug": "quiz_certificate",
"name": "Quiz Certificate",
"description": "..."
}
]
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Get template details Returns detailed information about a specific PDF template including default variables and validation rules.
Example request:
curl --request GET \
--get "http://localhost:8000/v1/pdf/templates/quiz_certificate" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/pdf/templates/quiz_certificate"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/pdf/templates/quiz_certificate';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": true,
"message": "Template retrieved successfully",
"data": {
"slug": "quiz_certificate",
"name": "Quiz Zertifikat",
"description": "Zertifikat für erfolgreich absolvierte Tests. Empfohlene PDF-Optionen: margin_top=0, margin_bottom=0, margin_left=0, margin_right=0, print_background=true",
"defaultVariables": {
"student_name": "Ottilie Otterstedt",
"student_email": "ottilie.otterstedt@mail.de",
"quiz_title": "MINTfit Test",
"score": "99",
"stars": "5",
"completion_date": "22.07.2024",
"description_text": "hat den MINTfit Test erfolgreich absolviert.",
"certificate_number": "CERT-2026-A7K2M",
"verification_url": "https://mintfit.hamburg/certificate",
"verification_display_url": "https://mintfit.hamburg/certificate",
"quiz_color": "#e2b2ff",
"quiz_label": "",
"quiz_image_url": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgd2lkdGg9IjEzOC42ODciCiAgIGhlaWdodD0iMTA3LjQiCiAgIHZpZXdCb3g9IjAgMCAxMzguNjg3IDEwNy40IgogICB2ZXJzaW9uPSIxLjEiCiAgIGlkPSJzdmcyNDEiCiAgIHNvZGlwb2RpOmRvY25hbWU9ImNvbXB1dGVyU2NpZW5jZS5zdmciCiAgIGlua3NjYXBlOnZlcnNpb249IjEuMi4yIChiMGE4NDg2NTQxLCAyMDIyLTEyLTAxKSIKICAgeG1sbnM6aW5rc2NhcGU9Imh0dHA6Ly93d3cuaW5rc2NhcGUub3JnL25hbWVzcGFjZXMvaW5rc2NhcGUiCiAgIHhtbG5zOnNvZGlwb2RpPSJodHRwOi8vc29kaXBvZGkuc291cmNlZm9yZ2UubmV0L0RURC9zb2RpcG9kaS0wLmR0ZCIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICA8ZGVmcwogICAgIGlkPSJkZWZzMjQ1IiAvPgogIDxzb2RpcG9kaTpuYW1lZHZpZXcKICAgICBpZD0ibmFtZWR2aWV3MjQzIgogICAgIHBhZ2Vjb2xvcj0iI2ZmZmZmZiIKICAgICBib3JkZXJjb2xvcj0iIzAwMDAwMCIKICAgICBib3JkZXJvcGFjaXR5PSIwLjI1IgogICAgIGlua3NjYXBlOnNob3dwYWdlc2hhZG93PSIyIgogICAgIGlua3NjYXBlOnBhZ2VvcGFjaXR5PSIwLjAiCiAgICAgaW5rc2NhcGU6cGFnZWNoZWNrZXJib2FyZD0iMCIKICAgICBpbmtzY2FwZTpkZXNrY29sb3I9IiNkMWQxZDEiCiAgICAgc2hvd2dyaWQ9ImZhbHNlIgogICAgIGlua3NjYXBlOnpvb209IjkuNTYyMzgzNSIKICAgICBpbmtzY2FwZTpjeD0iNDcuNTI5OTkxIgogICAgIGlua3NjYXBlOmN5PSI1My44MDQ1NzciCiAgICAgaW5rc2NhcGU6d2luZG93LXdpZHRoPSIyNTYwIgogICAgIGlua3NjYXBlOndpbmRvdy1oZWlnaHQ9IjEzNTUiCiAgICAgaW5rc2NhcGU6d2luZG93LXg9IjAiCiAgICAgaW5rc2NhcGU6d2luZG93LXk9IjAiCiAgICAgaW5rc2NhcGU6d2luZG93LW1heGltaXplZD0iMSIKICAgICBpbmtzY2FwZTpjdXJyZW50LWxheWVyPSJJbmZvcm1hdGlrIiAvPgogIDxnCiAgICAgaWQ9IkluZm9ybWF0aWsiCiAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTAuMDA1KSI+CiAgICA8ZwogICAgICAgaWQ9IkdydXBwZV8zIgogICAgICAgZGF0YS1uYW1lPSJHcnVwcGUgMyI+CiAgICAgIDxyZWN0CiAgICAgICAgIGlkPSJSZWNodGVja18xIgogICAgICAgICBkYXRhLW5hbWU9IlJlY2h0ZWNrIDEiCiAgICAgICAgIHdpZHRoPSIxMTMuMzYiCiAgICAgICAgIGhlaWdodD0iNjQuMzkiCiAgICAgICAgIHJ4PSI1IgogICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxNC40IDEwLjk3KSIKICAgICAgICAgZmlsbD0iI2ZmZiIgLz4KICAgICAgPHBhdGgKICAgICAgICAgaWQ9IlJlY2h0ZWNrXzIiCiAgICAgICAgIGRhdGEtbmFtZT0iUmVjaHRlY2sgMiIKICAgICAgICAgZD0iTTUtMkgxMDguMzZhNy4wMDgsNy4wMDgsMCwwLDEsNyw3VjU5LjM5YTcuMDA4LDcuMDA4LDAsMCwxLTcsN0g1YTcuMDA4LDcuMDA4LDAsMCwxLTctN1Y1QTcuMDA4LDcuMDA4LDAsMCwxLDUtMlpNMTA4LjM2LDYyLjM5YTMsMywwLDAsMCwzLTNWNWEzLDMsMCwwLDAtMy0zSDVBMywzLDAsMCwwLDIsNVY1OS4zOWEzLDMsMCwwLDAsMywzWiIKICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTQuNCAxMC45NykiCiAgICAgICAgIGZpbGw9IiMwMDRhNmIiIC8+CiAgICAgIDxwYXRoCiAgICAgICAgIGlkPSJQZmFkXzEyIgogICAgICAgICBkYXRhLW5hbWU9IlBmYWQgMTIiCiAgICAgICAgIGQ9Ik0xOC40NSw4Mi4zNmE5LjYxLDkuNjEsMCwwLDAtNy41MSw0LjMzTDIuNiwxMDEuMDhjLTEuMzksMi4zOS0uMjcsNC4zMiwyLjQ5LDQuMzJsMTI4LjMxLS4wMmMyLjc2LDAsNC4wNC0yLjAyLDIuODUtNC41MWwtNi42Ny0xMy45OWE4LjY0NCw4LjY0NCwwLDAsMC03LjE1LTQuNTFIMTguNDVaIgogICAgICAgICBmaWxsPSIjZmZmIiAvPgogICAgICA8cGF0aAogICAgICAgICBpZD0iUGZhZF8xMyIKICAgICAgICAgZGF0YS1uYW1lPSJQZmFkIDEzIgogICAgICAgICBkPSJNMTguNDUsODAuMzZxLjEsMCwuMi4wMUgxMjIuNDNhMTAuNjI4LDEwLjYyOCwwLDAsMSw4Ljk1NSw1LjY0OGw2LjY3MSwxMy45OTJhNC44ODIsNC44ODIsMCwwLDEtNC42NTUsNy4zNzFMNS4wOSwxMDcuNGE1LDUsMCwwLDEtNC41MzctMi4yNyw0Ljk4OCw0Ljk4OCwwLDAsMSwuMzE4LTUuMDU2TDkuMjEsODUuNjg3QTEwLjg4MSwxMC44ODEsMCwwLDEsMTMuMTgyLDgxLjksMTAuODMsMTAuODMsMCwwLDEsMTguNDUsODAuMzZaTTUuMDksMTAzLjRsMTI4LjMxLS4wMmExLjUyLDEuNTIsMCwwLDAsMS4yMTctLjM5MWMuMTE4LS4xODcuMTM1LS42MTYtLjE3MS0xLjI1N2wtNi42NzEtMTMuOTkyYTYuNjcxLDYuNjcxLDAsMCwwLTUuMzQ1LTMuMzcxSDE4LjQ1cS0uMDgzLDAtLjE2NS0uMDA3QTcuNyw3LjcsMCwwLDAsMTIuNjY5LDg3LjdMNC4zMywxMDIuMDgzYy0uMzc5LjY1MS0uMzQsMS0uMzEsMS4wNTNTNC4zMzYsMTAzLjQsNS4wOSwxMDMuNFoiCiAgICAgICAgIGZpbGw9IiMwMDRhNmIiIC8+CiAgICAgIDxyZWN0CiAgICAgICAgIGlkPSJSZWNodGVja18zIgogICAgICAgICBkYXRhLW5hbWU9IlJlY2h0ZWNrIDMiCiAgICAgICAgIHdpZHRoPSIxMTMuMzYiCiAgICAgICAgIGhlaWdodD0iNjQuMzkiCiAgICAgICAgIHJ4PSI1IgogICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgzIDIpIgogICAgICAgICBmaWxsPSIjMDA0YTZiIiAvPgogICAgICA8cGF0aAogICAgICAgICBpZD0iUmVjaHRlY2tfNCIKICAgICAgICAgZGF0YS1uYW1lPSJSZWNodGVjayA0IgogICAgICAgICBkPSJNNS0ySDEwOC4zNmE3LjAwOCw3LjAwOCwwLDAsMSw3LDdWNTkuMzlhNy4wMDgsNy4wMDgsMCwwLDEtNyw3SDVhNy4wMDgsNy4wMDgsMCwwLDEtNy03VjVBNy4wMDgsNy4wMDgsMCwwLDEsNS0yWk0xMDguMzYsNjIuMzlhMywzLDAsMCwwLDMtM1Y1YTMsMywwLDAsMC0zLTNINUEzLDMsMCwwLDAsMiw1VjU5LjM5YTMsMywwLDAsMCwzLDNaIgogICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgzIDIpIgogICAgICAgICBmaWxsPSIjMDA0YTZiIiAvPgogICAgPC9nPgogICAgPHBhdGgKICAgICAgIGlkPSJQZmFkXzE0IgogICAgICAgZGF0YS1uYW1lPSJQZmFkIDE0IgogICAgICAgZD0iTTM0Ljk4Myw0Ny43bC0xMi4zMy0xMC4zN2EyLDIsMCwwLDEtLjEtMi45NzJsMTEuNjEtMTEuMTcsMi43NzMsMi44ODNMMjYuOTI4LDM1LjdsMTAuNjI5LDguOTM5WiIKICAgICAgIGZpbGw9IiM5OTljZmYiIC8+CiAgICA8cGF0aAogICAgICAgaWQ9IlBmYWRfMTUiCiAgICAgICBkYXRhLW5hbWU9IlBmYWQgMTUiCiAgICAgICBkPSJNODUuMiw0Ny43bC0yLjc3My0yLjg4MywxMC4wMDktOS42MjlMODEuODEyLDI2LjI1bDIuNTc2LTMuMDYsMTIuMzIsMTAuMzdhMiwyLDAsMCwxLC4xLDIuOTcxWiIKICAgICAgIGZpbGw9IiM5OTljZmYiIC8+CiAgICA8dGV4dAogICAgICAgaWQ9ImhpIgogICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNDUuMzQsNDYuODcpIgogICAgICAgZmlsbD0iI2ZmZmZmZiIKICAgICAgIGZvbnQtc2l6ZT0iMzBweCIKICAgICAgIGZvbnQtZmFtaWx5PSJWQ1JPU0RNb25vLCAnVkNSIE9TRCBNb25vJyIKICAgICAgIHN0eWxlPSJmb250LXNpemU6MzBweDtmb250LWZhbWlseTpWQ1JPU0RNb25vLCAnVkNSIE9TRCBNb25vJztmaWxsOiNmZmZmZmYiPjx0c3BhbgogICAgICAgICB4PSIwIgogICAgICAgICB5PSIwIgogICAgICAgICBpZD0idHNwYW4yMzciCiAgICAgICAgIHN0eWxlPSJmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0Om5vcm1hbDtmb250LXN0cmV0Y2g6bm9ybWFsO2ZvbnQtc2l6ZTozMHB4O2ZvbnQtZmFtaWx5OidVYnVudHUgTW9ubyc7LWlua3NjYXBlLWZvbnQtc3BlY2lmaWNhdGlvbjonVWJ1bnR1IE1vbm8sIE5vcm1hbCc7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LWNhcHM6bm9ybWFsO2ZvbnQtdmFyaWFudC1udW1lcmljOm5vcm1hbDtmb250LXZhcmlhbnQtZWFzdC1hc2lhbjpub3JtYWwiPmhpPC90c3Bhbj48L3RleHQ+CiAgPC9nPgo8L3N2Zz4K"
},
"validationRules": {
"student_name": "required|string|max:255",
"student_email": "required|string|email|max:255",
"quiz_title": "required|string|max:255",
"score": "required|string",
"stars": "sometimes|string",
"completion_date": "required|string",
"description_text": "required|string",
"certificate_number": "sometimes|string|max:20",
"verification_url": "sometimes|string|url",
"verification_display_url": "sometimes|string|url",
"qr_code_data_uri": [
"sometimes",
"string",
"regex:~^data:image/(png|jpeg|gif|webp|svg\\+xml);base64,[A-Za-z0-9+/]+={0,2}$~"
],
"quiz_color": "sometimes|string|regex:/^#[0-9a-fA-F]{6}$/",
"quiz_image_url": [
"sometimes",
"nullable",
"string",
"regex:~^(data:image/(png|jpeg|gif|webp|svg\\+xml);base64,[A-Za-z0-9+/]+={0,2}|/v1/media/[0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{26}/download)$~"
],
"quiz_label": "sometimes|string|max:50"
}
},
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Preview template with default data Generates a preview PDF using the template's default data. Useful for testing templates without providing custom data.
Example request:
curl --request GET \
--get "http://localhost:8000/v1/pdf/templates/quiz_certificate/preview" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/pdf/templates/quiz_certificate/preview"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/pdf/templates/quiz_certificate/preview';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "Authentication required. Please provide a valid access token.",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Placement Management
List all placements
Example request:
curl --request GET \
--get "http://localhost:8000/v1/placements" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"per_page\": 1,
\"page\": 22
}"
const url = new URL(
"http://localhost:8000/v1/placements"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"per_page": 1,
"page": 22
};
fetch(url, {
method: "GET",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/placements';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'per_page' => 1,
'page' => 22,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "Full authentication required. Anonymous access not allowed for this endpoint.",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Create a new placement
Example request:
curl --request POST \
"http://localhost:8000/v1/placements" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/placements"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "POST",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/placements';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Get placement by ID
Example request:
curl --request GET \
--get "http://localhost:8000/v1/placements/58C6f7nnFCJ9M6rjyc6rTKMzn6" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/placements/58C6f7nnFCJ9M6rjyc6rTKMzn6"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/placements/58C6f7nnFCJ9M6rjyc6rTKMzn6';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "Full authentication required. Anonymous access not allowed for this endpoint.",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Update placement by ID
Example request:
curl --request PUT \
"http://localhost:8000/v1/placements/58C6f7nnFCJ9M6rjyc6rTKMzn6" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/placements/58C6f7nnFCJ9M6rjyc6rTKMzn6"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "PUT",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/placements/58C6f7nnFCJ9M6rjyc6rTKMzn6';
$response = $client->put(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Delete placement by ID (soft delete)
Example request:
curl --request DELETE \
"http://localhost:8000/v1/placements/58C6f7nnFCJ9M6rjyc6rTKMzn6" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/placements/58C6f7nnFCJ9M6rjyc6rTKMzn6"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "DELETE",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/placements/58C6f7nnFCJ9M6rjyc6rTKMzn6';
$response = $client->delete(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Public
Public tenant lookup by slug (for login flow) Returns minimal tenant info (id, slug, name) without requiring authentication. This endpoint is used during login to resolve a tenant slug to its ID.
Example request:
curl --request GET \
--get "http://localhost:8000/v1/tenants/lookup/architecto" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/tenants/lookup/architecto"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/tenants/lookup/architecto';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"data": {
"id": "01ARZ3...",
"slug": "acme-corp",
"name": "Acme Corp"
}
}
Example response (404):
{
"success": false,
"message": "Tenant not found"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Question History
Compare two versions
Example request:
curl --request GET \
--get "http://localhost:8000/v1/questions/history/compare?old=01ARZ3NDEKTSV4RRFFQ69G5FAV&new=01ARZ4NDEKTSV4RRFFQ69G5FAV" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"old\": \"bngzmiyvdljnikhwaykcmyuwpw\",
\"new\": \"lvqwrsitcpscqldzsnrwtujwvl\"
}"
const url = new URL(
"http://localhost:8000/v1/questions/history/compare"
);
const params = {
"old": "01ARZ3NDEKTSV4RRFFQ69G5FAV",
"new": "01ARZ4NDEKTSV4RRFFQ69G5FAV",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"old": "bngzmiyvdljnikhwaykcmyuwpw",
"new": "lvqwrsitcpscqldzsnrwtujwvl"
};
fetch(url, {
method: "GET",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/questions/history/compare';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'query' => [
'old' => '01ARZ3NDEKTSV4RRFFQ69G5FAV',
'new' => '01ARZ4NDEKTSV4RRFFQ69G5FAV',
],
'json' => [
'old' => 'bngzmiyvdljnikhwaykcmyuwpw',
'new' => 'lvqwrsitcpscqldzsnrwtujwvl',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{"success": true, "message": "Version comparison completed", "data": {"old_version": {...}, "new_version": {...}, "differences": {...}}}
Example response (404):
{
"success": false,
"message": "History record not found"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Get version history for a question
Example request:
curl --request GET \
--get "http://localhost:8000/v1/questions/58C6f7nnFCJ9M6rjyc6rTKMzn6/history?per_page=20&page=1" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"per_page\": 1,
\"page\": 22
}"
const url = new URL(
"http://localhost:8000/v1/questions/58C6f7nnFCJ9M6rjyc6rTKMzn6/history"
);
const params = {
"per_page": "20",
"page": "1",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"per_page": 1,
"page": 22
};
fetch(url, {
method: "GET",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/questions/58C6f7nnFCJ9M6rjyc6rTKMzn6/history';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'query' => [
'per_page' => '20',
'page' => '1',
],
'json' => [
'per_page' => 1,
'page' => 22,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{"success": true, "message": "Question history retrieved successfully", "data": [...], "meta": {"pagination": {...}}}
Example response (404):
{
"success": false,
"message": "Question not found"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Get specific version from history
Example request:
curl --request GET \
--get "http://localhost:8000/v1/questions/58C6f7nnFCJ9M6rjyc6rTKMzn6/history/58C6f7nnFCJ9M6rjyc6rTKMzn6" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/questions/58C6f7nnFCJ9M6rjyc6rTKMzn6/history/58C6f7nnFCJ9M6rjyc6rTKMzn6"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/questions/58C6f7nnFCJ9M6rjyc6rTKMzn6/history/58C6f7nnFCJ9M6rjyc6rTKMzn6';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{"success": true, "message": "Question version retrieved successfully", "data": {...}}
Example response (404):
{
"success": false,
"message": "History record not found"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Restore question to a previous version (owner only)
Example request:
curl --request POST \
"http://localhost:8000/v1/questions/58C6f7nnFCJ9M6rjyc6rTKMzn6/restore/58C6f7nnFCJ9M6rjyc6rTKMzn6" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"version_note\": \"Restored from version before error\"
}"
const url = new URL(
"http://localhost:8000/v1/questions/58C6f7nnFCJ9M6rjyc6rTKMzn6/restore/58C6f7nnFCJ9M6rjyc6rTKMzn6"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"version_note": "Restored from version before error"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/questions/58C6f7nnFCJ9M6rjyc6rTKMzn6/restore/58C6f7nnFCJ9M6rjyc6rTKMzn6';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'version_note' => 'Restored from version before error',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{"success": true, "message": "Question restored successfully", "data": {...}}
Example response (403):
{
"success": false,
"message": "Question with ID ... belongs to another tenant"
}
Example response (404):
{
"success": false,
"message": "Question or history record not found"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Question Management
List all questions with filters
Example request:
curl --request GET \
--get "http://localhost:8000/v1/questions?per_page=20&page=1&ids=01ARZ3NDEKTSV4RRFFQ69G5FAV&type=multiplechoice%2Cmultiple_choice&is_public=1&search=math&created_at_gte=2024-01-01&created_at_lte=2024-12-31&tags=difficulty%3Ahard%2Ctopic%3Amath&tag_mode=and&languages=de%2Cde-DE&subjects=physics&difficulties=easy&has_versions=1&sort=-versions_count%2Ctitle.de&include_public=1&include_summary=1" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/questions"
);
const params = {
"per_page": "20",
"page": "1",
"ids": "01ARZ3NDEKTSV4RRFFQ69G5FAV",
"type": "multiplechoice,multiple_choice",
"is_public": "1",
"search": "math",
"created_at_gte": "2024-01-01",
"created_at_lte": "2024-12-31",
"tags": "difficulty:hard,topic:math",
"tag_mode": "and",
"languages": "de,de-DE",
"subjects": "physics",
"difficulties": "easy",
"has_versions": "1",
"sort": "-versions_count,title.de",
"include_public": "1",
"include_summary": "1",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/questions';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'query' => [
'per_page' => '20',
'page' => '1',
'ids' => '01ARZ3NDEKTSV4RRFFQ69G5FAV',
'type' => 'multiplechoice,multiple_choice',
'is_public' => '1',
'search' => 'math',
'created_at_gte' => '2024-01-01',
'created_at_lte' => '2024-12-31',
'tags' => 'difficulty:hard,topic:math',
'tag_mode' => 'and',
'languages' => 'de,de-DE',
'subjects' => 'physics',
'difficulties' => 'easy',
'has_versions' => '1',
'sort' => '-versions_count,title.de',
'include_public' => '1',
'include_summary' => '1',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{"success": true, "message": "Questions retrieved successfully", "data": [...], "meta": {"pagination": {...}}}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Create new question
Example request:
curl --request POST \
"http://localhost:8000/v1/questions" \
--header "Content-Type: multipart/form-data" \
--header "Accept: application/json" \
--form "title[]=architecto"\
--form "prompt[]=architecto"\
--form "type=multiple_choice"\
--form "is_public=1"\
--form "instructions[]=architecto"\
--form "feedbacks[]=architecto"\
--form "media_id=01ARZ3NDEKTSV4RRFFQ69G5FAV"\
--form "media_url=https://example.com/image.jpg"\
--form "logic[]=architecto"\
--form "version_note=Initial version"\
--form "media_file=@/tmp/php4c1115a66j6fegrknoY" const url = new URL(
"http://localhost:8000/v1/questions"
);
const headers = {
"Content-Type": "multipart/form-data",
"Accept": "application/json",
};
const body = new FormData();
body.append('title[]', 'architecto');
body.append('prompt[]', 'architecto');
body.append('type', 'multiple_choice');
body.append('is_public', '1');
body.append('instructions[]', 'architecto');
body.append('feedbacks[]', 'architecto');
body.append('media_id', '01ARZ3NDEKTSV4RRFFQ69G5FAV');
body.append('media_url', 'https://example.com/image.jpg');
body.append('logic[]', 'architecto');
body.append('version_note', 'Initial version');
body.append('media_file', document.querySelector('input[name="media_file"]').files[0]);
fetch(url, {
method: "POST",
headers,
body,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/questions';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'multipart/form-data',
'Accept' => 'application/json',
],
'multipart' => [
[
'name' => 'title[]',
'contents' => 'architecto'
],
[
'name' => 'prompt[]',
'contents' => 'architecto'
],
[
'name' => 'type',
'contents' => 'multiple_choice'
],
[
'name' => 'is_public',
'contents' => '1'
],
[
'name' => 'instructions[]',
'contents' => 'architecto'
],
[
'name' => 'feedbacks[]',
'contents' => 'architecto'
],
[
'name' => 'media_id',
'contents' => '01ARZ3NDEKTSV4RRFFQ69G5FAV'
],
[
'name' => 'media_url',
'contents' => 'https://example.com/image.jpg'
],
[
'name' => 'logic[]',
'contents' => 'architecto'
],
[
'name' => 'version_note',
'contents' => 'Initial version'
],
[
'name' => 'media_file',
'contents' => fopen('/tmp/php4c1115a66j6fegrknoY', 'r')
],
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (201):
{"success": true, "message": "Question created successfully", "data": {...}}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Preview unsaved authoring content as a learner question. Uses the create body, or partial update body when an ID is supplied.
Example request:
curl --request POST \
"http://localhost:8000/v1/questions/preview" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"seed\": 16
}"
const url = new URL(
"http://localhost:8000/v1/questions/preview"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"seed": 16
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/questions/preview';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'seed' => 16,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"data": {
"snapshot": {},
"seed": 37
}
}
Example response (422):
{
"success": false,
"message": "Formula preview could not be resolved."
}
Example response (429):
{
"success": false,
"message": "Too Many Attempts."
}
Example response (503):
{
"success": false,
"message": "Formula preview is unavailable. Please try again later."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Preview unsaved authoring content as a learner question. Uses the create body, or partial update body when an ID is supplied.
Example request:
curl --request POST \
"http://localhost:8000/v1/questions/58C6f7nnFCJ9M6rjyc6rTKMzn6/preview" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"seed\": 16
}"
const url = new URL(
"http://localhost:8000/v1/questions/58C6f7nnFCJ9M6rjyc6rTKMzn6/preview"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"seed": 16
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/questions/58C6f7nnFCJ9M6rjyc6rTKMzn6/preview';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'seed' => 16,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"data": {
"snapshot": {},
"seed": 37
}
}
Example response (422):
{
"success": false,
"message": "Formula preview could not be resolved."
}
Example response (429):
{
"success": false,
"message": "Too Many Attempts."
}
Example response (503):
{
"success": false,
"message": "Formula preview is unavailable. Please try again later."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
List all public questions (across all tenants)
Example request:
curl --request GET \
--get "http://localhost:8000/v1/questions/public?per_page=20&page=1" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"per_page\": 1,
\"page\": 22
}"
const url = new URL(
"http://localhost:8000/v1/questions/public"
);
const params = {
"per_page": "20",
"page": "1",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"per_page": 1,
"page": 22
};
fetch(url, {
method: "GET",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/questions/public';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'query' => [
'per_page' => '20',
'page' => '1',
],
'json' => [
'per_page' => 1,
'page' => 22,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{"success": true, "message": "Public questions retrieved successfully", "data": [...], "meta": {"pagination": {...}}}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
List question types currently enabled for authoring. Mirrors `config/module_question.enabled_types`. Admins use this to hide disabled types from the question creation UI. Disabled types remain queryable in list endpoints for legacy data — only authoring is gated.
Example request:
curl --request GET \
--get "http://localhost:8000/v1/questions/meta/types" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/questions/meta/types"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/questions/meta/types';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{"success": true, "message": "Enabled question types", "data": {"types": [{"key": "multiplechoice"}, ...]}}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
The title languages, subjects and difficulties the question list can be filtered by, as stored, in the list's scope; base subjects and difficulty levels with their German and English labels.
Example request:
curl --request GET \
--get "http://localhost:8000/v1/questions/facets?include_public=1" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
const url = new URL(
"http://localhost:8000/v1/questions/facets"
);
const params = {
"include_public": "1",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/questions/facets';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'query' => [
'include_public' => '1',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "Full authentication required. Anonymous access not allowed for this endpoint.",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Bulk delete questions (owner only)
Example request:
curl --request POST \
"http://localhost:8000/v1/questions/bulk-delete" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"ids\": [
\"01ARZ3...\",
\"01ARZ4...\"
]
}"
const url = new URL(
"http://localhost:8000/v1/questions/bulk-delete"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"ids": [
"01ARZ3...",
"01ARZ4..."
]
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/questions/bulk-delete';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'ids' => [
'01ARZ3...',
'01ARZ4...',
],
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"message": "Bulk delete completed",
"data": {
"deleted_count": 5,
"errors": []
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Get question by ID
Example request:
curl --request GET \
--get "http://localhost:8000/v1/questions/58C6f7nnFCJ9M6rjyc6rTKMzn6" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/questions/58C6f7nnFCJ9M6rjyc6rTKMzn6"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/questions/58C6f7nnFCJ9M6rjyc6rTKMzn6';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{"success": true, "message": "Question retrieved successfully", "data": {...}}
Example response (404):
{
"success": false,
"message": "Question not found"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Update question by ID (owner only)
Example request:
curl --request PUT \
"http://localhost:8000/v1/questions/58C6f7nnFCJ9M6rjyc6rTKMzn6" \
--header "Content-Type: multipart/form-data" \
--header "Accept: application/json" \
--form "title[]=architecto"\
--form "prompt[]=architecto"\
--form "type=architecto"\
--form "is_public="\
--form "instructions[]=architecto"\
--form "feedbacks[]=architecto"\
--form "media_id=architecto"\
--form "media_url=http://www.bailey.biz/quos-velit-et-fugiat-sunt-nihil-accusantium-harum.html"\
--form "logic[]=architecto"\
--form "version_note=Fixed typo in title"\
--form "media_file=@/tmp/phpccqh8eng5ddo8A6XhIU" const url = new URL(
"http://localhost:8000/v1/questions/58C6f7nnFCJ9M6rjyc6rTKMzn6"
);
const headers = {
"Content-Type": "multipart/form-data",
"Accept": "application/json",
};
const body = new FormData();
body.append('title[]', 'architecto');
body.append('prompt[]', 'architecto');
body.append('type', 'architecto');
body.append('is_public', '');
body.append('instructions[]', 'architecto');
body.append('feedbacks[]', 'architecto');
body.append('media_id', 'architecto');
body.append('media_url', 'http://www.bailey.biz/quos-velit-et-fugiat-sunt-nihil-accusantium-harum.html');
body.append('logic[]', 'architecto');
body.append('version_note', 'Fixed typo in title');
body.append('media_file', document.querySelector('input[name="media_file"]').files[0]);
fetch(url, {
method: "PUT",
headers,
body,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/questions/58C6f7nnFCJ9M6rjyc6rTKMzn6';
$response = $client->put(
$url,
[
'headers' => [
'Content-Type' => 'multipart/form-data',
'Accept' => 'application/json',
],
'multipart' => [
[
'name' => 'title[]',
'contents' => 'architecto'
],
[
'name' => 'prompt[]',
'contents' => 'architecto'
],
[
'name' => 'type',
'contents' => 'architecto'
],
[
'name' => 'is_public',
'contents' => ''
],
[
'name' => 'instructions[]',
'contents' => 'architecto'
],
[
'name' => 'feedbacks[]',
'contents' => 'architecto'
],
[
'name' => 'media_id',
'contents' => 'architecto'
],
[
'name' => 'media_url',
'contents' => 'http://www.bailey.biz/quos-velit-et-fugiat-sunt-nihil-accusantium-harum.html'
],
[
'name' => 'logic[]',
'contents' => 'architecto'
],
[
'name' => 'version_note',
'contents' => 'Fixed typo in title'
],
[
'name' => 'media_file',
'contents' => fopen('/tmp/phpccqh8eng5ddo8A6XhIU', 'r')
],
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{"success": true, "message": "Question updated successfully", "data": {...}}
Example response (403):
{
"success": false,
"message": "Question with ID ... belongs to another tenant"
}
Example response (404):
{
"success": false,
"message": "Question not found"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Delete question by ID (soft delete, owner only)
Example request:
curl --request DELETE \
"http://localhost:8000/v1/questions/58C6f7nnFCJ9M6rjyc6rTKMzn6" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"version_note\": \"Removed outdated content\"
}"
const url = new URL(
"http://localhost:8000/v1/questions/58C6f7nnFCJ9M6rjyc6rTKMzn6"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"version_note": "Removed outdated content"
};
fetch(url, {
method: "DELETE",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/questions/58C6f7nnFCJ9M6rjyc6rTKMzn6';
$response = $client->delete(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'version_note' => 'Removed outdated content',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{"success": true, "message": "Question deleted successfully", "data": {...}}
Example response (403):
{
"success": false,
"message": "Question with ID ... belongs to another tenant"
}
Example response (404):
{
"success": false,
"message": "Question not found"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Duplicate a question
Example request:
curl --request POST \
"http://localhost:8000/v1/questions/58C6f7nnFCJ9M6rjyc6rTKMzn6/duplicate" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"overrides\": [
\"architecto\"
]
}"
const url = new URL(
"http://localhost:8000/v1/questions/58C6f7nnFCJ9M6rjyc6rTKMzn6/duplicate"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"overrides": [
"architecto"
]
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/questions/58C6f7nnFCJ9M6rjyc6rTKMzn6/duplicate';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'overrides' => [
'architecto',
],
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (201):
{"success": true, "message": "Question duplicated successfully", "data": {...}}
Example response (404):
{
"success": false,
"message": "Question not found"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Question Tagging
List all tags used by questions
List contexts available for questions
Get tags for a specific question
Assign tag(s) to question
Remove tag(s) from question
Bulk assign tags to multiple questions
Quiz paths
Learners' view of quiz paths (packages of short tests). {package} is the
package's ID or slug; only published quiz paths of the caller's tenant are
visible to learners.
The learner's progress in every quiz path of the tenant
Example request:
curl --request GET \
--get "http://localhost:8000/v1/packages/progress" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/packages/progress"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/packages/progress';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "Authentication required. Please provide a valid access token.",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
A quiz path with the learner's state and suggested next tests
Example request:
curl --request GET \
--get "http://localhost:8000/v1/packages/architecto/path?after_attempt=01J0000000000000000000000" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"after_attempt\": \"bngzmiyvdljnikhwaykcmyuwpw\"
}"
const url = new URL(
"http://localhost:8000/v1/packages/architecto/path"
);
const params = {
"after_attempt": "01J0000000000000000000000",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"after_attempt": "bngzmiyvdljnikhwaykcmyuwpw"
};
fetch(url, {
method: "GET",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/packages/architecto/path';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'query' => [
'after_attempt' => '01J0000000000000000000000',
],
'json' => [
'after_attempt' => 'bngzmiyvdljnikhwaykcmyuwpw',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "Authentication required. Please provide a valid access token.",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
The combined evaluation of the learner's tests in a quiz path
Example request:
curl --request GET \
--get "http://localhost:8000/v1/packages/architecto/evaluation" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/packages/architecto/evaluation"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/packages/architecto/evaluation';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "Authentication required. Please provide a valid access token.",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Record which test the learner picked to continue with
Example request:
curl --request POST \
"http://localhost:8000/v1/packages/architecto/choices" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/packages/architecto/choices"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "POST",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/packages/architecto/choices';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
RBAC Management
Get my effective permissions Returns the current authenticated user's effective permissions after grant/deny resolution. Public endpoint - no rbac.manage permission required. Superadmin users have all permissions automatically.
Example request:
curl --request GET \
--get "http://localhost:8000/v1/rbac/me/permissions" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/rbac/me/permissions"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/rbac/me/permissions';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"message": "Effective permissions retrieved",
"data": [
"users.read",
"users.create",
"tenants.read",
"rbac.manage"
]
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Get my role Returns the current authenticated user's assigned role. If no role is explicitly assigned, returns the tenant's default role. Public endpoint - no rbac.manage permission required.
Example request:
curl --request GET \
--get "http://localhost:8000/v1/rbac/me/role" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/rbac/me/role"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/rbac/me/role';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"message": "Role retrieved",
"data": {
"id": "01ARZ3NDEKTSV4RRFFQ69G5FAV",
"name": "Administrator",
"slug": "admin",
"description": "Full system access",
"is_default": false,
"is_superadmin": false,
"tenant_id": "01ARZ3NDEKTSV4RRFFQ69G5FAV"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
List all permissions Returns all permissions in the tenant's RBAC system. Requires rbac.manage permission.
requires authentication
Example request:
curl --request GET \
--get "http://localhost:8000/v1/rbac/permissions" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/rbac/permissions"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/rbac/permissions';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"message": "Permissions retrieved",
"data": [
{
"id": "01ARZ3NDEKTSV4RRFFQ69G5FAV",
"slug": "users.read",
"name": "View Users",
"description": "View user list and details",
"resource": "users",
"action": "read",
"tenant_id": "01ARZ3NDEKTSV4RRFFQ69G5FAV"
}
]
}
Example response (403):
{
"success": false,
"message": "Insufficient permissions"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Create new permission Creates a new permission in the tenant's RBAC system. The slug must be unique within the tenant. Requires rbac.manage permission.
requires authentication
Example request:
curl --request POST \
"http://localhost:8000/v1/rbac/permissions" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"slug\": \"courses.publish\",
\"name\": \"Publish Courses\",
\"description\": \"Allows publishing courses to students\",
\"resource\": \"courses\",
\"action\": \"publish\"
}"
const url = new URL(
"http://localhost:8000/v1/rbac/permissions"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"slug": "courses.publish",
"name": "Publish Courses",
"description": "Allows publishing courses to students",
"resource": "courses",
"action": "publish"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/rbac/permissions';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'slug' => 'courses.publish',
'name' => 'Publish Courses',
'description' => 'Allows publishing courses to students',
'resource' => 'courses',
'action' => 'publish',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (201):
{
"success": true,
"message": "Permission created successfully",
"data": {
"id": "01ARZ3NDEKTSV4RRFFQ69G5FAV",
"slug": "courses.publish",
"name": "Publish Courses",
"description": "Allows publishing courses to students",
"resource": "courses",
"action": "publish",
"tenant_id": "01ARZ3NDEKTSV4RRFFQ69G5FAV"
}
}
Example response (400):
{
"success": false,
"message": "Permission with this slug already exists"
}
Example response (403):
{
"success": false,
"message": "Insufficient permissions"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Get permission by ID Returns a single permission by its ID. Requires rbac.manage permission.
requires authentication
Example request:
curl --request GET \
--get "http://localhost:8000/v1/rbac/permissions/01ARZ3NDEKTSV4RRFFQ69G5FAV" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/rbac/permissions/01ARZ3NDEKTSV4RRFFQ69G5FAV"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/rbac/permissions/01ARZ3NDEKTSV4RRFFQ69G5FAV';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"message": "Permission retrieved",
"data": {
"id": "01ARZ3NDEKTSV4RRFFQ69G5FAV",
"slug": "users.create",
"name": "Create Users",
"description": "Create new user accounts",
"resource": "users",
"action": "create",
"tenant_id": "01ARZ3NDEKTSV4RRFFQ69G5FAV"
}
}
Example response (403):
{
"success": false,
"message": "Insufficient permissions"
}
Example response (404):
{
"success": false,
"message": "Permission not found"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Update permission Updates an existing permission. The slug cannot be changed after creation. Requires rbac.manage permission.
requires authentication
Example request:
curl --request PUT \
"http://localhost:8000/v1/rbac/permissions/01ARZ3NDEKTSV4RRFFQ69G5FAV" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"name\": \"Create Users\",
\"description\": \"Create new user accounts\",
\"resource\": \"users\",
\"action\": \"create\"
}"
const url = new URL(
"http://localhost:8000/v1/rbac/permissions/01ARZ3NDEKTSV4RRFFQ69G5FAV"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"name": "Create Users",
"description": "Create new user accounts",
"resource": "users",
"action": "create"
};
fetch(url, {
method: "PUT",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/rbac/permissions/01ARZ3NDEKTSV4RRFFQ69G5FAV';
$response = $client->put(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'name' => 'Create Users',
'description' => 'Create new user accounts',
'resource' => 'users',
'action' => 'create',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"message": "Permission updated successfully",
"data": {
"id": "01ARZ3NDEKTSV4RRFFQ69G5FAV",
"slug": "users.create",
"name": "Create Users",
"description": "Create new user accounts",
"resource": "users",
"action": "create",
"tenant_id": "01ARZ3NDEKTSV4RRFFQ69G5FAV"
}
}
Example response (403):
{
"success": false,
"message": "Insufficient permissions"
}
Example response (404):
{
"success": false,
"message": "Permission not found"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Delete permission Deletes a permission from the tenant's RBAC system. Cannot delete permissions that are currently assigned to roles. Requires rbac.manage permission.
requires authentication
Example request:
curl --request DELETE \
"http://localhost:8000/v1/rbac/permissions/01ARZ3NDEKTSV4RRFFQ69G5FAV" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/rbac/permissions/01ARZ3NDEKTSV4RRFFQ69G5FAV"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "DELETE",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/rbac/permissions/01ARZ3NDEKTSV4RRFFQ69G5FAV';
$response = $client->delete(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"message": "Permission deleted successfully",
"data": null
}
Example response (400):
{
"success": false,
"message": "Cannot delete permission: currently assigned to roles"
}
Example response (403):
{
"success": false,
"message": "Insufficient permissions"
}
Example response (404):
{
"success": false,
"message": "Permission not found"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
List all roles Returns all roles in the tenant's RBAC system. Requires rbac.manage permission.
requires authentication
Example request:
curl --request GET \
--get "http://localhost:8000/v1/rbac/roles" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/rbac/roles"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/rbac/roles';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"message": "Roles retrieved",
"data": [
{
"id": "01ARZ3NDEKTSV4RRFFQ69G5FAV",
"name": "Administrator",
"slug": "admin",
"description": "Full system access",
"is_default": false,
"is_superadmin": false,
"tenant_id": "01ARZ3NDEKTSV4RRFFQ69G5FAV"
}
]
}
Example response (403):
{
"success": false,
"message": "Insufficient permissions"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Create new role Creates a new role in the tenant's RBAC system. The slug must be unique within the tenant. Only one role can be marked as default per tenant. Superadmin roles bypass all permission checks. Requires rbac.manage permission.
requires authentication
Example request:
curl --request POST \
"http://localhost:8000/v1/rbac/roles" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"name\": \"Content Manager\",
\"slug\": \"content-manager\",
\"description\": \"Manages course content and media\",
\"is_default\": false,
\"is_superadmin\": false
}"
const url = new URL(
"http://localhost:8000/v1/rbac/roles"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"name": "Content Manager",
"slug": "content-manager",
"description": "Manages course content and media",
"is_default": false,
"is_superadmin": false
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/rbac/roles';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'name' => 'Content Manager',
'slug' => 'content-manager',
'description' => 'Manages course content and media',
'is_default' => false,
'is_superadmin' => false,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (201):
{
"success": true,
"message": "Role created successfully",
"data": {
"id": "01ARZ3NDEKTSV4RRFFQ69G5FAV",
"name": "Content Manager",
"slug": "content-manager",
"description": "Manages course content and media",
"is_default": false,
"is_superadmin": false,
"tenant_id": "01ARZ3NDEKTSV4RRFFQ69G5FAV"
}
}
Example response (400):
{
"success": false,
"message": "Role with this slug already exists"
}
Example response (403):
{
"success": false,
"message": "Insufficient permissions"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Get default role Returns the tenant's default role (assigned to new users automatically). Only one default role can exist per tenant. Requires rbac.manage permission.
requires authentication
Example request:
curl --request GET \
--get "http://localhost:8000/v1/rbac/roles/default" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/rbac/roles/default"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/rbac/roles/default';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"message": "Default role retrieved",
"data": {
"id": "01ARZ3NDEKTSV4RRFFQ69G5FAV",
"name": "Default User",
"slug": "default",
"description": "Default permissions for new users",
"is_default": true,
"is_superadmin": false,
"tenant_id": "01ARZ3NDEKTSV4RRFFQ69G5FAV"
}
}
Example response (403):
{
"success": false,
"message": "Insufficient permissions"
}
Example response (404):
{
"success": false,
"message": "Role not found: default role for tenant 01ARZ3NDEKTSV4RRFFQ69G5FAV"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Get role by ID Returns a single role by its ID, including granted and denied permissions. Requires rbac.manage permission.
requires authentication
Example request:
curl --request GET \
--get "http://localhost:8000/v1/rbac/roles/01ARZ3NDEKTSV4RRFFQ69G5FAV" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/rbac/roles/01ARZ3NDEKTSV4RRFFQ69G5FAV"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/rbac/roles/01ARZ3NDEKTSV4RRFFQ69G5FAV';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"message": "Role retrieved",
"data": {
"id": "01ARZ3NDEKTSV4RRFFQ69G5FAV",
"name": "Administrator",
"slug": "admin",
"description": "Full system access",
"is_default": false,
"is_superadmin": false,
"tenant_id": "01ARZ3NDEKTSV4RRFFQ69G5FAV",
"granted_permissions": [
"users.read",
"users.create"
],
"denied_permissions": []
}
}
Example response (403):
{
"success": false,
"message": "Insufficient permissions"
}
Example response (404):
{
"success": false,
"message": "Role not found"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Update role Updates an existing role. The slug cannot be changed after creation. Setting is_default to true will unset any other default role. Requires rbac.manage permission.
requires authentication
Example request:
curl --request PUT \
"http://localhost:8000/v1/rbac/roles/01ARZ3NDEKTSV4RRFFQ69G5FAV" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"name\": \"Content Manager\",
\"description\": \"Manages course content and media\",
\"is_default\": false,
\"is_superadmin\": false
}"
const url = new URL(
"http://localhost:8000/v1/rbac/roles/01ARZ3NDEKTSV4RRFFQ69G5FAV"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"name": "Content Manager",
"description": "Manages course content and media",
"is_default": false,
"is_superadmin": false
};
fetch(url, {
method: "PUT",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/rbac/roles/01ARZ3NDEKTSV4RRFFQ69G5FAV';
$response = $client->put(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'name' => 'Content Manager',
'description' => 'Manages course content and media',
'is_default' => false,
'is_superadmin' => false,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"message": "Role updated successfully",
"data": {
"id": "01ARZ3NDEKTSV4RRFFQ69G5FAV",
"name": "Content Manager",
"slug": "content-manager",
"description": "Manages course content and media",
"is_default": false,
"is_superadmin": false,
"tenant_id": "01ARZ3NDEKTSV4RRFFQ69G5FAV"
}
}
Example response (403):
{
"success": false,
"message": "Insufficient permissions"
}
Example response (404):
{
"success": false,
"message": "Role not found"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Delete role Deletes a role from the tenant's RBAC system. Cannot delete the default role or roles currently assigned to users. Requires rbac.manage permission.
requires authentication
Example request:
curl --request DELETE \
"http://localhost:8000/v1/rbac/roles/01ARZ3NDEKTSV4RRFFQ69G5FAV" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/rbac/roles/01ARZ3NDEKTSV4RRFFQ69G5FAV"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "DELETE",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/rbac/roles/01ARZ3NDEKTSV4RRFFQ69G5FAV';
$response = $client->delete(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"message": "Role deleted successfully",
"data": null
}
Example response (400):
{
"success": false,
"message": "Cannot delete default role or role assigned to users"
}
Example response (403):
{
"success": false,
"message": "Insufficient permissions"
}
Example response (404):
{
"success": false,
"message": "Role not found"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Sync role permissions Synchronizes a role's granted and denied permissions. Permissions not in either list will be removed from the role. Explicit grants override denies (if a permission appears in both lists, it will be granted). Requires rbac.manage permission.
requires authentication
Example request:
curl --request PUT \
"http://localhost:8000/v1/rbac/roles/01ARZ3NDEKTSV4RRFFQ69G5FAV/permissions/sync" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"grant_permission_ids\": [
\"01ARZ3NDEKTSV4RRFFQ69G5FAV\",
\"01ARZ3NDEKTSV4RRFFQ69G5FAW\"
],
\"deny_permission_ids\": [
\"01ARZ3NDEKTSV4RRFFQ69G5FAX\"
]
}"
const url = new URL(
"http://localhost:8000/v1/rbac/roles/01ARZ3NDEKTSV4RRFFQ69G5FAV/permissions/sync"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"grant_permission_ids": [
"01ARZ3NDEKTSV4RRFFQ69G5FAV",
"01ARZ3NDEKTSV4RRFFQ69G5FAW"
],
"deny_permission_ids": [
"01ARZ3NDEKTSV4RRFFQ69G5FAX"
]
};
fetch(url, {
method: "PUT",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/rbac/roles/01ARZ3NDEKTSV4RRFFQ69G5FAV/permissions/sync';
$response = $client->put(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'grant_permission_ids' => [
'01ARZ3NDEKTSV4RRFFQ69G5FAV',
'01ARZ3NDEKTSV4RRFFQ69G5FAW',
],
'deny_permission_ids' => [
'01ARZ3NDEKTSV4RRFFQ69G5FAX',
],
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"message": "Role permissions synced successfully",
"data": {
"id": "01ARZ3NDEKTSV4RRFFQ69G5FAV",
"name": "Content Manager",
"slug": "content-manager",
"description": "Manages course content",
"is_default": false,
"is_superadmin": false,
"tenant_id": "01ARZ3NDEKTSV4RRFFQ69G5FAV",
"granted_permissions": [
"courses.read",
"courses.create"
],
"denied_permissions": [
"courses.delete"
]
}
}
Example response (403):
{
"success": false,
"message": "Insufficient permissions"
}
Example response (404):
{
"success": false,
"message": "Role not found or permission not found"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Assign role to user Assigns a role to a user (identity) in the tenant. If the user already has a role assignment, it will be updated. Requires rbac.manage permission.
requires authentication
Example request:
curl --request POST \
"http://localhost:8000/v1/rbac/users/assign-role" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"identity_id\": \"01ARZ3NDEKTSV4RRFFQ69G5FAV\",
\"role_id\": \"01ARZ3NDEKTSV4RRFFQ69G5FAW\"
}"
const url = new URL(
"http://localhost:8000/v1/rbac/users/assign-role"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"identity_id": "01ARZ3NDEKTSV4RRFFQ69G5FAV",
"role_id": "01ARZ3NDEKTSV4RRFFQ69G5FAW"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/rbac/users/assign-role';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'identity_id' => '01ARZ3NDEKTSV4RRFFQ69G5FAV',
'role_id' => '01ARZ3NDEKTSV4RRFFQ69G5FAW',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (201):
{
"success": true,
"message": "Role assigned successfully",
"data": {
"id": "01ARZ3NDEKTSV4RRFFQ69G5FAY",
"identity_id": "01ARZ3NDEKTSV4RRFFQ69G5FAV",
"role_id": "01ARZ3NDEKTSV4RRFFQ69G5FAW",
"tenant_id": "01ARZ3NDEKTSV4RRFFQ69G5FAZ",
"assigned_by": "01ARZ3NDEKTSV4RRFFQ69G5FAA",
"assigned_at": "2024-01-15T10:30:00Z"
}
}
Example response (403):
{
"success": false,
"message": "Insufficient permissions"
}
Example response (404):
{
"success": false,
"message": "Identity not found or role not found"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Revoke user's role Revokes (removes) the role assignment from a user. The user will fall back to the tenant's default role if one exists. Requires rbac.manage permission.
requires authentication
Example request:
curl --request DELETE \
"http://localhost:8000/v1/rbac/users/01ARZ3NDEKTSV4RRFFQ69G5FAV/revoke-role" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/rbac/users/01ARZ3NDEKTSV4RRFFQ69G5FAV/revoke-role"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "DELETE",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/rbac/users/01ARZ3NDEKTSV4RRFFQ69G5FAV/revoke-role';
$response = $client->delete(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"message": "Role revoked successfully",
"data": null
}
Example response (403):
{
"success": false,
"message": "Insufficient permissions"
}
Example response (404):
{
"success": false,
"message": "User has no role assignment"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Get user's role Returns the role assigned to a specific user. If no role is explicitly assigned, returns the tenant's default role. Requires rbac.manage permission.
requires authentication
Example request:
curl --request GET \
--get "http://localhost:8000/v1/rbac/users/01ARZ3NDEKTSV4RRFFQ69G5FAV/role" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/rbac/users/01ARZ3NDEKTSV4RRFFQ69G5FAV/role"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/rbac/users/01ARZ3NDEKTSV4RRFFQ69G5FAV/role';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"message": "User role retrieved",
"data": {
"id": "01ARZ3NDEKTSV4RRFFQ69G5FAV",
"name": "Content Manager",
"slug": "content-manager",
"description": "Manages course content",
"is_default": false,
"is_superadmin": false,
"tenant_id": "01ARZ3NDEKTSV4RRFFQ69G5FAV"
}
}
Example response (403):
{
"success": false,
"message": "Insufficient permissions"
}
Example response (404):
{
"success": false,
"message": "Identity not found"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Get user's effective permissions Returns the effective permissions for a specific user after grant/deny resolution. Takes into account the user's assigned role and its permission grants/denies. Superadmin users will have all permissions. Requires rbac.manage permission.
requires authentication
Example request:
curl --request GET \
--get "http://localhost:8000/v1/rbac/users/01ARZ3NDEKTSV4RRFFQ69G5FAV/effective-permissions" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/rbac/users/01ARZ3NDEKTSV4RRFFQ69G5FAV/effective-permissions"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/rbac/users/01ARZ3NDEKTSV4RRFFQ69G5FAV/effective-permissions';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"message": "User effective permissions retrieved",
"data": [
"courses.read",
"courses.create",
"courses.update",
"media.read"
]
}
Example response (403):
{
"success": false,
"message": "Insufficient permissions"
}
Example response (404):
{
"success": false,
"message": "Identity not found"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Single Sign-On
List sign-in providers Providers the current tenant's sign-in page offers, sorted for display, with the tenant's login mode. `kind` is `platform` for providers that the platform operates and `tenant` for the tenant's own. Tenants with `local_only` offer none.
Example request:
curl --request GET \
--get "http://localhost:8000/v1/sso/providers" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/sso/providers"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/sso/providers';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"message": "Providers retrieved successfully",
"data": {
"mode": "local_and_sso",
"primary_provider": "tuhh",
"providers": [
{
"key": "tuhh",
"display_name": "TUHH-Login",
"driver": "oidc",
"icon": "ri-building-4-line",
"kind": "tenant"
},
{
"key": "google",
"display_name": "Google",
"driver": "google",
"icon": "ri-google-fill",
"kind": "platform"
}
]
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Start a sign-in Browser navigation, not an XHR call. Redirects to the provider's sign-in page. Linking a provider (`intent=link`) and test logins (`intent=test`) need the ticket from their own endpoints. Sign-ins (`intent=login`) need `browser_challenge`: the base64url SHA-256 hash of a random secret that the browser keeps for the code exchange. When the provider is not available, the browser returns to `return_to` with `sso_error=provider_unavailable`. A `return_to` outside the allowed frontends is refused with 400.
Example request:
curl --request GET \
--get "http://localhost:8000/v1/sso/redirect?tenant=mintfit-hamburg&provider=google&return_to=http%3A%2F%2Flocalhost%3A3001%2Fauth%2Fcallback&intent=login&ticket=architecto&browser_challenge=E9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSstw-cM" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/sso/redirect"
);
const params = {
"tenant": "mintfit-hamburg",
"provider": "google",
"return_to": "http://localhost:3001/auth/callback",
"intent": "login",
"ticket": "architecto",
"browser_challenge": "E9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSstw-cM",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/sso/redirect';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'query' => [
'tenant' => 'mintfit-hamburg',
'provider' => 'google',
'return_to' => 'http://localhost:3001/auth/callback',
'intent' => 'login',
'ticket' => 'architecto',
'browser_challenge' => 'E9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSstw-cM',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (302, Redirect to the provider):
Example response (400):
{
"success": false,
"message": "The return URL is not an allowed frontend.",
"errors": {
"code": "invalid_return_to"
}
}
Example response (500):
Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 20
x-ratelimit-remaining: 19
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "Internal Server Error",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Provider callback Where every provider returns the browser to, for all tenants (GET, or POST for Apple). Redirects to the frontend's `return_to` with one of: `sso_code` (sign-in succeeded; exchange it within 60 seconds), `sso_result=linked&provider=…`, `sso_test=…`, or `sso_error=…&provider=…` with `sso_pending=…` for `account_exists` and `email_required`. An unknown or used state cannot be returned anywhere and gets 400 with `errors.code=expired`.
Example request:
curl --request GET \
--get "http://localhost:8000/v1/sso/callback" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/sso/callback"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/sso/callback';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (302, Redirect to the frontend):
Example response (400):
{
"success": false,
"message": "This sign-in has expired or was already used. Please start again.",
"errors": {
"code": "expired"
}
}
Example response (400):
Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 20
x-ratelimit-remaining: 19
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "This sign-in has expired or was already used. Please start again.",
"errors": {
"code": "expired"
},
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Exchange the sign-in code Trades the one-time `sso_code` from the callback for tokens. The response equals the password login, plus `event`: `login` or `registered`. Only the browser that started the sign-in can trade the code: it sends the secret whose hash it passed as `browser_challenge`. A provider that the tenant stopped offering since the callback (disabled, deleted, sharing withdrawn, local login only) is refused with 409 `provider_unavailable`.
Example request:
curl --request POST \
"http://localhost:8000/v1/identity/sso/exchange" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"code\": \"architecto\",
\"browser_secret\": \"architecto\"
}"
const url = new URL(
"http://localhost:8000/v1/identity/sso/exchange"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"code": "architecto",
"browser_secret": "architecto"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/identity/sso/exchange';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'code' => 'architecto',
'browser_secret' => 'architecto',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"message": "Login successful",
"data": {
"user": {
"id": "01kav3fcmme10dwbeexyqkfndn",
"email": "user@example.com"
},
"tokens": {
"access_token": "eyJ0eXAiOiJKV1QiLCJhbGc...",
"refresh_token": "eyJ0eXAiOiJKV1QiLCJhbGc...",
"token_type": "Bearer",
"expires_in": 86400
},
"event": "login"
}
}
Example response (400):
{
"success": false,
"message": "This sign-in has expired or was already used. Please start again.",
"errors": {
"code": "expired"
}
}
Example response (409):
{
"success": false,
"message": "The provider is no longer available.",
"errors": {
"code": "provider_unavailable"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Complete an account without email address After `sso_error=email_required`, creates the account with the email address the person entered. The address receives the usual verification mail. Responds like the code exchange with `event=registered`. An address of an existing account is refused with 409 (`account_exists`); the pending ticket then stays valid.
Example request:
curl --request POST \
"http://localhost:8000/v1/identity/sso/complete-email" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"pending\": \"architecto\",
\"email\": \"anna@example.com\",
\"browser_secret\": \"architecto\"
}"
const url = new URL(
"http://localhost:8000/v1/identity/sso/complete-email"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"pending": "architecto",
"email": "anna@example.com",
"browser_secret": "architecto"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/identity/sso/complete-email';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'pending' => 'architecto',
'email' => 'anna@example.com',
'browser_secret' => 'architecto',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (409):
{
"success": false,
"message": "An account with this email address already exists.",
"errors": {
"code": "account_exists"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Single Sign-On Administration
Get sign-in settings Login mode, primary provider and the shared platform providers the tenant may offer. `identities_without_login_method_for_sso_only` counts the learners who could no longer sign in with `sso_only`: accounts without a linked provider and without a staff role.
requires authentication
Example request:
curl --request GET \
--get "http://localhost:8000/v1/sso/admin/settings" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/sso/admin/settings"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/sso/admin/settings';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"message": "Settings retrieved successfully",
"data": {
"mode": "local_and_sso",
"primary_provider_id": null,
"shared_providers": [
{
"id": "01J...",
"key": "google",
"display_name": "Google",
"driver": "google",
"icon": "ri-google-fill",
"enabled_for_tenant": true
}
],
"is_platform_tenant": false,
"identities_without_login_method_for_sso_only": 42
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Update sign-in settings `sso_only` needs a primary provider that is an active provider of the tenant or one of the shared providers it offers. Returns the settings.
requires authentication
Example request:
curl --request PUT \
"http://localhost:8000/v1/sso/admin/settings" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"mode\": \"local_and_sso\",
\"primary_provider_id\": \"architecto\",
\"shared_provider_ids\": [
\"architecto\"
]
}"
const url = new URL(
"http://localhost:8000/v1/sso/admin/settings"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"mode": "local_and_sso",
"primary_provider_id": "architecto",
"shared_provider_ids": [
"architecto"
]
};
fetch(url, {
method: "PUT",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/sso/admin/settings';
$response = $client->put(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'mode' => 'local_and_sso',
'primary_provider_id' => 'architecto',
'shared_provider_ids' => [
'architecto',
],
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
List providers The acting tenant's own providers. Secrets are never returned, only `has_client_secret` and `apple.has_private_key`.
requires authentication
Example request:
curl --request GET \
--get "http://localhost:8000/v1/sso/admin/providers" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/sso/admin/providers"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/sso/admin/providers';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (400):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "A valid Tenant context is required for this request. Please provide a valid X-Tenant-ID header.",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Create a provider Partners create `oidc` providers. The platform tenant also creates one provider per preset driver (`google`, `microsoft`, `apple`, `facebook`, `github`, `tiktok`) and may share providers with partners. Slugs are unique per tenant and never overlap between partners and the platform. Outside local development, issuer and discovery URLs must use https.
requires authentication
Example request:
curl --request POST \
"http://localhost:8000/v1/sso/admin/providers" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"slug\": \"tuhh\",
\"driver\": \"oidc\",
\"display_name\": \"TUHH-Login\",
\"icon\": \"ri-building-4-line\",
\"enabled\": true,
\"shared\": false,
\"sort_order\": 0,
\"issuer_url\": \"https:\\/\\/login.tuhh.de\\/realms\\/tuhh\",
\"discovery_url\": \"http:\\/\\/www.bailey.biz\\/quos-velit-et-fugiat-sunt-nihil-accusantium-harum.html\",
\"scopes\": [
\"openid\",
\"email\",
\"profile\"
],
\"client_id\": \"mintfit\",
\"client_secret\": \"architecto\",
\"apple\": [],
\"settings\": []
}"
const url = new URL(
"http://localhost:8000/v1/sso/admin/providers"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"slug": "tuhh",
"driver": "oidc",
"display_name": "TUHH-Login",
"icon": "ri-building-4-line",
"enabled": true,
"shared": false,
"sort_order": 0,
"issuer_url": "https:\/\/login.tuhh.de\/realms\/tuhh",
"discovery_url": "http:\/\/www.bailey.biz\/quos-velit-et-fugiat-sunt-nihil-accusantium-harum.html",
"scopes": [
"openid",
"email",
"profile"
],
"client_id": "mintfit",
"client_secret": "architecto",
"apple": [],
"settings": []
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/sso/admin/providers';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'slug' => 'tuhh',
'driver' => 'oidc',
'display_name' => 'TUHH-Login',
'icon' => 'ri-building-4-line',
'enabled' => true,
'shared' => false,
'sort_order' => 0,
'issuer_url' => 'https://login.tuhh.de/realms/tuhh',
'discovery_url' => 'http://www.bailey.biz/quos-velit-et-fugiat-sunt-nihil-accusantium-harum.html',
'scopes' => [
'openid',
'email',
'profile',
],
'client_id' => 'mintfit',
'client_secret' => 'architecto',
'apple' => [],
'settings' => [],
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Get a provider
requires authentication
Example request:
curl --request GET \
--get "http://localhost:8000/v1/sso/admin/providers/58C6f7nnFCJ9M6rjyc6rTKMzn6" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/sso/admin/providers/58C6f7nnFCJ9M6rjyc6rTKMzn6"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/sso/admin/providers/58C6f7nnFCJ9M6rjyc6rTKMzn6';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (400):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "A valid Tenant context is required for this request. Please provide a valid X-Tenant-ID header.",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Update a provider Same fields as creating. Secrets that are left out stay unchanged. The driver cannot change.
requires authentication
Example request:
curl --request PUT \
"http://localhost:8000/v1/sso/admin/providers/58C6f7nnFCJ9M6rjyc6rTKMzn6" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/sso/admin/providers/58C6f7nnFCJ9M6rjyc6rTKMzn6"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "PUT",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/sso/admin/providers/58C6f7nnFCJ9M6rjyc6rTKMzn6';
$response = $client->put(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Delete a provider Also removes the login methods that use it. Refused with 422 (`provider_in_use_as_primary`) while it is the tenant's primary provider.
requires authentication
Example request:
curl --request DELETE \
"http://localhost:8000/v1/sso/admin/providers/58C6f7nnFCJ9M6rjyc6rTKMzn6" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/sso/admin/providers/58C6f7nnFCJ9M6rjyc6rTKMzn6"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "DELETE",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/sso/admin/providers/58C6f7nnFCJ9M6rjyc6rTKMzn6';
$response = $client->delete(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Test a provider's connection Checks discovery, signing keys and client credentials, without signing anybody in.
requires authentication
Example request:
curl --request POST \
"http://localhost:8000/v1/sso/admin/providers/58C6f7nnFCJ9M6rjyc6rTKMzn6/test" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/sso/admin/providers/58C6f7nnFCJ9M6rjyc6rTKMzn6/test"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "POST",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/sso/admin/providers/58C6f7nnFCJ9M6rjyc6rTKMzn6/test';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"message": "Provider tested",
"data": {
"ok": true,
"checks": [
{
"name": "discovery",
"ok": true,
"message": "..."
},
{
"name": "jwks",
"ok": true,
"message": "..."
},
{
"name": "credentials",
"ok": true,
"message": "..."
}
]
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Start a test login Returns the URL to navigate the browser to. The browser returns to `return_to` with `sso_test=<id>`. No account is created or changed.
requires authentication
Example request:
curl --request POST \
"http://localhost:8000/v1/sso/admin/providers/58C6f7nnFCJ9M6rjyc6rTKMzn6/test-login" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"return_to\": \"architecto\"
}"
const url = new URL(
"http://localhost:8000/v1/sso/admin/providers/58C6f7nnFCJ9M6rjyc6rTKMzn6/test-login"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"return_to": "architecto"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/sso/admin/providers/58C6f7nnFCJ9M6rjyc6rTKMzn6/test-login';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'return_to' => 'architecto',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"message": "Test login started",
"data": {
"redirect_url": "http://localhost:8000/v1/sso/redirect?...&intent=test&ticket=..."
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Get a test login result What the provider said about the person, for ten minutes, to the administrator who started the test.
requires authentication
Example request:
curl --request GET \
--get "http://localhost:8000/v1/sso/admin/test-results/architecto" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/sso/admin/test-results/architecto"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/sso/admin/test-results/architecto';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"message": "Test result retrieved successfully",
"data": {
"provider_key": "tuhh",
"subject": "f81d4fae",
"email": "anna@tuhh.de",
"email_verified": true,
"name": "Anna Example",
"raw_claims": {}
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
List failed sign-ins The tenant's latest 50 failed single sign-ons of the last 30 days, with the reason. Never contains tokens or secrets.
requires authentication
Example request:
curl --request GET \
--get "http://localhost:8000/v1/sso/admin/failures" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/sso/admin/failures"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/sso/admin/failures';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"message": "Failures retrieved successfully",
"data": [
{
"created_at": "2026-10-14T10:00:00+00:00",
"provider": {
"key": "tuhh",
"display_name": "TUHH-Login"
},
"code": "provider_error",
"detail": "The ID token was issued by another issuer."
}
]
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
List an account's login methods Same shape as the participant's own list, without `available`.
requires authentication
Example request:
curl --request GET \
--get "http://localhost:8000/v1/sso/admin/identities/58C6f7nnFCJ9M6rjyc6rTKMzn6/login-methods" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/sso/admin/identities/58C6f7nnFCJ9M6rjyc6rTKMzn6/login-methods"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/sso/admin/identities/58C6f7nnFCJ9M6rjyc6rTKMzn6/login-methods';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (400):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "A valid Tenant context is required for this request. Please provide a valid X-Tenant-ID header.",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Remove an account's login method Refused with 422 (`last_login_method`) when it is the account's only way to sign in.
requires authentication
Example request:
curl --request DELETE \
"http://localhost:8000/v1/sso/admin/identities/58C6f7nnFCJ9M6rjyc6rTKMzn6/login-methods/58C6f7nnFCJ9M6rjyc6rTKMzn6" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/sso/admin/identities/58C6f7nnFCJ9M6rjyc6rTKMzn6/login-methods/58C6f7nnFCJ9M6rjyc6rTKMzn6"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "DELETE",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/sso/admin/identities/58C6f7nnFCJ9M6rjyc6rTKMzn6/login-methods/58C6f7nnFCJ9M6rjyc6rTKMzn6';
$response = $client->delete(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Statistics
Get usage events (paginated) Returns a paginated list of usage events with optional filters.
Example request:
curl --request GET \
--get "http://localhost:8000/v1/statistics/events" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"identity_id\": \"architecto\",
\"event_type\": \"architecto\",
\"event_category\": \"architecto\",
\"entity_type\": \"architecto\",
\"entity_id\": \"architecto\",
\"start_date\": \"2026-11-03T00:49:05\",
\"end_date\": \"2052-11-26\",
\"per_page\": 22,
\"page\": 67
}"
const url = new URL(
"http://localhost:8000/v1/statistics/events"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"identity_id": "architecto",
"event_type": "architecto",
"event_category": "architecto",
"entity_type": "architecto",
"entity_id": "architecto",
"start_date": "2026-11-03T00:49:05",
"end_date": "2052-11-26",
"per_page": 22,
"page": 67
};
fetch(url, {
method: "GET",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/statistics/events';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'identity_id' => 'architecto',
'event_type' => 'architecto',
'event_category' => 'architecto',
'entity_type' => 'architecto',
'entity_id' => 'architecto',
'start_date' => '2026-11-03T00:49:05',
'end_date' => '2052-11-26',
'per_page' => 22,
'page' => 67,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "Full authentication required. Anonymous access not allowed for this endpoint.",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Get aggregated statistics summary Returns aggregated statistics for a time period, grouped by event type and category.
Example request:
curl --request GET \
--get "http://localhost:8000/v1/statistics/summary" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"start_date\": \"2026-11-03T00:49:05\",
\"end_date\": \"2052-11-26\",
\"group_by\": \"daily\"
}"
const url = new URL(
"http://localhost:8000/v1/statistics/summary"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"start_date": "2026-11-03T00:49:05",
"end_date": "2052-11-26",
"group_by": "daily"
};
fetch(url, {
method: "GET",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/statistics/summary';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'start_date' => '2026-11-03T00:49:05',
'end_date' => '2052-11-26',
'group_by' => 'daily',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "Full authentication required. Anonymous access not allowed for this endpoint.",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Compare two time periods Returns a comparison between two time periods with percentage changes.
Example request:
curl --request GET \
--get "http://localhost:8000/v1/statistics/compare" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"current_start\": \"2026-11-03T00:49:05\",
\"current_end\": \"2052-11-26\",
\"previous_start\": \"2026-11-03T00:49:05\",
\"previous_end\": \"2052-11-26\"
}"
const url = new URL(
"http://localhost:8000/v1/statistics/compare"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"current_start": "2026-11-03T00:49:05",
"current_end": "2052-11-26",
"previous_start": "2026-11-03T00:49:05",
"previous_end": "2052-11-26"
};
fetch(url, {
method: "GET",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/statistics/compare';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'current_start' => '2026-11-03T00:49:05',
'current_end' => '2052-11-26',
'previous_start' => '2026-11-03T00:49:05',
'previous_end' => '2052-11-26',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "Full authentication required. Anonymous access not allowed for this endpoint.",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Get event count by type Returns the count of events for a specific event type.
Example request:
curl --request GET \
--get "http://localhost:8000/v1/statistics/count/architecto" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"start_date\": \"2026-11-03T00:49:05\",
\"end_date\": \"2026-11-03T00:49:05\"
}"
const url = new URL(
"http://localhost:8000/v1/statistics/count/architecto"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"start_date": "2026-11-03T00:49:05",
"end_date": "2026-11-03T00:49:05"
};
fetch(url, {
method: "GET",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/statistics/count/architecto';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'start_date' => '2026-11-03T00:49:05',
'end_date' => '2026-11-03T00:49:05',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "Full authentication required. Anonymous access not allowed for this endpoint.",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Example response (404):
{
"success": false,
"message": "Unknown event type 'user.unknown'."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Content overview Counts of the acting tenant's tests, draft tests and question pool and, for the platform tenant, of active banner ads. A count the caller may not read is null.
Example request:
curl --request GET \
--get "http://localhost:8000/v1/statistics/overview" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/statistics/overview"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/statistics/overview';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "Full authentication required. Anonymous access not allowed for this endpoint.",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Record a usage event directly Records a usage event in the acting tenant. Events are queued for async processing.
Example request:
curl --request POST \
"http://localhost:8000/v1/statistics/record" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/statistics/record"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "POST",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/statistics/record';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Tag Contexts
List all contexts
Get single context
Create context
Update context
Delete context
Tag Management
List all tags (global + tenant-specific)
Create new tag
Bulk delete tags
Get tag by ID
Update tag
Delete tag
Tenant Management
List all tenants (public - no auth required)
Example request:
curl --request GET \
--get "http://localhost:8000/v1/tenants?per_page=20&page=1&enabled=1&search=acme&created_at_gte=2024-01-01&created_at_lte=2024-12-31&sort=-created_at" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/tenants"
);
const params = {
"per_page": "20",
"page": "1",
"enabled": "1",
"search": "acme",
"created_at_gte": "2024-01-01",
"created_at_lte": "2024-12-31",
"sort": "-created_at",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/tenants';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'query' => [
'per_page' => '20',
'page' => '1',
'enabled' => '1',
'search' => 'acme',
'created_at_gte' => '2024-01-01',
'created_at_lte' => '2024-12-31',
'sort' => '-created_at',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{"success": true, "message": "Tenants retrieved successfully", "data": [...], "meta": {"pagination": {"total": 50, "per_page": 10, "current_page": 1, "last_page": 5}}}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Create new tenant with initial admin user.
Only identities of the platform tenant may create tenants.
Example request:
curl --request POST \
"http://localhost:8000/v1/tenants" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"name\": \"Acme Corp\",
\"slug\": \"acme\",
\"domain\": \"acme.com\",
\"description\": \"Eius et animi quos velit et.\",
\"settings\": {
\"default_locale\": \"en\"
},
\"enabled\": false,
\"admin_email\": \"admin@acme.com\",
\"admin_password\": \"architecto\"
}"
const url = new URL(
"http://localhost:8000/v1/tenants"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"name": "Acme Corp",
"slug": "acme",
"domain": "acme.com",
"description": "Eius et animi quos velit et.",
"settings": {
"default_locale": "en"
},
"enabled": false,
"admin_email": "admin@acme.com",
"admin_password": "architecto"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/tenants';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'name' => 'Acme Corp',
'slug' => 'acme',
'domain' => 'acme.com',
'description' => 'Eius et animi quos velit et.',
'settings' => [
'default_locale' => 'en',
],
'enabled' => false,
'admin_email' => 'admin@acme.com',
'admin_password' => 'architecto',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (201):
{"success": true, "message": "Tenant and admin user created successfully", "data": {"tenant": {...}, "admin": {"email": "admin@acme.com", "generated_password": "kR8mP2vN9qT3wX7z"}}}
Example response (409):
{
"success": false,
"message": "Another tenant, possibly a deleted one, already uses this slug (tenants_slug_unique)."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Get tenant by ID (public - no auth required)
Example request:
curl --request GET \
--get "http://localhost:8000/v1/tenants/58C6f7nnFCJ9M6rjyc6rTKMzn6" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/tenants/58C6f7nnFCJ9M6rjyc6rTKMzn6"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/tenants/58C6f7nnFCJ9M6rjyc6rTKMzn6';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{"id": "01ARZ3...", "name": "Acme Corp", ...}
Example response (404):
{
"message": "Tenant not found"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Update tenant by ID A tenant may change its own record; the platform tenant may change any tenant. The platform tenant's slug cannot be changed or taken.
Example request:
curl --request PUT \
"http://localhost:8000/v1/tenants/58C6f7nnFCJ9M6rjyc6rTKMzn6" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"settings\": {
\"default_locale\": \"en\"
}
}"
const url = new URL(
"http://localhost:8000/v1/tenants/58C6f7nnFCJ9M6rjyc6rTKMzn6"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"settings": {
"default_locale": "en"
}
};
fetch(url, {
method: "PUT",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/tenants/58C6f7nnFCJ9M6rjyc6rTKMzn6';
$response = $client->put(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'settings' => [
'default_locale' => 'en',
],
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{"id": "01ARZ3...", "name": "Updated Corp", ...}
Example response (404):
{
"message": "Tenant not found"
}
Example response (409):
{
"success": false,
"message": "Another tenant, possibly a deleted one, already uses this slug (tenants_slug_unique)."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Delete tenant by ID (soft delete) A tenant may delete itself; the platform tenant may delete any tenant.
Example request:
curl --request DELETE \
"http://localhost:8000/v1/tenants/58C6f7nnFCJ9M6rjyc6rTKMzn6" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/tenants/58C6f7nnFCJ9M6rjyc6rTKMzn6"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "DELETE",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/tenants/58C6f7nnFCJ9M6rjyc6rTKMzn6';
$response = $client->delete(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{"id": "01ARZ3...", "deleted_at": "2025-12-03T10:30:00Z", ...}
Example response (404):
{
"message": "Tenant not found"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Get tenant by slug (public - no auth required)
Example request:
curl --request GET \
--get "http://localhost:8000/v1/tenants/architecto" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/tenants/architecto"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/tenants/architecto';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{"id": "01ARZ3...", "name": "Acme Corp", "slug": "acme-corp", ...}
Example response (404):
{
"message": "Tenant not found"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Update tenant by slug A tenant may change its own record; the platform tenant may change any tenant. The platform tenant's slug cannot be changed or taken.
Example request:
curl --request PUT \
"http://localhost:8000/v1/tenants/architecto" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"settings\": {
\"default_locale\": \"en\"
}
}"
const url = new URL(
"http://localhost:8000/v1/tenants/architecto"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"settings": {
"default_locale": "en"
}
};
fetch(url, {
method: "PUT",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/tenants/architecto';
$response = $client->put(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'settings' => [
'default_locale' => 'en',
],
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{"id": "01ARZ3...", "name": "Updated Corp", ...}
Example response (404):
{
"message": "Tenant not found"
}
Example response (409):
{
"success": false,
"message": "Another tenant, possibly a deleted one, already uses this slug (tenants_slug_unique)."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Delete tenant by slug (soft delete) A tenant may delete itself; the platform tenant may delete any tenant.
Example request:
curl --request DELETE \
"http://localhost:8000/v1/tenants/architecto" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/tenants/architecto"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "DELETE",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/tenants/architecto';
$response = $client->delete(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{"id": "01ARZ3...", "deleted_at": "2025-12-03T10:30:00Z", ...}
Example response (404):
{
"message": "Tenant not found"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
User Management
Get the currently authenticated user account `profile` contains what the account holder may see about themselves; data that staff keep about the account is left out.
Example request:
curl --request GET \
--get "http://localhost:8000/v1/users/me" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/users/me"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/users/me';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (400):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "A valid Tenant context is required for this request. Please provide a valid X-Tenant-ID header.",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Update the currently authenticated user's own profile Accepts the self-managed parts of `profile` only: name, first_name, last_name, bio, birthday (DD.MM.YYYY), state, status, language, locale and preferences (rememberTheme, compactDashboard, betaAccess). Given keys replace stored ones, `null` removes a key, others stay; only the preferences sent are validated. Responds with the account as `GET /v1/users/me` does. The email address changes through `/v1/verification/email-change`, the avatar through `/v1/users/me/avatar`.
Example request:
curl --request PATCH \
"http://localhost:8000/v1/users/me" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"profile\": {
\"first_name\": \"Anna\",
\"preferences\": {
\"compactDashboard\": true
}
}
}"
const url = new URL(
"http://localhost:8000/v1/users/me"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"profile": {
"first_name": "Anna",
"preferences": {
"compactDashboard": true
}
}
};
fetch(url, {
method: "PATCH",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/users/me';
$response = $client->patch(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'profile' => [
'first_name' => 'Anna',
'preferences' => [
'compactDashboard' => true,
],
],
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Delete the currently authenticated user account
Example request:
curl --request DELETE \
"http://localhost:8000/v1/users/me" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/users/me"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "DELETE",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/users/me';
$response = $client->delete(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Remove the currently authenticated user's avatar The image is deleted once no account shows it. Responds with the account as `GET /v1/users/me` does.
Example request:
curl --request DELETE \
"http://localhost:8000/v1/users/me/avatar" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/users/me/avatar"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "DELETE",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/users/me/avatar';
$response = $client->delete(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
List all users in tenant
Example request:
curl --request GET \
--get "http://localhost:8000/v1/users?per_page=20&page=1&is_anonymous=&search=john&created_at_gte=2024-01-01&created_at_lte=2024-12-31&sort=-created_at" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/users"
);
const params = {
"per_page": "20",
"page": "1",
"is_anonymous": "0",
"search": "john",
"created_at_gte": "2024-01-01",
"created_at_lte": "2024-12-31",
"sort": "-created_at",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/users';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'query' => [
'per_page' => '20',
'page' => '1',
'is_anonymous' => '0',
'search' => 'john',
'created_at_gte' => '2024-01-01',
'created_at_lte' => '2024-12-31',
'sort' => '-created_at',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{"success": true, "message": "Users retrieved successfully", "data": [...], "meta": {"pagination": {"total": 50, "per_page": 10, "current_page": 1, "last_page": 5}}}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Create new user in tenant
Example request:
curl --request POST \
"http://localhost:8000/v1/users" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/users"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "POST",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/users';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Get user by ID within tenant
Example request:
curl --request GET \
--get "http://localhost:8000/v1/users/58C6f7nnFCJ9M6rjyc6rTKMzn6" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/users/58C6f7nnFCJ9M6rjyc6rTKMzn6"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/users/58C6f7nnFCJ9M6rjyc6rTKMzn6';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (400):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "A valid Tenant context is required for this request. Please provide a valid X-Tenant-ID header.",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Update user by ID within tenant `profile` keys that are sent replace stored ones and `null` removes a key; keys that are not sent, such as those the account holder saved, stay. `profile.preferences` is merged key by key. Images are set by `avatar_media_id` and `cover_media_id`; responses carry fresh `avatar_url` and `cover_url` for them, which cannot be sent.
Example request:
curl --request PUT \
"http://localhost:8000/v1/users/58C6f7nnFCJ9M6rjyc6rTKMzn6" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/users/58C6f7nnFCJ9M6rjyc6rTKMzn6"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "PUT",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/users/58C6f7nnFCJ9M6rjyc6rTKMzn6';
$response = $client->put(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Delete user by ID (soft delete) within tenant
Example request:
curl --request DELETE \
"http://localhost:8000/v1/users/58C6f7nnFCJ9M6rjyc6rTKMzn6" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/users/58C6f7nnFCJ9M6rjyc6rTKMzn6"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "DELETE",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/users/58C6f7nnFCJ9M6rjyc6rTKMzn6';
$response = $client->delete(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
User Search
Find user by any identifier (email, phone, username, or ID) within tenant
Example request:
curl --request GET \
--get "http://localhost:8000/v1/users/find/architecto" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/users/find/architecto"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/users/find/architecto';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (400):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "A valid Tenant context is required for this request. Please provide a valid X-Tenant-ID header.",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Search users by query string within tenant
Example request:
curl --request GET \
--get "http://localhost:8000/v1/users/search/architecto" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/users/search/architecto"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/users/search/architecto';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (400):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "A valid Tenant context is required for this request. Please provide a valid X-Tenant-ID header.",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Find user by email within tenant
Example request:
curl --request GET \
--get "http://localhost:8000/v1/users/by-email/gbailey@example.net" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/users/by-email/gbailey@example.net"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/users/by-email/gbailey@example.net';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (400):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "A valid Tenant context is required for this request. Please provide a valid X-Tenant-ID header.",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Find user by phone within tenant
Example request:
curl --request GET \
--get "http://localhost:8000/v1/users/by-phone/architecto" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/users/by-phone/architecto"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/users/by-phone/architecto';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (400):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "A valid Tenant context is required for this request. Please provide a valid X-Tenant-ID header.",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Find user by username within tenant
Example request:
curl --request GET \
--get "http://localhost:8000/v1/users/by-username/architecto" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/users/by-username/architecto"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/users/by-username/architecto';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (400):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "A valid Tenant context is required for this request. Please provide a valid X-Tenant-ID header.",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Verification
Initiate verification for any handle type Sends a 6-digit verification code to the authenticated user's handle (email, phone, etc.).
Example request:
curl --request POST \
"http://localhost:8000/v1/verification/email/initiate" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/verification/email/initiate"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "POST",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/verification/email/initiate';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Verify handle with code Verifies the user's handle (email, phone, etc.) using the provided 6-digit code.
Example request:
curl --request POST \
"http://localhost:8000/v1/verification/email/verify" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"code\": \"123456\"
}"
const url = new URL(
"http://localhost:8000/v1/verification/email/verify"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"code": "123456"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/verification/email/verify';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'code' => '123456',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Resend verification code Resends a new verification code to the user's handle (email, phone, etc.).
Example request:
curl --request POST \
"http://localhost:8000/v1/verification/email/resend" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/verification/email/resend"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "POST",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/verification/email/resend';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Request an email change Sends a 6-digit code to the new address. The account keeps its current address until the code is confirmed. Requesting again replaces the code.
Example request:
curl --request POST \
"http://localhost:8000/v1/verification/email-change/initiate" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"email\": \"new@example.com\"
}"
const url = new URL(
"http://localhost:8000/v1/verification/email-change/initiate"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"email": "new@example.com"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/verification/email-change/initiate';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'email' => 'new@example.com',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (422):
{
"success": false,
"message": "Validation failed",
"errors": {
"email": [
"The email has already been taken."
]
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Confirm an email change Sets the address the code was sent to as the account's email address, verified, and returns the updated account. Ends the account's other logins; the login making the request stays signed in.
Example request:
curl --request POST \
"http://localhost:8000/v1/verification/email-change/confirm" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"code\": \"123456\"
}"
const url = new URL(
"http://localhost:8000/v1/verification/email-change/confirm"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"code": "123456"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/verification/email-change/confirm';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'code' => '123456',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Initiate password reset Sends a password reset link to the user's email. No authentication required. Always returns success to prevent user enumeration.
Example request:
curl --request POST \
"http://localhost:8000/v1/verification/password-reset/initiate" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/verification/password-reset/initiate"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "POST",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/verification/password-reset/initiate';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Verify password reset token Validates a password reset token without consuming it. Used by frontend to show password reset form.
Example request:
curl --request POST \
"http://localhost:8000/v1/verification/password-reset/verify" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/verification/password-reset/verify"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "POST",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/verification/password-reset/verify';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Complete password reset Resets the user's password using the provided token and new password. Token is consumed and cannot be reused. Ends all logins of the account: access and refresh tokens issued before are refused from now on.
Example request:
curl --request POST \
"http://localhost:8000/v1/verification/password-reset/complete" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/verification/password-reset/complete"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "POST",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/verification/password-reset/complete';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Get verification status Returns the current verification status for the authenticated user.
Example request:
curl --request GET \
--get "http://localhost:8000/v1/verification/status" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"http://localhost:8000/v1/verification/status"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'http://localhost:8000/v1/verification/status';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(), camera=()
vary: Origin
{
"success": false,
"message": "Full authentication required. Anonymous access not allowed for this endpoint.",
"errors": null,
"meta": {
"timestamp": "2026-11-03T00:49:05+00:00"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.