This guide walks you through using Orgonaut's API, starting with simple requests and building up to more advanced features.
<aside>As you scroll, you'll see code examples for working with the API 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>
### Getting started
1. Generate a actoral access token from your dashboard.
2. Include the token as a Bearer token in the `Authorization` header.
3. Begin with read-only endpoints such as `GET /api/v1/org-units` or `GET /api/v1/actors` to fetch current data.
Tokens are scoped with Laravel Sanctum abilities. See the separate Sanctum abilities guide for the full list.
### Scenarios
Scenarios let you model organisational changes without affecting live data. Create a scenario, adjust teams or actors, then compare or publish when ready.
### Organisation unit trees
Org units form a hierarchy of departments and teams. Use `GET /api/v1/org-units/tree` to retrieve this structure, with optional query parameters like `depth`, `type`, or `only_active` for finer control.
To authenticate requests, include an Authorization header with the value "Bearer {YOUR_AUTH_KEY}".
All authenticated endpoints are marked with a requires authentication badge in the documentation below.
You can retrieve your token by visiting your dashboard and clicking Generate API token.
Returns a paginated list of daily usage records across all matched and unmatched actors.
Records are ordered by usage_date descending (most recent first). Each record represents
one actor's usage of one AI tooling provider on a single day.
Supports filtering by actor, provider, and date range. Unmatched records (where the
source email could not be resolved to an Orgonaut actor) have actor_id: null.
Requires ai-tooling.manage ability.
Filter by actor ID. Only returns records matched to this actor.
Filter by provider slug (e.g. "claude").
date Start of date range (inclusive, YYYY-MM-DD).
date End of date range (inclusive, YYYY-MM-DD). Must be on or after from.
Results per page. Min 1, max 100. Defaults to 25.
curl --request GET \
--get "https://app.orgonaut.co/api/v1/ai-tooling/usage?actor_id=42&provider=claude&from=2026-03-01&to=2026-03-25&per_page=25" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "X-Tenant: string required Tenant slug; required for tenant-scoped endpoints. Example: \"demo\"" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"actor_id\": 11,
\"provider\": \"pzdszigdqrrkthqp\",
\"from\": \"2026-04-13T21:34:33\",
\"to\": \"2069-05-04\",
\"per_page\": 4
}"
{
"data": [
{
"id": 128,
"actor_id": 42,
"provider": "claude",
"source_email": "aoife.ryan@example.com",
"usage_date": "2026-03-24",
"sessions_count": 5,
"lines_added": 320,
"lines_removed": 85,
"commits_count": 4,
"pull_requests_count": 1,
"total_input_tokens": 125000,
"total_output_tokens": 48000,
"total_cache_read_tokens": 32000,
"total_cache_creation_tokens": 8000,
"total_cost_cents": 245,
"currency": "USD",
"tool_actions": {
"edit_tool": {
"accepted": 18,
"rejected": 2
},
"bash_tool": {
"accepted": 12,
"rejected": 0
}
},
"model_breakdown": [
{
"model": "claude-opus-4-6",
"input_tokens": 80000,
"output_tokens": 30000
},
{
"model": "claude-sonnet-4-6",
"input_tokens": 45000,
"output_tokens": 18000
}
],
"matched_at": "2026-03-24T03:15:42+00:00",
"actor": {
"id": 42,
"name": "Aoife Ryan",
"email": "aoife.ryan@example.com"
}
}
],
"links": {
"first": "/?page=1",
"last": "/?page=3",
"prev": null,
"next": "/?page=2"
},
"meta": {
"current_page": 1,
"last_page": 3,
"per_page": 25,
"total": 72
}
}
Returns aggregated AI tooling cost and usage totals for a single actor. Includes the last full calendar month total, month-to-date total, and a per-provider breakdown.
Useful for actor profile cards and dashboards.
Requires ai-tooling.manage ability.
The ID of the actor.
The actor ID.
curl --request GET \
--get "https://app.orgonaut.co/api/v1/ai-tooling/actors/11/summary" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "X-Tenant: string required Tenant slug; required for tenant-scoped endpoints. Example: \"demo\"" \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"data": {
"actor_id": 42,
"has_data": true,
"monthly_cost_cents": 850,
"mtd_cost_cents": 320,
"sessions": 15,
"commits": 8,
"prs": 2,
"lines_added": 450,
"lines_removed": 120,
"by_provider": {
"claude": {
"cost_cents": 850,
"mtd_cost_cents": 320,
"sessions": 15
}
}
}
}
Returns a daily time series of AI tooling usage for a single actor. Each data point contains cost, token consumption, session count, and code-change metrics for one day. Designed for rendering cost trend and activity charts on actor profile pages.
Defaults to the last 6 months when from/to are omitted.
Requires ai-tooling.manage ability.
The ID of the actor.
The actor ID.
date Start of date range (YYYY-MM-DD). Defaults to 6 months ago (start of month).
date End of date range (YYYY-MM-DD). Must be on or after from. Defaults to today.
curl --request GET \
--get "https://app.orgonaut.co/api/v1/ai-tooling/actors/11/series?from=2025-10-01&to=2026-03-25" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "X-Tenant: string required Tenant slug; required for tenant-scoped endpoints. Example: \"demo\"" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"from\": \"2026-04-13T21:34:33\",
\"to\": \"2069-05-04\"
}"
{
"data": [
{
"date": "2026-03-23",
"cost_cents": 120,
"sessions": 3,
"commits": 2,
"prs": 0,
"lines_added": 180,
"lines_removed": 45,
"input_tokens": 52000,
"output_tokens": 19000
},
{
"date": "2026-03-24",
"cost_cents": 245,
"sessions": 5,
"commits": 4,
"prs": 1,
"lines_added": 320,
"lines_removed": 85,
"input_tokens": 125000,
"output_tokens": 48000
}
]
}
Returns aggregated AI tooling cost and usage totals for all actors placed in the team's org unit. Covers the last full calendar month and month-to-date period.
If the team has no associated org unit, zeroed metrics are returned.
Requires ai-tooling.manage ability.
The ID of the team.
The team ID.
curl --request GET \
--get "https://app.orgonaut.co/api/v1/ai-tooling/teams/11/summary" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "X-Tenant: string required Tenant slug; required for tenant-scoped endpoints. Example: \"demo\"" \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"data": {
"team_id": 7,
"monthly_cost_cents": 2500,
"mtd_cost_cents": 1200,
"sessions": 45,
"commits": 22,
"prs": 6,
"lines_added": 1800,
"lines_removed": 400
}
}
Returns aggregated AI tooling cost and usage totals for a department. By default,
aggregates across the entire department subtree (all descendant org units). Pass
scope=direct to limit to actors placed directly in the department's own org unit.
If the department has no associated org unit, zeroed metrics are returned.
Requires ai-tooling.manage ability.
The ID of the department.
The department ID.
Aggregation scope: "direct" (department org unit only) or "subtree" (all descendants). Defaults to "subtree".
curl --request GET \
--get "https://app.orgonaut.co/api/v1/ai-tooling/departments/11/summary?scope=subtree" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "X-Tenant: string required Tenant slug; required for tenant-scoped endpoints. Example: \"demo\"" \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"data": {
"department_id": 3,
"scope": "subtree",
"monthly_cost_cents": 8500,
"mtd_cost_cents": 3200,
"sessions": 120,
"commits": 55,
"prs": 12,
"lines_added": 5000,
"lines_removed": 1200
}
}
Returns actors with their primary team resolved from primary org-unit placements (primary=true) inside the active scenario context.
Requires actors.read ability.
The page number.
Max 100.
Comma-separated columns, prefix with - for DESC. Allowed: id,name,created_at.
Filter by status.
Filter by department id. Uses the department org unit mapping derived from org_unit_actor.
Filter by org unit id (department or team subtree).
Sparse fields for actors.
Comma-separated expansions. Allowed: manager,org_units,team,department. The team/department flags surface computed placement data.
The date/datetime used for time-window checks. Defaults to now.
The scenario ID to scope results. Omit or pass scenario_id=null for baseline data.
Comma-separated relationship counts. Allowed: reports.
curl --request GET \
--get "https://app.orgonaut.co/api/v1/actors?page=1&per_page=25&sort=-created_at%2Cname&filter%5Bstatus%5D=active&filter%5Bdepartment_id%5D=5&filter%5Borg_unit_id%5D=10&fields%5Bactors%5D=id%2Cfirst_name%2Clast_name&include=manager%2Cteam&as_of=2025-09-01&scenario_id=4&with_counts=reports" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "X-Tenant: string required Tenant slug; required for tenant-scoped endpoints. Example: \"demo\"" \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"data": [
{
"id": 44,
"first_name": "Aoife",
"last_name": "Ryan",
"name": "Aoife Ryan",
"email": "aoife.ryan@example.com",
"manager_id": 2,
"team": {
"id": 15,
"name": "Team CúChulainn",
"team_type": {
"id": 3,
"name": "Product Squad",
"slug": "product-squad"
}
},
"department": {
"id": 3,
"name": "Engineering"
}
}
]
}
Requires actors.create ability.
Manager must belong to the same tenant and cannot reference the actor themselves.
curl --request POST \
"https://app.orgonaut.co/api/v1/actors" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "X-Tenant: string required Tenant slug; required for tenant-scoped endpoints. Example: \"demo\"" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"first_name\": \"Aoife\",
\"last_name\": \"Ryan\",
\"email\": \"aoife.ryan@example.com\",
\"external_uid\": \"01J9ZQ4J6W2Q0WJ9V6YV5NPQ4W\",
\"kind\": \"human\",
\"status\": \"active\",
\"fte\": 2306379,
\"position_id\": 42,
\"create_placement\": true,
\"location\": \"Dublin, IE\",
\"start_date\": \"2025-09-01\",
\"end_date\": \"2025-09-30\",
\"manager_id\": 2,
\"agent_profile\": {
\"provider\": \"openai\",
\"orchestrator\": \"langgraph\",
\"meta\": {
\"capabilities\": [
\"search\"
]
},
\"endpoint_base_url\": \"https:\\/\\/api.openai.com\",
\"model_default\": \"gpt-4.1\"
}
}"
{
"data": {
"id": 44,
"first_name": "Aoife",
"last_name": "Ryan",
"name": "Aoife Ryan",
"email": "aoife.ryan@example.com",
"kind": "human",
"status": "active",
"contract_type": "perm",
"manager_id": 2,
"start_date": "2025-09-01",
"end_date": "2025-09-30",
"created_at": "2025-01-10T09:00:00Z"
}
}
Returns an actor with their primary team resolved from primary org-unit placement (primary=true) within the active scenario context.
Requires a Sanctum token with the actors.read ability and an X-Tenant header.
The ID of the actor.
Comma-separated expansions. Allowed: manager,org_units,team,department. The team/department flags surface computed placement data.
The date/datetime used for time-window checks. Defaults to now.
The scenario context to resolve against. Defaults to current (baseline if none).
Comma-separated relationship counts. Allowed: reports.
curl --request GET \
--get "https://app.orgonaut.co/api/v1/actors/44?include=manager%2Cteam&as_of=2025-09-01&with_counts=reports" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "X-Tenant: string required Tenant slug" \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"data": {
"id": 44,
"first_name": "Aoife",
"last_name": "Ryan",
"name": "Aoife Ryan",
"email": "aoife.ryan@example.com",
"kind": "human",
"status": "active",
"contract_type": "perm",
"manager_id": 2,
"manager": {
"id": 2,
"first_name": "Brian",
"last_name": "O'Neil",
"name": "Brian O'Neil"
},
"reports_count": 3,
"team": {
"id": 15,
"name": "Team CúChulainn",
"team_type": {
"id": 3,
"name": "Product Squad",
"slug": "product-squad"
}
},
"department": {
"id": 3,
"name": "Engineering"
},
"created_at": "2025-01-10T09:00:00Z"
}
}
Requires actors.update ability and an X-Tenant header.
Manager must belong to the same tenant and cannot reference the actor themselves.
The ID of the actor.
curl --request PUT \
"https://app.orgonaut.co/api/v1/actors/44" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "X-Tenant: string required Tenant slug; required for tenant-scoped endpoints. Example: \"demo\"" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"first_name\": \"Aoife\",
\"last_name\": \"Ryan\",
\"email\": \"aoife.ryan@example.com\",
\"external_uid\": \"01J9ZQ4J6W2Q0WJ9V6YV5NPQ4W\",
\"kind\": \"human\",
\"status\": \"active\",
\"fte\": 2306379,
\"position_id\": 42,
\"create_placement\": true,
\"location\": \"Dublin, IE\",
\"start_date\": \"2025-09-01\",
\"end_date\": \"2025-09-30\",
\"manager_id\": 2,
\"agent_profile\": {
\"provider\": \"openai\",
\"orchestrator\": \"langgraph\",
\"meta\": {
\"capabilities\": [
\"search\"
]
}
}
}"
{
"data": {
"id": 44,
"first_name": "Aoife",
"last_name": "Ryan",
"name": "Aoife Ryan",
"email": "aoife.ryan@example.com",
"kind": "human",
"status": "active",
"manager_id": 2,
"team": {
"id": 15,
"name": "Team CúChulainn"
},
"department": {
"id": 3,
"name": "Engineering"
},
"created_at": "2025-01-10T09:00:00Z"
}
}
Requires actors.delete ability and an X-Tenant header.
The ID of the actor.
curl --request DELETE \
"https://app.orgonaut.co/api/v1/actors/44" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "X-Tenant: string required Tenant slug" \
--header "Content-Type: application/json" \
--header "Accept: application/json" [Empty response]
Lists compensation slices for the given actor. When a scenario context is supplied, scenario slices are returned alongside baseline fallbacks, ordered with scenario data first.
Requires actors.read ability.
The ID of the actor.
The actor identifier.
Scenario id to scope results; omit or pass null for baseline only.
Date used to flag current slices.
Comma-separated relationships. Allowed: scenario,actor.
Sparse fieldset.
curl --request GET \
--get "https://app.orgonaut.co/api/v1/actors/11/compensations?scenario_id=4&as_of=2025-03-01&include=scenario&fields%5Bactor_compensations%5D=id%2Ccurrency%2Cbase_salary_cents" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "X-Tenant: string required Tenant slug; required for tenant-scoped endpoints. Example: \"demo\"" \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"data": [
{
"id": 1,
"currency": "USD",
"base_salary_cents": 12000000
}
]
}
Stores a new compensation slice for the actor.
Requires actors.update ability.
The ID of the actor.
The actor identifier.
Comma-separated relationships. Allowed: scenario,actor.
curl --request POST \
"https://app.orgonaut.co/api/v1/actors/11/compensations?include=scenario" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "X-Tenant: string required Tenant slug; required for tenant-scoped endpoints. Example: \"demo\"" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"scenario_id\": 3,
\"employment_type\": \"Permanent\",
\"currency\": \"USD\",
\"base_salary_cents\": 12000000,
\"daily_rate_cents\": 45000,
\"valid_from\": \"2025-01-01\",
\"valid_to\": \"2025-12-31\",
\"meta\": {
\"note\": \"Includes sign-on bonus\"
}
}"
{
"data": {
"id": 9,
"currency": "EUR",
"daily_rate_cents": 55000
}
}
Updates an existing compensation slice for the actor.
Requires actors.update ability.
The ID of the actor.
The ID of the compensation.
The actor identifier.
The compensation identifier.
Comma-separated relationships. Allowed: scenario,actor.
curl --request PATCH \
"https://app.orgonaut.co/api/v1/actors/11/compensations/11?include=scenario" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "X-Tenant: string required Tenant slug; required for tenant-scoped endpoints. Example: \"demo\"" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"scenario_id\": 3,
\"employment_type\": \"Contractor\",
\"currency\": \"GBP\",
\"base_salary_cents\": 9800000,
\"daily_rate_cents\": 60000,
\"valid_from\": \"2025-02-01\",
\"valid_to\": \"2025-09-30\",
\"meta\": {
\"note\": \"Updated after promotion\"
}
}"
{
"data": {
"id": 9,
"currency": "USD",
"base_salary_cents": 9900000
}
}
Soft deletes a compensation slice.
Requires actors.delete ability.
The ID of the actor.
The ID of the compensation.
The actor identifier.
The compensation identifier.
curl --request DELETE \
"https://app.orgonaut.co/api/v1/actors/11/compensations/11" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "X-Tenant: string required Tenant slug; required for tenant-scoped endpoints. Example: \"demo\"" \
--header "Content-Type: application/json" \
--header "Accept: application/json" [Empty response]
curl --request POST \
"https://app.orgonaut.co/api/v1/aggregates/recalculate" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "X-Tenant: string required Tenant slug; required for tenant-scoped endpoints. Example: \"demo\"" \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"status": "queued"
}
Filter by category key.
Filter by capability kind.
Filter by computed availability.
Include capabilities that are unavailable in the current context.
Override the current Astro view mode (live, scenario, snapshot).
Optional scenario id used for scenario- or snapshot-scoped discovery.
Optional focused entity type (actor, department, org_unit, scenario, team).
Optional focused entity id.
date Optional as-of date for scoped discovery.
curl --request GET \
--get "https://app.orgonaut.co/api/v1/astro/capabilities?category=work_with_scenarios&kind=read&availability=available&include_unavailable=&view_mode=scenario&scenario_id=7&focused_entity_type=team&focused_entity_id=12&as_of=2026-03-01" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "X-Tenant: string required Tenant slug; required for tenant-scoped endpoints. Example: \"demo\"" \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"data": [
{
"key": "explore_organisation",
"title": "Explore organisation",
"description": "Browse the current organisation structure, departments, teams, and root summaries.",
"capabilities": [
{
"key": "explore.organisation",
"title": "Explore organisation structure",
"kind": "read",
"availability_status": "available"
}
]
}
],
"meta": {
"context": {
"view_mode": "live",
"scope_key": "baseline"
},
"counts": {
"available": 5,
"limited": 2,
"unavailable": 0,
"coming_soon": 3
}
}
}
Capability key.
Override the current Astro view mode (live, scenario, snapshot).
Optional scenario id used for scenario- or snapshot-scoped discovery.
Optional focused entity type (actor, department, org_unit, scenario, team).
Optional focused entity id.
date Optional as-of date for scoped discovery.
curl --request GET \
--get "https://app.orgonaut.co/api/v1/astro/capabilities/explore.organisation?view_mode=scenario&scenario_id=7&focused_entity_type=team&focused_entity_id=12&as_of=2026-03-01" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "X-Tenant: string required Tenant slug; required for tenant-scoped endpoints. Example: \"demo\"" \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"data": {
"key": "explore.organisation",
"title": "Explore organisation structure",
"kind": "read",
"availability_status": "available",
"examples": [
{
"prompt": "List the departments in the current scope."
}
]
}
}
curl --request GET \
--get "https://app.orgonaut.co/api/v1/tokens" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "X-Tenant: string required Tenant slug; required for tenant-scoped endpoints. Example: \"demo\"" \
--header "Content-Type: application/json" \
--header "Accept: application/json" [
{
"id": 12,
"name": "CI/CD Bot",
"abilities": [
"actors.read",
"scenarios.update"
],
"last_used_at": "2025-08-01T09:30:12Z",
"created_at": "2025-07-15T12:00:00Z",
"updated_at": "2025-08-01T09:30:12Z"
}
]
The ID of the token.
The token ID.
curl --request DELETE \
"https://app.orgonaut.co/api/v1/tokens/ab" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "X-Tenant: string required Tenant slug; required for tenant-scoped endpoints. Example: \"demo\"" \
--header "Content-Type: application/json" \
--header "Accept: application/json" [Empty response]
The token ID.
curl --request POST \
"https://app.orgonaut.co/api/v1/tokens/11/rotate" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "X-Tenant: string required Tenant slug; required for tenant-scoped endpoints. Example: \"demo\"" \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"token": "1|abcdef123456"
}
The ID of the token.
The token ID.
curl --request PATCH \
"https://app.orgonaut.co/api/v1/tokens/ab" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "X-Tenant: string required Tenant slug; required for tenant-scoped endpoints. Example: \"demo\"" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"name\": \"CI bot token\"
}"
[Empty response]
curl --request POST \
"https://app.orgonaut.co/api/v1/tokens" \
--header "X-Tenant: string required Tenant slug for token scope. Example: \"demo\"" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"email\": \"loma53@example.com\",
\"password\": \"secret-password-123\",
\"name\": \"CI\\/CD Bot\",
\"abilities\": [
\"actors.read\",
\"scenarios.update\"
]
}"
{
"token": "1|abcdef123456"
}
Ingest a machine cost event with idempotency protection. Duplicate idempotency keys return the existing event instead of creating a new row.
curl --request POST \
"https://app.orgonaut.co/api/v1/actor-cost-events" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "X-Tenant: string required Tenant slug; required for tenant-scoped endpoints. Example: \"demo\"" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"occurred_at\": \"2025-09-01T12:00:00Z\",
\"amount\": 42.55,
\"currency\": \"USD\",
\"idempotency_key\": \"evt_01HX...\",
\"actor_id\": 44,
\"org_unit_id\": 12,
\"scenario_id\": 3,
\"model\": \"gpt-4.1\",
\"input_tokens\": 1200000,
\"cached_input_tokens\": 250000,
\"output_tokens\": 640000,
\"meta\": {
\"refund\": false
}
}"
{
"data": {
"id": 1,
"actor_id": 44,
"actor_agent_profile_id": 9,
"org_unit_id": 12,
"scenario_id": null,
"occurred_at": "2025-09-01T12:00:00Z",
"input_tokens": 1200000,
"cached_input_tokens": 250000,
"output_tokens": 640000,
"amount": 18.75,
"currency": "USD",
"provider": "openai",
"model": "gpt-4.1",
"meta": {
"refund": false
},
"created_at": "2025-09-02T10:00:00Z"
}
}
List tenant-global model pricing rows.
Comma-separated sort list. Allowed: id,provider,model,effective_from,effective_to,created_at. Prefix with - for descending order.
Filter by provider slug.
Filter by model identifier.
Filter by currency code.
Sparse fieldset for AI model costs.
curl --request GET \
--get "https://app.orgonaut.co/api/v1/settings/ai/costs?sort=-effective_from%2Cprovider&filter%5Bprovider%5D=openai&filter%5Bmodel%5D=gpt-4.1&filter%5Bcurrency%5D=USD&fields%5Bai_model_costs%5D=id%2Cprovider%2Cmodel%2Ccurrency%2Cis_active" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "X-Tenant: string required Tenant slug; required for tenant-scoped endpoints. Example: \"demo\"" \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"data": [
{
"id": 11,
"provider": "openai",
"model": "gpt-4.1",
"currency": "USD",
"input_mtok_price": 5,
"cached_input_mtok_price": 0.5,
"output_mtok_price": 15,
"effective_from": "2026-01-01",
"effective_to": null,
"is_active": true,
"created_at": "2026-03-07T09:00:00Z",
"updated_at": "2026-03-07T09:00:00Z"
}
],
"links": {
"first": null,
"last": null,
"prev": null,
"next": null
},
"meta": {
"current_page": 1,
"last_page": 1,
"per_page": 1,
"total": 1
}
}
Create a tenant-global model pricing row.
curl --request POST \
"https://app.orgonaut.co/api/v1/settings/ai/costs" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "X-Tenant: string required Tenant slug; required for tenant-scoped endpoints. Example: \"demo\"" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"provider\": \"openai\",
\"model\": \"gpt-4.1\",
\"currency\": \"USD\",
\"input_mtok_price\": 5,
\"cached_input_mtok_price\": 0.5,
\"output_mtok_price\": 15,
\"effective_from\": \"2026-01-01\",
\"effective_to\": \"2026-06-30\"
}"
{
"data": {
"id": 11,
"provider": "openai",
"model": "gpt-4.1",
"currency": "USD",
"input_mtok_price": 5,
"cached_input_mtok_price": 0.5,
"output_mtok_price": 15,
"effective_from": "2026-01-01",
"effective_to": null,
"is_active": true,
"created_at": "2026-03-07T09:00:00Z",
"updated_at": "2026-03-07T09:00:00Z"
}
}
Return a single tenant-global model pricing row.
The AI model cost row id.
Sparse fieldset for AI model costs.
curl --request GET \
--get "https://app.orgonaut.co/api/v1/settings/ai/costs/11?fields%5Bai_model_costs%5D=id%2Cprovider%2Cmodel%2Ccurrency%2Cis_active" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "X-Tenant: string required Tenant slug; required for tenant-scoped endpoints. Example: \"demo\"" \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"data": {
"id": 11,
"provider": "openai",
"model": "gpt-4.1",
"currency": "USD",
"input_mtok_price": 5,
"cached_input_mtok_price": 0.5,
"output_mtok_price": 15,
"effective_from": "2026-01-01",
"effective_to": null,
"is_active": true,
"created_at": "2026-03-07T09:00:00Z",
"updated_at": "2026-03-07T09:00:00Z"
}
}
Update a tenant-global model pricing row.
The AI model cost row id.
curl --request PATCH \
"https://app.orgonaut.co/api/v1/settings/ai/costs/11" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "X-Tenant: string required Tenant slug; required for tenant-scoped endpoints. Example: \"demo\"" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"provider\": \"openai\",
\"model\": \"gpt-4.1\",
\"currency\": \"USD\",
\"input_mtok_price\": 5,
\"cached_input_mtok_price\": 0.5,
\"output_mtok_price\": 15,
\"effective_from\": \"2026-01-01\",
\"effective_to\": \"2026-06-30\"
}"
{
"data": {
"id": 11,
"provider": "openai",
"model": "gpt-4.1-mini",
"currency": "USD",
"input_mtok_price": 0.8,
"cached_input_mtok_price": 0.2,
"output_mtok_price": 3.2,
"effective_from": "2026-03-01",
"effective_to": null,
"is_active": true,
"created_at": "2026-03-07T09:00:00Z",
"updated_at": "2026-03-07T10:15:00Z"
}
}
Delete a tenant-global model pricing row.
The AI model cost row id.
curl --request DELETE \
"https://app.orgonaut.co/api/v1/settings/ai/costs/11" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "X-Tenant: string required Tenant slug; required for tenant-scoped endpoints. Example: \"demo\"" \
--header "Content-Type: application/json" \
--header "Accept: application/json" [Empty response]
Requires departments.read ability.
Search term applied to name and slug.
curl --request GET \
--get "https://app.orgonaut.co/api/v1/department-types/search?q=ops" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "X-Tenant: string required Tenant slug; required for tenant-scoped endpoints. Example: \"acme\"" \
--header "Content-Type: application/json" \
--header "Accept: application/json" [
{
"id": 1,
"name": "Operations",
"slug": "operations",
"color": "#008080"
}
]
Requires departments.create ability.
curl --request POST \
"https://app.orgonaut.co/api/v1/department-types" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "X-Tenant: string required Tenant slug; required for tenant-scoped endpoints. Example: \"acme\"" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"name\": \"Operations\",
\"slug\": \"ops\",
\"color\": \"#008080\",
\"description\": \"Supports company-wide services\"
}"
{
"id": 3,
"name": "Operations",
"slug": "operations",
"color": "#008080"
}
Requires departments.read ability.
The page number.
Max 100.
Comma-separated columns, prefix with - for DESC. Allowed: id,name,created_at.
Filter by lead.
Sparse fields for departments.
Comma-separated relationships. Allowed: lead,departmentType,parentDepartment,aggregate.
curl --request GET \
--get "https://app.orgonaut.co/api/v1/departments?page=1&per_page=25&sort=-created_at%2Cname&filter%5Blead_id%5D=44&fields%5Bdepartments%5D=id%2Cname%2Cdepartment_type_id&include=lead%2CdepartmentType" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "X-Tenant: string required Tenant slug; required for tenant-scoped endpoints. Example: \"demo\"" \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"data": [
{
"id": 3,
"name": "Engineering",
"lead_id": 44,
"department_type_id": 7,
"department_type": {
"id": 7,
"name": "Division",
"slug": "division",
"color": "#0052cc"
},
"parent_department_id": 2,
"parent_department": {
"id": 2,
"name": "Product"
},
"is_active": true,
"description": "Platform engineering for core services."
}
],
"links": {
"first": null,
"last": null,
"prev": null,
"next": null
},
"meta": {
"total": 1,
"current_page": 1,
"per_page": 15,
"last_page": 1
}
}
Requires departments.create ability.
curl --request POST \
"https://app.orgonaut.co/api/v1/departments" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "X-Tenant: string required Tenant slug; required for tenant-scoped endpoints. Example: \"demo\"" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"name\": \"Engineering\",
\"department_type_id\": 5,
\"parent_org_unit_id\": 42,
\"cost_center\": \"ENG-1001\",
\"department_lead_id\": 44,
\"is_active\": true,
\"description\": \"Supports the full product org.\"
}"
{
"data": {
"id": 3,
"name": "Engineering",
"lead_id": 44,
"cost_center": "ENG-001",
"department_type_id": 7,
"department_type": {
"id": 7,
"name": "Division",
"slug": "division",
"color": "#0052cc"
},
"parent_department_id": null,
"parent_department": null,
"is_active": true,
"description": "Owns platform reliability."
}
}
Requires departments.read ability.
The ID of the department.
curl --request GET \
--get "https://app.orgonaut.co/api/v1/departments/11" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "X-Tenant: string required Tenant slug; required for tenant-scoped endpoints. Example: \"demo\"" \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"data": {
"id": 3,
"name": "Engineering",
"lead_id": 44,
"cost_center": "ENG-001",
"department_type_id": 7,
"department_type": {
"id": 7,
"name": "Division",
"slug": "division",
"color": "#0052cc"
},
"parent_department_id": 2,
"parent_department": {
"id": 2,
"name": "Product"
},
"is_active": true,
"description": "Platform engineering for core services."
}
}
Requires departments.update ability.
The ID of the department.
curl --request PUT \
"https://app.orgonaut.co/api/v1/departments/11" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "X-Tenant: string required Tenant slug; required for tenant-scoped endpoints. Example: \"demo\"" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"name\": \"Engineering\",
\"department_type_id\": 5,
\"parent_org_unit_id\": 42,
\"department_lead_id\": 44,
\"cost_center\": \"ENG-1001\",
\"is_active\": true,
\"description\": \"Supports the full product org.\"
}"
{
"data": {
"id": 3,
"name": "Engineering & Infrastructure",
"lead_id": 44,
"cost_center": "ENG-001",
"department_type_id": 7,
"department_type": {
"id": 7,
"name": "Division",
"slug": "division",
"color": "#0052cc"
},
"parent_department_id": 2,
"parent_department": {
"id": 2,
"name": "Product"
},
"is_active": true,
"description": "Platform engineering for core services."
}
}
Requires departments.delete ability.
The ID of the department.
curl --request DELETE \
"https://app.orgonaut.co/api/v1/departments/11" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "X-Tenant: string required Tenant slug; required for tenant-scoped endpoints. Example: \"demo\"" \
--header "Content-Type: application/json" \
--header "Accept: application/json" [Empty response]
Requires initiatives.read ability.
The page number.
Max 100.
Comma-separated columns, prefix with - for DESC. Allowed: id,title,created_at.
Search by title or description.
Filter by status.
Filter by baseline scenario.
Filter by target scenario.
Sparse fields for initiatives.
Comma-separated relationships. Allowed: baseline_scenario,target_scenario.
curl --request GET \
--get "https://app.orgonaut.co/api/v1/initiatives?page=1&per_page=25&sort=-created_at%2Ctitle&search=cost&filter%5Bstatus%5D=active&filter%5Bbaseline_scenario_id%5D=1&filter%5Btarget_scenario_id%5D=2&fields%5Binitiatives%5D=id%2Ctitle&include=baseline_scenario%2Ctarget_scenario" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "X-Tenant: string required Tenant slug; required for tenant-scoped endpoints. Example: \"demo\"" \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"data": [
{
"id": 1,
"title": "Cost Reduction",
"status": "active"
},
{
"id": 2,
"title": "Mobile Workforce Rollout",
"status": "draft"
}
],
"links": {
"first": null,
"last": null,
"prev": null,
"next": null
},
"meta": {
"total": 4,
"current_page": 1,
"per_page": 15,
"last_page": 1
}
}
Requires initiatives.create ability.
Sparse fields for initiatives.
Comma-separated relationships. Allowed: baseline_scenario,target_scenario.
curl --request POST \
"https://app.orgonaut.co/api/v1/initiatives?fields%5Binitiatives%5D=id%2Ctitle&include=baseline_scenario%2Ctarget_scenario" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "X-Tenant: string required Tenant slug; required for tenant-scoped endpoints. Example: \"demo\"" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"title\": \"Reduce Cloud Spend\",
\"description\": \"Target a 15% reduction by Q4.\",
\"status\": \"active\",
\"baseline_scenario_id\": 1,
\"target_scenario_id\": 2
}"
{
"data": {
"id": 1,
"title": "Cost Reduction",
"description": "Reduce infrastructure spend by 15%",
"status": "active",
"baseline_scenario_id": 1,
"target_scenario_id": 2
}
}
Requires initiatives.read ability.
The ID of the initiative.
Sparse fields for initiatives.
Comma-separated relationships. Allowed: baseline_scenario,target_scenario.
curl --request GET \
--get "https://app.orgonaut.co/api/v1/initiatives/11?fields%5Binitiatives%5D=id%2Ctitle&include=baseline_scenario%2Ctarget_scenario" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "X-Tenant: string required Tenant slug; required for tenant-scoped endpoints. Example: \"demo\"" \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"data": {
"id": 1,
"title": "Cost Reduction",
"description": "Reduce infrastructure spend by 15%",
"status": "active",
"baseline_scenario": {
"id": 1,
"name": "Current State",
"status": "published"
},
"target_scenario": {
"id": 2,
"name": "Optimized State",
"status": "draft"
}
}
}
Requires initiatives.update ability.
The ID of the initiative.
Sparse fields for initiatives.
Comma-separated relationships. Allowed: baseline_scenario,target_scenario.
curl --request PUT \
"https://app.orgonaut.co/api/v1/initiatives/11?fields%5Binitiatives%5D=id%2Ctitle&include=baseline_scenario%2Ctarget_scenario" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "X-Tenant: string required Tenant slug; required for tenant-scoped endpoints. Example: \"demo\"" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"title\": \"Reduce Cloud Spend\",
\"description\": \"Target a 15% reduction by Q4.\",
\"status\": \"paused\",
\"baseline_scenario_id\": 1,
\"target_scenario_id\": 2
}"
{
"data": {
"id": 1,
"title": "Cost Optimization",
"description": "Reduce infrastructure spend by 20%",
"status": "active",
"baseline_scenario_id": 1,
"target_scenario_id": 2
}
}
Requires initiatives.delete ability.
The ID of the initiative.
curl --request DELETE \
"https://app.orgonaut.co/api/v1/initiatives/11" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "X-Tenant: string required Tenant slug; required for tenant-scoped endpoints. Example: \"demo\"" \
--header "Content-Type: application/json" \
--header "Accept: application/json" [Empty response]
This endpoint always responds quickly. When the tenant is missing, the plan
does not include HRIS integrations, or webhook auth fails, it still returns
202 Accepted without queueing sync work.
Tenant slug.
curl --request POST \
"https://app.orgonaut.co/api/v1/integrations/bamboohr/webhook/demo" \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"status": "accepted"
}
The page number.
Max 100.
Filter by lineage type (scenario_promotion, snapshot_restore).
Filter by related scenario id (promoted/applied/archived).
date Filter by applied_at date (inclusive, YYYY-MM-DD).
date Filter by applied_at date (inclusive, YYYY-MM-DD).
curl --request GET \
--get "https://app.orgonaut.co/api/v1/lineage?page=1&per_page=25&filter%5Btype%5D=scenario_promotion&filter%5Bscenario_id%5D=42&filter%5Bapplied_from%5D=2025-01-01&filter%5Bapplied_to%5D=2025-12-31" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "X-Tenant: string required Tenant slug; required for tenant-scoped endpoints. Example: \"demo\"" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"page\": 61,
\"per_page\": 7,
\"filter\": {
\"type\": \"snapshot_restore\",
\"scenario_id\": 11,
\"applied_from\": \"2026-04-13T21:34:33\",
\"applied_to\": \"2026-04-13T21:34:33\"
}
}"
{
"data": [
{
"id": 1,
"type": "scenario_promotion",
"applied_at": "2026-01-30T12:00:00Z"
}
],
"links": {
"first": null,
"last": null,
"prev": null,
"next": null
},
"meta": {
"total": 1,
"current_page": 1,
"per_page": 15,
"last_page": 1
}
}
Return placements for an actor as of a date. By default only active placements
are returned; pass include_history=1 to include historical rows as well.
Requires placements.read ability.
The ID of the actor.
The actor identifier.
Filter placements active on this ISO 8601 date.
Include historical placements in addition to the active set.
Scenario slug or id to scope placements; omit or pass null for baseline.
Comma-separated relationships. Allowed: actor,org_unit.
Sparse fieldset.
curl --request GET \
--get "https://app.orgonaut.co/api/v1/actors/11/placements?as_of=2025-09-01&include_history=1&scenario_id=future-plan&include=actor%2Corg_unit&fields%5Bplacements%5D=id%2Corg_unit_id%2Cvalid_from%2Cvalid_to" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "X-Tenant: string required Tenant slug; required for tenant-scoped endpoints. Example: \"demo\"" \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"data": [
{
"id": 1,
"org_unit_id": 10,
"primary": true,
"allocation_pct": 100,
"fte": 1,
"valid_from": "2025-01-01",
"valid_to": null,
"is_active": true
}
]
}
Creates a new placement for the given actor.
Requires placements.write ability.
The ID of the actor.
The actor identifier.
Comma-separated relationships. Allowed: actor,org_unit.
curl --request POST \
"https://app.orgonaut.co/api/v1/actors/11/placements?include=org_unit" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "X-Tenant: string required Tenant slug; required for tenant-scoped endpoints. Example: \"demo\"" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"org_unit_id\": 10,
\"scenario_id\": 4,
\"primary\": true,
\"allocation_pct\": 60,
\"valid_from\": \"2025-09-01\",
\"valid_to\": \"2025-12-31\",
\"source\": \"manual\",
\"meta\": [],
\"fte\": 0.6
}"
{
"data": {
"id": 9,
"org_unit_id": 10,
"primary": false,
"allocation_pct": 60,
"fte": 0.6,
"valid_from": "2025-09-01",
"valid_to": null,
"is_active": true
}
}
Updates an existing placement.
Requires placements.write ability.
The ID of the placement.
Placement identifier.
Comma-separated relationships. Allowed: actor,org_unit.
curl --request PATCH \
"https://app.orgonaut.co/api/v1/placements/11?include=actor" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "X-Tenant: string required Tenant slug; required for tenant-scoped endpoints. Example: \"demo\"" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"org_unit_id\": 12,
\"scenario_id\": 4,
\"primary\": false,
\"allocation_pct\": 50,
\"valid_from\": \"2025-06-01\",
\"valid_to\": \"2025-09-30\",
\"source\": \"manual\",
\"meta\": [],
\"fte\": 0.5
}"
{
"data": {
"id": 9,
"org_unit_id": 12,
"allocation_pct": 50,
"fte": 0.5,
"valid_from": "2025-06-01",
"valid_to": "2025-09-30",
"is_active": false
}
}
Ends a placement by stamping the valid_to date. Omitting the
valid_to query parameter defaults to today.
Requires placements.delete ability.
The ID of the placement.
Placement identifier.
Date to end the placement on (YYYY-MM-DD). Defaults to today.
Comma-separated relationships. Allowed: actor,org_unit.
curl --request DELETE \
"https://app.orgonaut.co/api/v1/placements/11?valid_to=2025-10-01&include=org_unit" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "X-Tenant: string required Tenant slug; required for tenant-scoped endpoints. Example: \"demo\"" \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"data": {
"id": 9,
"valid_to": "2025-10-01",
"is_active": false
}
}
Lists active placements for the specified org unit. Results default to placements
active today but may be scoped to a different date using as_of.
Requires placements.read ability.
The ID of the org unit.
The org unit identifier.
Date used to evaluate active placements.
Scenario slug or id to scope placements; omit or pass null for baseline.
Comma-separated relationships. Allowed: actor,org_unit.
Sparse fieldset.
curl --request GET \
--get "https://app.orgonaut.co/api/v1/org-units/11/actors?as_of=2025-09-01&scenario_id=future-plan&include=actor&fields%5Bplacements%5D=id%2Cactor_id%2Callocation_pct" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "X-Tenant: string required Tenant slug; required for tenant-scoped endpoints. Example: \"demo\"" \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"data": [
{
"id": 7,
"actor": {
"id": 14,
"name": "Aisling O'Neill"
},
"allocation_pct": 100,
"fte": 1,
"valid_from": "2025-07-01",
"valid_to": null,
"is_active": true
}
]
}
The page number.
Max 100.
Comma-separated columns, prefix with - for DESC. Allowed: id,label,created_at.
Filter by the org unit type (string). Typical values include node, team, and department. Other values may appear if inserted in data.
Filter by scenario ID.
Filter by parent org unit ID.
Sparse fields for org units.
Comma-separated relationships. Allowed: scenario,actors,metrics.
date Filter actors memberships or metrics by date. Format: YYYY-MM-DD.
curl --request GET \
--get "https://app.orgonaut.co/api/v1/org-units?page=1&per_page=25&sort=-created_at%2Clabel&filter%5Btype%5D=node&filter%5Bscenario_id%5D=1&filter%5Bparent_id%5D=42&fields%5Borg_units%5D=id%2Clabel&include=scenario%2Cactors%2Cmetrics&as_of=2025-09-01" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "X-Tenant: string required Tenant slug; required for tenant-scoped endpoints. Example: \"demo\"" \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"data": [
{
"id": 202,
"type": "node",
"entity_id": 4102,
"label": "Retail – Ireland",
"scenario_id": 1,
"parent_id": 101
}
],
"links": {
"first": null,
"last": null,
"prev": null,
"next": null
},
"meta": {
"total": 1,
"current_page": 1,
"per_page": 15,
"last_page": 1
}
}
The ID of the root org unit.
date Format YYYY-MM-DD.
The sprint for velocity metrics.
curl --request GET \
--get "https://app.orgonaut.co/api/v1/org-units/summary?root_id=202&as_of=2025-09-01&sprint_id=42" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "X-Tenant: string required Tenant slug; required for tenant-scoped endpoints. Example: \"demo\"" \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"data": {
"id": 202,
"label": "Retail – Ireland",
"type": "node",
"entity_id": 4102,
"rollup": {
"direct_headcount": 12,
"subtree_headcount": 38,
"direct_monthly_cost_cents": 528500,
"subtree_monthly_cost_cents": 1285000,
"velocity_sp": 35,
"velocity_team_count": 3
},
"children": []
}
}
Returns the subtree for the given root_id (or the tenant root if omitted), up to a maximum depth. Supports includes (members,parent,ancestors,path,metrics), search by name, and filtering by type.
Optional root node id.
The max depth to traverse from the root. Default: 2.
Comma-separated includes: actors,members,parent,ancestors,path,metrics.
Filter by org unit type.
Case-insensitive search on label.
Sort by label asc/desc. Allowed: label, -label. Default: label.
Filter by org unit type.
curl --request GET \
--get "https://app.orgonaut.co/api/v1/org-units/tree?root_id=1&depth=3&include=actors%2Cparent&filter[type]=team&search=Apollo&sort=-label&filter%5Btype%5D=team" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "X-Tenant: string required The tenant slug or id." \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"data": {
"id": 101,
"label": "Engineering",
"code": null,
"type": "node",
"entity_id": 4102,
"parent_id": null,
"scenario_id": 1,
"valid_from": null,
"valid_to": null,
"created_at": "2025-01-10T09:00:00Z",
"parent": null,
"ancestors": [],
"path": [
"Engineering"
],
"metrics": {
"as_of": "2025-01-10",
"direct_headcount": 0,
"subtree_headcount": 0,
"direct_monthly_cost": {
"value": 0,
"formatted": "€0.00",
"currency": "EUR"
},
"subtree_monthly_cost": {
"value": 0,
"formatted": "€0.00",
"currency": "EUR"
}
},
"children": [
{
"id": 202,
"label": "Team CúChulainn",
"code": null,
"type": "team",
"entity_id": 15,
"parent_id": 101,
"scenario_id": 1,
"valid_from": null,
"valid_to": null,
"created_at": "2025-01-10T09:00:00Z",
"parent": {
"id": 101,
"label": "Engineering"
},
"ancestors": [
{
"id": 101,
"label": "Engineering"
}
],
"path": [
"Engineering",
"Team CúChulainn"
],
"metrics": {
"as_of": "2025-01-10",
"direct_headcount": 0,
"subtree_headcount": 0,
"direct_monthly_cost": {
"value": 0,
"formatted": "€0.00",
"currency": "EUR"
},
"subtree_monthly_cost": {
"value": 0,
"formatted": "€0.00",
"currency": "EUR"
}
},
"children": []
}
]
}
}
The root id.
The max depth to traverse from the root. Default: 3.
Comma-separated includes: actors,members,parent,ancestors,path,metrics.
Filter by org unit type.
Case-insensitive search on label.
Items per page. Max 200.
Pagination cursor
Filter by org unit type.
curl --request GET \
--get "https://app.orgonaut.co/api/v1/org-units/1/descendants?depth=2&include=parent&filter[type]=team&search=Apollo&per_page=50&cursor=ab&filter%5Btype%5D=team" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "X-Tenant: string required The tenant slug or id." \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"data": [
{
"id": 202,
"label": "Team CúChulainn",
"code": null,
"type": "team",
"entity_id": 15,
"parent_id": 101,
"scenario_id": 1,
"valid_from": null,
"valid_to": null,
"created_at": "2025-01-10T09:00:00Z",
"metrics": {
"as_of": "2025-01-10",
"direct_headcount": 0,
"subtree_headcount": 0,
"direct_monthly_cost": {
"value": 0,
"formatted": "€0.00",
"currency": "EUR"
},
"subtree_monthly_cost": {
"value": 0,
"formatted": "€0.00",
"currency": "EUR"
}
}
},
{
"id": 203,
"label": "Team Fianna",
"code": null,
"type": "team",
"entity_id": 16,
"parent_id": 101,
"scenario_id": 1,
"valid_from": null,
"valid_to": null,
"created_at": "2025-01-10T09:00:00Z"
}
],
"links": {
"next": null,
"prev": null
},
"meta": {
"per_page": 50
}
}
The ID of the org unit.
date Format YYYY-MM-DD.
curl --request GET \
--get "https://app.orgonaut.co/api/v1/org-units/202?as_of=2025-09-01" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "X-Tenant: string required Tenant slug; required for tenant-scoped endpoints. Example: \"demo\"" \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"data": {
"id": 202,
"label": "Retail – Ireland",
"type": "node",
"entity_id": 4102,
"rollup": {
"direct_headcount": 12,
"subtree_headcount": 38,
"direct_monthly_cost_cents": 528500,
"subtree_monthly_cost_cents": 1285000,
"velocity_sp": 35,
"velocity_team_count": 3
},
"children": []
}
}
The ID of the org unit.
date Format YYYY-MM-DD.
curl --request GET \
--get "https://app.orgonaut.co/api/v1/org-units/202/children?as_of=2025-09-01" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "X-Tenant: string required Tenant slug; required for tenant-scoped endpoints. Example: \"demo\"" \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"data": [
{
"id": 210,
"label": "Team CúChulainn",
"type": "team",
"entity_id": 15,
"rollup": {
"direct_headcount": 8,
"subtree_headcount": 8,
"direct_monthly_cost_cents": 428500,
"subtree_monthly_cost_cents": 428500,
"velocity_sp": 18,
"velocity_team_count": 1
},
"children": []
}
]
}
curl --request POST \
"https://app.orgonaut.co/api/v1/org-units" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "X-Tenant: string required Tenant slug; required for tenant-scoped endpoints. Example: \"demo\"" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"type\": \"team\",
\"entity_id\": 15,
\"label\": \"Team CúChulainn\",
\"scenario_id\": 1,
\"parent_id\": 202,
\"valid_from\": \"2025-01-01\",
\"valid_to\": \"2025-12-31\"
}"
{
"data": {
"id": 210,
"type": "team",
"entity_id": 15,
"label": "Team CúChulainn",
"scenario_id": 1,
"parent_id": 202,
"valid_from": "2025-01-01",
"valid_to": "2025-12-31"
}
}
The ID of the org unit.
curl --request PATCH \
"https://app.orgonaut.co/api/v1/org-units/210" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "X-Tenant: string required Tenant slug; required for tenant-scoped endpoints. Example: \"demo\"" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"type\": \"team\",
\"entity_id\": 15,
\"label\": \"Team CúChulainn\",
\"scenario_id\": 1,
\"parent_id\": 202,
\"valid_from\": \"2025-01-01\",
\"valid_to\": \"2025-12-31\"
}"
{
"data": {
"id": 210,
"type": "team",
"entity_id": 15,
"label": "Team CúChulainn",
"scenario_id": 1,
"parent_id": 202,
"valid_from": "2025-01-01",
"valid_to": "2025-12-31"
}
}
The org unit id.
date The date to compute metrics as of.
curl --request GET \
--get "https://app.orgonaut.co/api/v1/org-units/202/metrics?as_of=2025-09-01" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "X-Tenant: string required Tenant slug; required for tenant-scoped endpoints. Example: \"demo\"" \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"data": {
"as_of": "2025-09-01",
"direct_headcount": 8,
"subtree_headcount": 37,
"direct_monthly_cost_cents": 1250000,
"subtree_monthly_cost_cents": 4185000,
"metrics": {
"span_of_control": 2
}
}
}
The ID of the org unit.
The org unit id being moved.
curl --request POST \
"https://app.orgonaut.co/api/v1/org-units/11/move" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "X-Tenant: string required The tenant slug." \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"target_parent_id\": 11,
\"position\": 11,
\"expected_updated_at\": \"ab\"
}"
{
"data": {
"id": 202,
"label": "Retail – Ireland",
"code": null,
"type": "node",
"entity_id": 4102,
"parent_id": 88,
"scenario_id": 1,
"valid_from": "2025-01-01",
"valid_to": null,
"created_at": "2025-08-20T10:00:00Z"
}
}
curl --request POST \
"https://app.orgonaut.co/api/v1/org-units/merge" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "X-Tenant: string required The tenant slug." \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"source_id\": 11,
\"target_id\": 11,
\"strategy\": \"ab\",
\"expected_updated_at_source\": \"2025-08-29T10:00:00Z\",
\"expected_updated_at_target\": \"2025-08-29T10:00:00Z\"
}"
{
"data": {
"id": 202,
"label": "Retail – Ireland",
"code": null,
"type": "node",
"entity_id": 4102,
"parent_id": 101,
"scenario_id": 1,
"valid_from": "2025-01-01",
"valid_to": null,
"created_at": "2025-08-20T10:00:00Z"
}
}
The ID of the org unit.
The org unit id being split.
curl --request POST \
"https://app.orgonaut.co/api/v1/org-units/11/split" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "X-Tenant: string required The tenant slug." \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"mode\": \"ab\",
\"label\": \"ab\",
\"children_to_move\": [
\"ab\"
],
\"expected_updated_at\": \"ab\"
}"
{
"data": {
"original": {
"id": 202,
"label": "Retail – Ireland",
"code": null,
"type": "node",
"entity_id": 4102,
"parent_id": 101,
"scenario_id": 1,
"valid_from": "2025-01-01",
"valid_to": null,
"created_at": "2025-08-20T10:00:00Z"
},
"created": {
"id": 244,
"label": "Payments – Ops",
"code": null,
"type": "node",
"entity_id": 4102,
"parent_id": 101,
"scenario_id": 1,
"valid_from": "2025-01-01",
"valid_to": null,
"created_at": "2026-03-07T10:30:00Z"
}
}
}
The ID of the org unit.
The org unit id being deleted.
curl --request DELETE \
"https://app.orgonaut.co/api/v1/org-units/11" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "X-Tenant: string required The tenant slug." \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"target_parent_id\": 101,
\"position\": 2,
\"expected_updated_at\": \"ab\"
}"
[Empty response]
The ID of the org unit.
The soft-deleted org unit id.
curl --request POST \
"https://app.orgonaut.co/api/v1/org-units/11/restore" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "X-Tenant: string required The tenant slug." \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"data": {
"id": 202,
"label": "Retail – Ireland",
"code": null,
"type": "node",
"entity_id": 4102,
"parent_id": 101,
"scenario_id": 1,
"valid_from": "2025-01-01",
"valid_to": null,
"created_at": "2025-08-20T10:00:00Z"
}
}
The org unit ID.
The sprint to query.
date Mutually exclusive with sprint_id.
curl --request GET \
--get "https://app.orgonaut.co/api/v1/org-units/202/velocity?sprint_id=11&as_of=ab" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "X-Tenant: string required Tenant slug; required for tenant-scoped endpoints. Example: \"demo\"" \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"data": {
"org_unit_id": 202,
"sprint_id": 42,
"period": {
"label": "Sprint 18",
"starts_at": "2025-09-01",
"ends_at": "2025-09-14"
},
"velocity_sp": 88,
"teams_count": 4
}
}
The org unit ID.
Starting sprint ID. The id of an existing record in the sprint_periods table.
Ending sprint ID. The id of an existing record in the sprint_periods table.
Start date (YYYY-MM-DD). Must be a valid date. Must be a valid date in the format Y-m-d.
End date (YYYY-MM-DD). Must be a valid date. Must be a valid date in the format Y-m-d.
Maximum number of sprints to return. Must be at least 1. Must not be greater than 50.
Sort order by sprint start.
ascdesccurl --request GET \
--get "https://app.orgonaut.co/api/v1/org-units/202/velocity/series?from_sprint_id=1&to_sprint_id=10&from=2025-01-01&to=2025-06-01&limit=12&order=asc" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "X-Tenant: string required Tenant slug; required for tenant-scoped endpoints. Example: \"demo\"" \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"data": [
{
"org_unit_id": 202,
"sprint_id": 41,
"period": {
"label": "Sprint 17",
"starts_at": "2025-08-18",
"ends_at": "2025-08-31"
},
"velocity_sp": 81,
"teams_count": 4
},
{
"org_unit_id": 202,
"sprint_id": 42,
"period": {
"label": "Sprint 18",
"starts_at": "2025-09-01",
"ends_at": "2025-09-14"
},
"velocity_sp": 88,
"teams_count": 4
}
]
}
API descriptions intentionally use “Organisation Account” wording for user-facing clarity.
Returns the Organisation Accounts that the authenticated user can access.
curl --request GET \
--get "https://app.orgonaut.co/api/v1/me/organisations" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"data": [
{
"id": 12,
"name": "Acme Product",
"slug": "acme-product",
"plan_code": "team",
"subscription_status": "trialing",
"trial_ends_at": "2026-03-06T12:00:00Z",
"onboarding_completed_at": null,
"role": "owner"
}
]
}
Resolution follows the standard precedence (subdomain, last-used Organisation, session fallback).
curl --request GET \
--get "https://app.orgonaut.co/api/v1/organisations/current" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"data": {
"id": 12,
"name": "Acme Product",
"slug": "acme-product",
"plan_code": "team",
"onboarding_choice": "import",
"onboarding_completed_at": null,
"trial_started_at": "2026-02-21T12:00:00Z",
"trial_ends_at": "2026-03-06T12:00:00Z",
"subscription_status": "trialing",
"grace_ends_at": null,
"locked_at": null,
"role": "owner",
"saml_enabled": false,
"current_token": {
"abilities": [
"cli.access",
"actors.read",
"scenarios.read"
],
"cli_access": true
}
}
}
Persists how this Organisation Account will start onboarding.
curl --request POST \
"https://app.orgonaut.co/api/v1/organisations/current/onboarding-choice" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"onboarding_choice\": \"import\"
}"
{
"data": {
"id": 12,
"name": "Acme Product",
"slug": "acme-product",
"onboarding_choice": "import",
"subscription_status": "trialing"
}
}
Manage effective-dated team positions, linking actors, teams, and compensation within each scenario.
Returns baseline data when no scenario filter is supplied; pass
filter[scenario]=current to reflect the active scenario.
The page number to return.
Results per page (max 100).
Comma-separated columns, prefix with - for DESC. Allowed: id,valid_from,valid_to,fte,created_at.
Filter by a budgeted team org unit (planning metadata only).
Restrict by budgeted employment type (perm or contractor).
date Return positions active on this ISO date (YYYY-MM-DD).
Scenario shorthand: baseline, current, or an id.
Scenario identifier; overrides shorthand when present.
Free-text search across title, team name, and actor name.
Comma-separated relationships. Allowed: team,actor.
Sparse fieldset selection.
curl --request GET \
--get "https://app.orgonaut.co/api/v1/positions?page=1&per_page=25&sort=-valid_from&filter%5Borg_unit_team_id%5D=4201&filter%5Btarget_employment_type%5D=perm&filter%5Bactive_as_of%5D=2025-09-20&filter%5Bscenario%5D=current&filter%5Bscenario_id%5D=7&q=platform+engineer&include=team%2Cactor&fields%5Bpositions%5D=id%2Ctitle%2Cteam" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "X-Tenant: string required Tenant slug; required for tenant-scoped endpoints. Example: \"demo\"" \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"data": [
{
"id": 17,
"org_unit_team_id": 4201, // planning metadata only
"title": "Staff Platform Engineer",
"target_employment_type": "perm",
"fte": 1,
"target_annual_salary_cents": 11850000,
"target_daily_rate_cents": null,
"target_currency": "EUR",
"valid_from": "2024-03-01",
"valid_to": null,
"scenario_id": null,
"meta": {
"cost_centre": "ENG-PLAT",
"notes": "Supports platform migration."
},
"team": {
"id": 8,
"name": "Platform Experience",
"slug": "platform-experience"
},
"actor": null,
"links": {
"self": "https://tenant.orgonaut.test/api/v1/positions/17",
"team": "https://tenant.orgonaut.test/api/v1/teams/8",
"actor": null
},
"created_at": "2025-09-19T09:00:00Z",
"updated_at": "2025-09-19T09:00:00Z"
}
],
"links": {
"first": "https://tenant.orgonaut.test/api/v1/positions?page=1",
"last": "https://tenant.orgonaut.test/api/v1/positions?page=3",
"prev": null,
"next": "https://tenant.orgonaut.test/api/v1/positions?page=2"
},
"meta": {
"current_page": 1,
"from": 1,
"last_page": 3,
"path": "https://tenant.orgonaut.test/api/v1/positions",
"per_page": 25,
"to": 25,
"total": 62
}
}
Applies baseline defaults when the current scenario guard is baseline, otherwise stores the record against the active scenario id.
curl --request POST \
"https://app.orgonaut.co/api/v1/positions" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "X-Tenant: string required Tenant slug; required for tenant-scoped endpoints. Example: \"demo\"" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"title\": \"ab\",
\"role_type_id\": 11,
\"org_unit_team_id\": 4201,
\"target_employment_type\": \"ab\",
\"fte\": 1,
\"target_annual_salary_cents\": 8500000,
\"target_daily_rate_cents\": 45000,
\"target_currency\": \"EUR\",
\"valid_from\": \"2025-09-20\",
\"valid_to\": \"2026-03-31\",
\"meta\": {
\"cost_centre\": \"ENG-PLAT\"
},
\"create_placement\": true,
\"tenant_id\": 11,
\"scenario_id\": 11
}"
{
"data": {
"id": 24,
"org_unit_team_id": 4201, // planning metadata only
"title": "Staff Platform Engineer",
"target_employment_type": "perm",
"fte": 1,
"target_annual_salary_cents": 11850000,
"target_daily_rate_cents": null,
"target_currency": "EUR",
"valid_from": "2024-03-01",
"valid_to": null,
"scenario_id": null,
"meta": {
"cost_centre": "ENG-PLAT",
"notes": "Supports platform migration."
},
"team": {
"id": 8,
"name": "Platform Experience",
"slug": "platform-experience"
},
"actor": null,
"links": {
"self": "https://tenant.orgonaut.test/api/v1/positions/24",
"team": "https://tenant.orgonaut.test/api/v1/teams/8",
"actor": null
},
"created_at": "2025-09-19T09:15:00Z",
"updated_at": "2025-09-19T09:15:00Z"
}
}
Honors the active scenario guard unless filter[scenario]/filter[scenario_id]
were provided on the index request and cached via query options middleware.
The ID of the position.
The ID of the position.
Comma-separated relationships. Allowed: team,actor.
Sparse fieldset.
curl --request GET \
--get "https://app.orgonaut.co/api/v1/positions/11?include=team&fields%5Bpositions%5D=id%2Ctitle%2Cteam" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "X-Tenant: string required Tenant slug; required for tenant-scoped endpoints. Example: \"demo\"" \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"data": {
"id": 24,
"org_unit_team_id": 4201, // planning metadata only
"actor_id": null,
"title": "Staff Platform Engineer",
"target_employment_type": "perm",
"fte": 1,
"target_annual_salary_cents": 11850000,
"target_daily_rate_cents": null,
"target_currency": "EUR",
"valid_from": "2024-03-01",
"valid_to": null,
"scenario_id": null,
"meta": {
"cost_centre": "ENG-PLAT",
"notes": "Supports platform migration."
},
"team": {
"id": 8,
"name": "Platform Experience",
"slug": "platform-experience"
},
"actor": null,
"links": {
"self": "https://tenant.orgonaut.test/api/v1/positions/24",
"team": "https://tenant.orgonaut.test/api/v1/teams/8",
"actor": null
},
"created_at": "2025-09-19T09:15:00Z",
"updated_at": "2025-09-19T09:15:00Z"
}
}
Validation enforces mutual exclusivity between salary and daily rate, mirroring the create endpoint rules.
The ID of the position.
curl --request PUT \
"https://app.orgonaut.co/api/v1/positions/11" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "X-Tenant: string required Tenant slug; required for tenant-scoped endpoints. Example: \"demo\"" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"title\": \"ab\",
\"role_type_id\": 11,
\"org_unit_team_id\": 4201,
\"target_employment_type\": \"ab\",
\"fte\": 1,
\"target_annual_salary_cents\": 8500000,
\"target_daily_rate_cents\": 45000,
\"target_currency\": \"EUR\",
\"valid_from\": \"2025-09-20\",
\"valid_to\": \"2026-03-31\",
\"meta\": {
\"cost_centre\": \"ENG-PLAT\"
},
\"create_placement\": true,
\"tenant_id\": 11,
\"scenario_id\": 11
}"
{
"data": {
"id": 24,
"org_unit_team_id": 4201, // planning metadata only
"actor_id": null,
"title": "Principal Platform Engineer",
"target_employment_type": "perm",
"fte": 1,
"target_annual_salary_cents": 12600000,
"target_daily_rate_cents": null,
"target_currency": "EUR",
"valid_from": "2024-03-01",
"valid_to": null,
"scenario_id": null,
"meta": {
"cost_centre": "ENG-PLAT",
"notes": "Role upgraded to lead migration."
},
"team": {
"id": 8,
"name": "Platform Experience",
"slug": "platform-experience"
},
"actor": null,
"links": {
"self": "https://tenant.orgonaut.test/api/v1/positions/24",
"team": "https://tenant.orgonaut.test/api/v1/teams/8",
"actor": null
},
"created_at": "2025-09-19T09:15:00Z",
"updated_at": "2025-09-26T11:20:00Z"
}
}
The ID of the position.
curl --request DELETE \
"https://app.orgonaut.co/api/v1/positions/11" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "X-Tenant: string required Tenant slug; required for tenant-scoped endpoints. Example: \"demo\"" \
--header "Content-Type: application/json" \
--header "Accept: application/json" [Empty response]
Returns scenario tasks for the authenticated tenant, ordered by latest first. These tasks mirror the progress shown in the Flux UI at /scenarios/tasks.
Filter by status (pending, running, failed, complete).
Filter by task type (clone, promotion, snapshot, all). Defaults to clone for compatibility.
curl --request GET \
--get "https://app.orgonaut.co/api/v1/scenarios/tasks?status=running&type=promotion" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "X-Tenant: string required Tenant slug; required for tenant-scoped endpoints. Example: \"demo\"" \
--header "Content-Type: application/json" \
--header "Accept: application/json" [
{
"id": 81,
"scenario_id": 42,
"scenario_name": "Q2 Planning",
"type": "clone",
"stage": "actors",
"status": "running",
"percent": 33,
"message": "Copying Actors...",
"error_message": null,
"created_at": "2025-11-01T12:14:22Z",
"updated_at": "2025-11-01T12:15:03Z"
}
]
The page number.
Max 100.
Comma-separated columns, prefix with - for DESC. Allowed: id,name,created_at.
Filter by status.
Filter by kind (planning, baseline_archive, applied_scenario).
Sparse fields for scenarios.
Comma-separated relationships. Allowed: teams,aggregate.
Snapshot date for aggregates. Format: YYYY-MM-DD.
curl --request GET \
--get "https://app.orgonaut.co/api/v1/scenarios?page=1&per_page=25&sort=-created_at%2Cname&filter%5Bstatus%5D=cloning&filter%5Bkind%5D=planning&fields%5Bscenarios%5D=id%2Cname%2Cstatus&include=teams%2Caggregate&as_of=2025-09-01" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "X-Tenant: string required Tenant slug; required for tenant-scoped endpoints. Example: \"demo\"" \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"data": [
{
"id": 1,
"name": "FY26 Cost Optimisation",
"status": "new"
}
],
"links": {
"first": null,
"last": null,
"prev": null,
"next": null
},
"meta": {
"total": 1,
"current_page": 1,
"per_page": 15,
"last_page": 1
}
}
Triggers a background clone pipeline and returns immediately with status=initialising.
curl --request POST \
"https://app.orgonaut.co/api/v1/scenarios" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "X-Tenant: string required Tenant slug; required for tenant-scoped endpoints. Example: \"demo\"" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"name\": \"\\\"Q2 Planning\\\"\",
\"notes\": \"\\\"Budget-cut planning run.\\\"\",
\"source_scenario_id\": 12
}"
{
"message": "Scenario creation started. Cloning in progress.",
"status": "initialising",
"scenario": {
"id": 42,
"name": "Q2 Planning",
"status": "initialising",
"notes": "Budget-cut planning run."
},
"tasks_url": "https://app.orgonaut.test/api/v1/scenarios/tasks"
}
The slug of the scenario.
The ID of the scenario.
Comma-separated relationships. Allowed: teams,aggregate.
Snapshot date for aggregates. Format: YYYY-MM-DD.
curl --request GET \
--get "https://app.orgonaut.co/api/v1/scenarios/ab?include=aggregate&as_of=2025-09-01" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "X-Tenant: string required Tenant slug; required for tenant-scoped endpoints. Example: \"demo\"" \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"data": {
"id": 1,
"name": "FY26 Cost Optimisation",
"status": "new",
"aggregate": {
"as_of_date": "2025-09-01",
"scenario_direct_headcount": 0,
"scenario_subtree_headcount": 0,
"scenario_direct_monthly_cost_cents": 0,
"scenario_subtree_monthly_cost_cents": 0,
"velocity_completed_sp": 0,
"velocity_team_count": 0,
"computed_at": "2025-09-06T12:00:00Z",
"metrics": {}
}
}
}
The slug of the scenario.
Scenario id.
curl --request GET \
--get "https://app.orgonaut.co/api/v1/scenarios/ab/delta" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "X-Tenant: string required Tenant slug; required for tenant-scoped endpoints. Example: \"demo\"" \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"scenario": {
"id": 7,
"name": "FY26 Restructure",
"slug": "fy26-restructure",
"status": "draft",
"kind": "planning",
"notes": "Budget-cut planning run.",
"live_from": null,
"live_to": null,
"locked_at": null,
"archived_at": null,
"is_read_only": false,
"source_scenario_id": null,
"created_at": "2026-03-01T09:00:00Z",
"updated_at": "2026-03-01T09:00:00Z"
},
"source": {
"id": 1,
"name": "Current State",
"slug": "current-state",
"status": "published",
"kind": "planning",
"notes": null,
"live_from": null,
"live_to": null,
"locked_at": null,
"archived_at": null,
"is_read_only": false,
"source_scenario_id": null,
"created_at": "2025-12-15T09:00:00Z",
"updated_at": "2025-12-15T09:00:00Z"
},
"metrics": {
"headcount": {
"label": "Headcount",
"scenario": 118,
"source": 123,
"delta": -5
},
"fte": {
"label": "FTE",
"scenario": 111.4,
"source": 116.4,
"delta": -5
},
"cost": {
"label": "Monthly Cost (cents)",
"scenario": 142500000,
"source": 148000000,
"delta": -5500000
},
"velocity": {
"label": "Velocity (SP)",
"scenario": 89,
"source": 95,
"delta": -6
}
},
"teams": [
{
"key": "team:44",
"status": "changed",
"department": "Engineering",
"placements": [],
"badges": []
}
],
"actors": [
{
"key": "actor:98",
"status": "changed",
"badges": []
}
],
"change_log": [
{
"entity_type": "Team",
"action": "updated",
"classification": "updated",
"identity": {
"name": "Platform Enablement"
},
"created_at": "2026-03-01T10:15:00Z",
"count": 1
}
]
}
Queues the existing promotion pipeline with type scenario_promotion.
The slug of the scenario.
The ID of the scenario.
curl --request POST \
"https://app.orgonaut.co/api/v1/scenarios/ab/promote" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "X-Tenant: string required Tenant slug; required for tenant-scoped endpoints. Example: \"demo\"" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"confirmed_promotion\": true,
\"confirmed_archive\": true
}"
{
"message": "Scenario promotion started. Promotion in progress.",
"status": "queued",
"scenario_id": 1,
"tasks_url": "https://app.orgonaut.test/api/v1/scenarios/tasks"
}
The slug of the scenario.
The ID of the scenario.
curl --request POST \
"https://app.orgonaut.co/api/v1/scenarios/ab/submit" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "X-Tenant: string required Tenant slug; required for tenant-scoped endpoints. Example: \"demo\"" \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"data": {
"id": 1,
"name": "FY26 Cost Optimisation",
"status": "under_review"
}
}
The slug of the scenario.
The ID of the scenario.
curl --request POST \
"https://app.orgonaut.co/api/v1/scenarios/ab/approve" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "X-Tenant: string required Tenant slug; required for tenant-scoped endpoints. Example: \"demo\"" \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"data": {
"id": 1,
"name": "FY26 Cost Optimisation",
"status": "approved"
}
}
The page number.
Max 100.
Comma-separated columns, prefix with - for DESC. Allowed: id,name,created_at.
Filter by status.
Sparse fields for scenarios.
Comma-separated relationships. Allowed: teams,aggregate.
Snapshot date for aggregates. Format: YYYY-MM-DD.
curl --request GET \
--get "https://app.orgonaut.co/api/v1/snapshots?page=1&per_page=25&sort=-created_at%2Cname&filter%5Bstatus%5D=archived&fields%5Bscenarios%5D=id%2Cname%2Ckind&include=aggregate&as_of=2025-09-01" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "X-Tenant: string required Tenant slug; required for tenant-scoped endpoints. Example: \"demo\"" \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"data": [
{
"id": 12,
"name": "Baseline Snapshot 2025-11-01",
"kind": "baseline_archive"
}
],
"links": {
"first": null,
"last": null,
"prev": null,
"next": null
},
"meta": {
"total": 1,
"current_page": 1,
"per_page": 15,
"last_page": 1
}
}
The slug of the scenario.
Snapshot id.
Comma-separated relationships. Allowed: teams,aggregate.
Snapshot date for aggregates. Format: YYYY-MM-DD.
curl --request GET \
--get "https://app.orgonaut.co/api/v1/snapshots/ab?include=aggregate&as_of=2025-09-01" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "X-Tenant: string required Tenant slug; required for tenant-scoped endpoints. Example: \"demo\"" \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"data": {
"id": 12,
"name": "Baseline Snapshot 2025-11-01",
"kind": "baseline_archive",
"status": "archived"
}
}
Queues the existing promotion pipeline with type snapshot_restore.
The slug of the scenario.
Snapshot id.
curl --request POST \
"https://app.orgonaut.co/api/v1/snapshots/ab/restore" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "X-Tenant: string required Tenant slug; required for tenant-scoped endpoints. Example: \"demo\"" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"confirmed_promotion\": true,
\"confirmed_archive\": true
}"
{
"message": "Snapshot restore started. Promotion in progress.",
"status": "queued",
"snapshot_id": 12,
"tasks_url": "https://app.orgonaut.test/api/v1/scenarios/tasks"
}
Requires teams.read ability.
The page number.
Max 100.
Comma-separated columns, prefix with - for DESC. Allowed: id,name,created_at.
Filter by department id.
Filter by org unit id (department subtree).
Sparse fields for teams.
Comma-separated relationships. Allowed: aggregate.
curl --request GET \
--get "https://app.orgonaut.co/api/v1/teams?page=1&per_page=25&sort=-created_at%2Cname&filter%5Bdepartment_id%5D=5&filter%5Borg_unit_id%5D=10&fields%5Bteams%5D=id%2Cname&include=aggregate" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "X-Tenant: string required Tenant slug; required for tenant-scoped endpoints. Example: \"demo\"" \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"data": [
{
"id": 15,
"name": "Team CúChulainn"
}
],
"links": {
"first": null,
"last": null,
"prev": null,
"next": null
},
"meta": {
"total": 1,
"current_page": 1,
"per_page": 15,
"last_page": 1
}
}
Requires teams.create ability.
curl --request POST \
"https://app.orgonaut.co/api/v1/teams" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "X-Tenant: string required Tenant slug; required for tenant-scoped endpoints. Example: \"demo\"" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"name\": \"Platform\",
\"team_type_id\": 1,
\"purpose\": \"Internal platforms\",
\"valid_from\": \"2025-01-01\",
\"valid_to\": \"2025-12-31\",
\"parent_org_unit_id\": 7
}"
{
"data": {
"id": 15,
"name": "Team CúChulainn",
"team_type_id": 3,
"team_type": {
"id": 3,
"name": "Cross-functional",
"slug": "cross-functional"
},
"purpose": "Platform delivery",
"parent_org_unit_id": 202,
"scenario_id": 1
}
}
Requires teams.read ability.
The ID of the team.
curl --request GET \
--get "https://app.orgonaut.co/api/v1/teams/11" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "X-Tenant: string required Tenant slug; required for tenant-scoped endpoints. Example: \"demo\"" \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"data": {
"id": 15,
"name": "Team CúChulainn",
"team_type_id": 3,
"team_type": {
"id": 3,
"name": "Cross-functional",
"slug": "cross-functional"
},
"purpose": "Platform delivery",
"parent_org_unit_id": 202,
"scenario_id": 1,
"created_at": "2025-01-10T09:00:00Z"
}
}
Requires teams.update ability.
The ID of the team.
curl --request PUT \
"https://app.orgonaut.co/api/v1/teams/11" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "X-Tenant: string required Tenant slug; required for tenant-scoped endpoints. Example: \"demo\"" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"name\": \"Platform\",
\"team_type_id\": 1,
\"purpose\": \"Internal platforms\",
\"valid_from\": \"2025-01-01\",
\"valid_to\": \"2025-12-31\",
\"parent_org_unit_id\": 7
}"
{
"data": {
"id": 15,
"name": "Team Fianna",
"team_type_id": 3,
"team_type": {
"id": 3,
"name": "Cross-functional",
"slug": "cross-functional"
},
"purpose": "Platform delivery",
"parent_org_unit_id": 202,
"scenario_id": 1
}
}
Requires teams.delete ability.
The ID of the team.
curl --request DELETE \
"https://app.orgonaut.co/api/v1/teams/11" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "X-Tenant: string required Tenant slug; required for tenant-scoped endpoints. Example: \"demo\"" \
--header "Content-Type: application/json" \
--header "Accept: application/json" [Empty response]
The ID of the team.
The team ID.
The sprint to query.
date Mutually exclusive with sprint_id.
curl --request GET \
--get "https://app.orgonaut.co/api/v1/teams/11/velocity?sprint_id=11&as_of=ab" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "X-Tenant: string required Tenant slug; required for tenant-scoped endpoints. Example: \"demo\"" \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"data": {
"team_id": 12,
"sprint_id": 42,
"period": {
"label": "Sprint 18",
"starts_at": "2025-09-01",
"ends_at": "2025-09-14"
},
"committed_sp": 34,
"completed_sp": 31,
"scope_added_sp": 3,
"carried_over_sp": 5,
"stories_done": 12,
"source": "jira"
}
}
The ID of the team.
The team ID.
Starting sprint ID.
Ending sprint ID.
date Start date.
date End date.
Maximum results. Defaults to 12.
asc or desc. Defaults to asc.
curl --request GET \
--get "https://app.orgonaut.co/api/v1/teams/11/velocity/series?from_sprint_id=11&to_sprint_id=11&from=ab&to=ab&limit=11&order=ab" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "X-Tenant: string required Tenant slug; required for tenant-scoped endpoints. Example: \"demo\"" \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"data": [
{
"team_id": 12,
"sprint_id": 41,
"period": {
"label": "Sprint 17",
"starts_at": "2025-08-18",
"ends_at": "2025-08-31"
},
"committed_sp": 29,
"completed_sp": 27,
"scope_added_sp": 2,
"carried_over_sp": 4,
"stories_done": 10,
"source": "jira"
},
{
"team_id": 12,
"sprint_id": 42,
"period": {
"label": "Sprint 18",
"starts_at": "2025-09-01",
"ends_at": "2025-09-14"
},
"committed_sp": 34,
"completed_sp": 31,
"scope_added_sp": 3,
"carried_over_sp": 5,
"stories_done": 12,
"source": "jira"
}
]
}
curl --request GET \
--get "https://app.orgonaut.co/api/v1/tenant-invitations" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "X-Tenant: string required Tenant slug; required for tenant-scoped endpoints. Example: \"acme\"" \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"data": [
{
"id": 17,
"tenant_id": 3,
"email": "new.user@example.com",
"role": "manager",
"state": "pending",
"invited_by": 7,
"expires_at": "2026-03-14T09:00:00Z",
"accepted_at": null,
"accepted_by_user_id": null,
"revoked_at": null,
"created_at": "2026-03-07T09:00:00Z",
"updated_at": "2026-03-07T09:00:00Z"
}
]
}
curl --request POST \
"https://app.orgonaut.co/api/v1/tenant-invitations" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "X-Tenant: string required Tenant slug; required for tenant-scoped endpoints. Example: \"acme\"" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"email\": \"\\\"new.user@example.com\\\"\",
\"role\": \"\\\"manager\\\"\"
}"
{
"data": {
"id": 17,
"tenant_id": 3,
"email": "new.user@example.com",
"role": "manager",
"state": "pending",
"invited_by": 7,
"expires_at": "2026-03-14T09:00:00Z",
"accepted_at": null,
"accepted_by_user_id": null,
"revoked_at": null,
"created_at": "2026-03-07T09:00:00Z",
"updated_at": "2026-03-07T09:00:00Z"
}
}
Invitation id.
curl --request POST \
"https://app.orgonaut.co/api/v1/tenant-invitations/17/resend" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "X-Tenant: string required Tenant slug; required for tenant-scoped endpoints. Example: \"acme\"" \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"data": {
"id": 23,
"tenant_id": 3,
"email": "new.user@example.com",
"role": "manager",
"state": "pending",
"invited_by": 7,
"expires_at": "2026-03-21T09:00:00Z",
"accepted_at": null,
"accepted_by_user_id": null,
"revoked_at": null,
"created_at": "2026-03-07T10:00:00Z",
"updated_at": "2026-03-07T10:00:00Z"
}
}
Invitation id.
curl --request POST \
"https://app.orgonaut.co/api/v1/tenant-invitations/17/revoke" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "X-Tenant: string required Tenant slug; required for tenant-scoped endpoints. Example: \"acme\"" \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"data": {
"id": 17,
"tenant_id": 3,
"email": "new.user@example.com",
"role": "manager",
"state": "revoked",
"invited_by": 7,
"expires_at": "2026-03-14T09:00:00Z",
"accepted_at": null,
"accepted_by_user_id": null,
"revoked_at": "2026-03-07T10:15:00Z",
"created_at": "2026-03-07T09:00:00Z",
"updated_at": "2026-03-07T10:15:00Z"
}
}
curl --request GET \
--get "https://app.orgonaut.co/api/v1/tenant-members" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "X-Tenant: string required Tenant slug; required for tenant-scoped endpoints. Example: \"acme\"" \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"data": {
"active": [
{
"tenant_id": 3,
"user_id": 42,
"name": "Aisling O'Neill",
"email": "aisling@example.com",
"role": "admin",
"membership_state": "active",
"archived_at": null,
"archived_by": null,
"reactivated_at": null,
"reactivated_by": null
}
],
"archived": [
{
"tenant_id": 3,
"user_id": 51,
"name": "Niall Byrne",
"email": "niall@example.com",
"role": "member",
"membership_state": "archived",
"archived_at": "2026-02-21T09:30:00Z",
"archived_by": 42,
"reactivated_at": null,
"reactivated_by": null
}
]
}
}
Tenant user id.
curl --request PATCH \
"https://app.orgonaut.co/api/v1/tenant-members/42/archive" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "X-Tenant: string required Tenant slug; required for tenant-scoped endpoints. Example: \"acme\"" \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"data": {
"tenant_id": 3,
"user_id": 42,
"name": "Aisling O'Neill",
"email": "aisling@example.com",
"role": "member",
"membership_state": "archived",
"archived_at": "2026-03-07T10:15:00Z",
"archived_by": 7,
"reactivated_at": null,
"reactivated_by": null
}
}
Tenant user id.
curl --request PATCH \
"https://app.orgonaut.co/api/v1/tenant-members/42/reactivate" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "X-Tenant: string required Tenant slug; required for tenant-scoped endpoints. Example: \"acme\"" \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"data": {
"tenant_id": 3,
"user_id": 42,
"name": "Aisling O'Neill",
"email": "aisling@example.com",
"role": "member",
"membership_state": "active",
"archived_at": "2026-03-01T10:15:00Z",
"archived_by": 7,
"reactivated_at": "2026-03-07T11:05:00Z",
"reactivated_by": 7
}
}
Tenant user id.
curl --request PATCH \
"https://app.orgonaut.co/api/v1/tenant-members/42/role" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "X-Tenant: string required Tenant slug; required for tenant-scoped endpoints. Example: \"acme\"" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"role\": \"\\\"viewer\\\"\"
}"
{
"data": {
"tenant_id": 3,
"user_id": 42,
"name": "Aisling O'Neill",
"email": "aisling@example.com",
"role": "viewer",
"membership_state": "active",
"archived_at": null,
"archived_by": null,
"reactivated_at": null,
"reactivated_by": null
}
}
curl --request POST \
"https://app.orgonaut.co/api/v1/tenant-members/transfer-ownership" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "X-Tenant: string required Tenant slug; required for tenant-scoped endpoints. Example: \"acme\"" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"target_user_id\": 42
}"
{
"data": {
"status": "ok"
}
}