ORGONAUT

Introduction

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.

Authenticating requests

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.

AI Tooling Usage

AI Tooling — List daily usage records

GET
https://app.orgonaut.co
/api/v1/ai-tooling/usage
requires authentication

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.

Headers

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
X-Tenant
Example:
string required Tenant slug; required for tenant-scoped endpoints. Example: "demo"
Content-Type
Example:
application/json
Accept
Example:
application/json

Query Parameters

actor_id
integer

Filter by actor ID. Only returns records matched to this actor.

Example:
42
provider
string

Filter by provider slug (e.g. "claude").

Example:
claude
from
string

date Start of date range (inclusive, YYYY-MM-DD).

Example:
2026-03-01
to
string

date End of date range (inclusive, YYYY-MM-DD). Must be on or after from.

Example:
2026-03-25
per_page
integer

Results per page. Min 1, max 100. Defaults to 25.

Example:
25

Body Parameters

Response Fields

Example request:
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: \&quot;demo\&quot;" \
    --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
}"
Example response:
{
    "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
    }
}
{
    "message": "The given data was invalid.",
    "errors": {
        "to": [
            "The to field must be a date after or equal to from."
        ]
    }
}

AI Tooling — Actor summary

GET
https://app.orgonaut.co
/api/v1/ai-tooling/actors/{actor_id}/summary
requires authentication

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.

Headers

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
X-Tenant
Example:
string required Tenant slug; required for tenant-scoped endpoints. Example: "demo"
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

actor_id
integer
required

The ID of the actor.

Example:
11
actor
integer
required

The actor ID.

Example:
42

Response Fields

Example request:
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: \&quot;demo\&quot;" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
Example response:
{
    "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
            }
        }
    }
}

AI Tooling — Actor daily series

GET
https://app.orgonaut.co
/api/v1/ai-tooling/actors/{actor_id}/series
requires authentication

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.

Headers

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
X-Tenant
Example:
string required Tenant slug; required for tenant-scoped endpoints. Example: "demo"
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

actor_id
integer
required

The ID of the actor.

Example:
11
actor
integer
required

The actor ID.

Example:
42

Query Parameters

from
string

date Start of date range (YYYY-MM-DD). Defaults to 6 months ago (start of month).

Example:
2025-10-01
to
string

date End of date range (YYYY-MM-DD). Must be on or after from. Defaults to today.

Example:
2026-03-25

Body Parameters

Response Fields

Example request:
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: \&quot;demo\&quot;" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"from\": \"2026-04-13T21:34:33\",
    \"to\": \"2069-05-04\"
}"
Example response:
{
    "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
        }
    ]
}
{
    "message": "The given data was invalid.",
    "errors": {
        "to": [
            "The to field must be a date after or equal to from."
        ]
    }
}

AI Tooling — Team summary

GET
https://app.orgonaut.co
/api/v1/ai-tooling/teams/{team_id}/summary
requires authentication

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.

Headers

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
X-Tenant
Example:
string required Tenant slug; required for tenant-scoped endpoints. Example: "demo"
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

team_id
integer
required

The ID of the team.

Example:
11
team
integer
required

The team ID.

Example:
7

Response Fields

Example request:
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: \&quot;demo\&quot;" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
Example response:
{
    "data": {
        "team_id": 7,
        "monthly_cost_cents": 2500,
        "mtd_cost_cents": 1200,
        "sessions": 45,
        "commits": 22,
        "prs": 6,
        "lines_added": 1800,
        "lines_removed": 400
    }
}

AI Tooling — Department summary

GET
https://app.orgonaut.co
/api/v1/ai-tooling/departments/{department_id}/summary
requires authentication

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.

Headers

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
X-Tenant
Example:
string required Tenant slug; required for tenant-scoped endpoints. Example: "demo"
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

department_id
integer
required

The ID of the department.

Example:
11
department
integer
required

The department ID.

Example:
3

Query Parameters

scope
string

Aggregation scope: "direct" (department org unit only) or "subtree" (all descendants). Defaults to "subtree".

Example:
subtree

Response Fields

Example request:
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: \&quot;demo\&quot;" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
Example response:
{
    "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
    }
}

Actors

Actors — List

GET
https://app.orgonaut.co
/api/v1/actors
requires authentication

Returns actors with their primary team resolved from primary org-unit placements (primary=true) inside the active scenario context.

Requires actors.read ability.

Headers

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
X-Tenant
Example:
string required Tenant slug; required for tenant-scoped endpoints. Example: "demo"
Content-Type
Example:
application/json
Accept
Example:
application/json

Query Parameters

page
integer

The page number.

Example:
1
per_page
integer

Max 100.

Example:
25
sort
string

Comma-separated columns, prefix with - for DESC. Allowed: id,name,created_at.

Example:
-created_at,name
filter[status]
string

Filter by status.

Example:
active
filter[department_id]
integer

Filter by department id. Uses the department org unit mapping derived from org_unit_actor.

Example:
5
filter[org_unit_id]
integer

Filter by org unit id (department or team subtree).

Example:
10
fields[actors]
string

Sparse fields for actors.

Example:
id,first_name,last_name
include
string

Comma-separated expansions. Allowed: manager,org_units,team,department. The team/department flags surface computed placement data.

Example:
manager,team
as_of
string

The date/datetime used for time-window checks. Defaults to now.

Example:
2025-09-01
scenario_id
integer

The scenario ID to scope results. Omit or pass scenario_id=null for baseline data.

Example:
4
with_counts
string

Comma-separated relationship counts. Allowed: reports.

Example:
reports

Response Fields

Example request:
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: \&quot;demo\&quot;" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
Example response:
{
    "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"
            }
        }
    ]
}
{
    "code": "query.invalid_parameter",
    "message": "Unsupported sort: salary",
    "details": {
        "allowed": [
            "id",
            "name",
            "created_at"
        ]
    }
}
{
    "message": "The given data was invalid.",
    "errors": {
        "per_page": [
            "The per page must be at least 1."
        ]
    }
}

Store a newly created actor.

POST
https://app.orgonaut.co
/api/v1/actors
requires authentication

Requires actors.create ability. Manager must belong to the same tenant and cannot reference the actor themselves.

Headers

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
X-Tenant
Example:
string required Tenant slug; required for tenant-scoped endpoints. Example: "demo"
Content-Type
Example:
application/json
Accept
Example:
application/json

Body Parameters

Response Fields

Example request:
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: \&quot;demo\&quot;" \
    --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\"
    }
}"
Example response:
{
    "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"
    }
}
{
    "code": "limit.actors",
    "message": "Actor plan limit reached (250/250). Upgrade your plan to add more people.",
    "limit": 250,
    "current": 250
}

Actors — Show

GET
https://app.orgonaut.co
/api/v1/actors/{id}
requires authentication

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.

Headers

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
X-Tenant
Example:
string required Tenant slug
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

id
integer
required

The ID of the actor.

Example:
44

Query Parameters

include
string

Comma-separated expansions. Allowed: manager,org_units,team,department. The team/department flags surface computed placement data.

Example:
manager,team
as_of
string

The date/datetime used for time-window checks. Defaults to now.

Example:
2025-09-01
scenario_id
string

The scenario context to resolve against. Defaults to current (baseline if none).

with_counts
string

Comma-separated relationship counts. Allowed: reports.

Example:
reports

Response Fields

Example request:
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"
Example response:
{
    "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"
    }
}

Update the specified actor.

PUT
PATCH
https://app.orgonaut.co
/api/v1/actors/{id}
requires authentication

Requires actors.update ability and an X-Tenant header. Manager must belong to the same tenant and cannot reference the actor themselves.

Headers

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
X-Tenant
Example:
string required Tenant slug; required for tenant-scoped endpoints. Example: "demo"
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

id
integer
required

The ID of the actor.

Example:
44

Body Parameters

Response Fields

Example request:
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: \&quot;demo\&quot;" \
    --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\"
            ]
        }
    }
}"
Example response:
{
    "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"
    }
}

Remove the specified actor.

DELETE
https://app.orgonaut.co
/api/v1/actors/{id}
requires authentication

Requires actors.delete ability and an X-Tenant header.

Headers

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
X-Tenant
Example:
string required Tenant slug
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

id
integer
required

The ID of the actor.

Example:
44
Example request:
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"
Example response:
[Empty response]

Actor compensations — List

GET
https://app.orgonaut.co
/api/v1/actors/{actor_id}/compensations
requires authentication

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.

Headers

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
X-Tenant
Example:
string required Tenant slug; required for tenant-scoped endpoints. Example: "demo"
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

actor_id
integer
required

The ID of the actor.

Example:
11
actor
integer
required

The actor identifier.

Example:
11

Query Parameters

scenario_id
integer

Scenario id to scope results; omit or pass null for baseline only.

Example:
4
as_of
string

Date used to flag current slices.

Example:
2025-03-01
include
string

Comma-separated relationships. Allowed: scenario,actor.

Example:
scenario
fields[actor_compensations]
string

Sparse fieldset.

Example:
id,currency,base_salary_cents
Example request:
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: \&quot;demo\&quot;" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
Example response:
{
    "data": [
        {
            "id": 1,
            "currency": "USD",
            "base_salary_cents": 12000000
        }
    ]
}

Actor compensations — Create

POST
https://app.orgonaut.co
/api/v1/actors/{actor_id}/compensations
requires authentication

Stores a new compensation slice for the actor.

Requires actors.update ability.

Headers

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
X-Tenant
Example:
string required Tenant slug; required for tenant-scoped endpoints. Example: "demo"
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

actor_id
integer
required

The ID of the actor.

Example:
11
actor
integer
required

The actor identifier.

Example:
11

Query Parameters

include
string

Comma-separated relationships. Allowed: scenario,actor.

Example:
scenario

Body Parameters

Example request:
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: \&quot;demo\&quot;" \
    --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\"
    }
}"
Example response:
{
    "data": {
        "id": 9,
        "currency": "EUR",
        "daily_rate_cents": 55000
    }
}

Actor compensations — Update

PATCH
https://app.orgonaut.co
/api/v1/actors/{actor_id}/compensations/{id}
requires authentication

Updates an existing compensation slice for the actor.

Requires actors.update ability.

Headers

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
X-Tenant
Example:
string required Tenant slug; required for tenant-scoped endpoints. Example: "demo"
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

actor_id
integer
required

The ID of the actor.

Example:
11
id
integer
required

The ID of the compensation.

Example:
11
actor
integer
required

The actor identifier.

Example:
11
compensation
integer
required

The compensation identifier.

Example:
11

Query Parameters

include
string

Comma-separated relationships. Allowed: scenario,actor.

Example:
scenario

Body Parameters

Example request:
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: \&quot;demo\&quot;" \
    --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\"
    }
}"
Example response:
{
    "data": {
        "id": 9,
        "currency": "USD",
        "base_salary_cents": 9900000
    }
}

Actor compensations — Delete

DELETE
https://app.orgonaut.co
/api/v1/actors/{actor_id}/compensations/{id}
requires authentication

Soft deletes a compensation slice.

Requires actors.delete ability.

Headers

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
X-Tenant
Example:
string required Tenant slug; required for tenant-scoped endpoints. Example: "demo"
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

actor_id
integer
required

The ID of the actor.

Example:
11
id
integer
required

The ID of the compensation.

Example:
11
actor
integer
required

The actor identifier.

Example:
11
compensation
integer
required

The compensation identifier.

Example:
11
Example request:
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: \&quot;demo\&quot;" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
Example response:
[Empty response]

Aggregates

Queue recalculation of cached aggregates.

POST
https://app.orgonaut.co
/api/v1/aggregates/recalculate
requires authentication

Headers

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
X-Tenant
Example:
string required Tenant slug; required for tenant-scoped endpoints. Example: "demo"
Content-Type
Example:
application/json
Accept
Example:
application/json
Example request:
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: \&quot;demo\&quot;" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
Example response:
{
    "status": "queued"
}

Astro

List Astro capabilities for the current tenant, user, and context.

GET
https://app.orgonaut.co
/api/v1/astro/capabilities
requires authentication

Headers

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
X-Tenant
Example:
string required Tenant slug; required for tenant-scoped endpoints. Example: "demo"
Content-Type
Example:
application/json
Accept
Example:
application/json

Query Parameters

category
string

Filter by category key.

Example:
work_with_scenarios
kind
string

Filter by capability kind.

Example:
read
availability
string

Filter by computed availability.

Example:
available
include_unavailable
boolean

Include capabilities that are unavailable in the current context.

Example:
false
view_mode
string

Override the current Astro view mode (live, scenario, snapshot).

Example:
scenario
scenario_id
integer

Optional scenario id used for scenario- or snapshot-scoped discovery.

Example:
7
focused_entity_type
string

Optional focused entity type (actor, department, org_unit, scenario, team).

Example:
team
focused_entity_id
integer

Optional focused entity id.

Example:
12
as_of
string

date Optional as-of date for scoped discovery.

Example:
2026-03-01
Example request:
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: \&quot;demo\&quot;" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
Example response:
{
    "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
        }
    }
}

Show one Astro capability for the current tenant, user, and context.

GET
https://app.orgonaut.co
/api/v1/astro/capabilities/{key}
requires authentication

Headers

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
X-Tenant
Example:
string required Tenant slug; required for tenant-scoped endpoints. Example: "demo"
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

key
string
required

Capability key.

Example:
explore.organisation

Query Parameters

view_mode
string

Override the current Astro view mode (live, scenario, snapshot).

Example:
scenario
scenario_id
integer

Optional scenario id used for scenario- or snapshot-scoped discovery.

Example:
7
focused_entity_type
string

Optional focused entity type (actor, department, org_unit, scenario, team).

Example:
team
focused_entity_id
integer

Optional focused entity id.

Example:
12
as_of
string

date Optional as-of date for scoped discovery.

Example:
2026-03-01
Example request:
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: \&quot;demo\&quot;" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
Example response:
{
    "data": {
        "key": "explore.organisation",
        "title": "Explore organisation structure",
        "kind": "read",
        "availability_status": "available",
        "examples": [
            {
                "prompt": "List the departments in the current scope."
            }
        ]
    }
}
{
    "message": "Capability not found."
}

Auth/Tokens

List the authenticated user's tokens.

GET
https://app.orgonaut.co
/api/v1/tokens
requires authentication

Headers

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
X-Tenant
Example:
string required Tenant slug; required for tenant-scoped endpoints. Example: "demo"
Content-Type
Example:
application/json
Accept
Example:
application/json
Example request:
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: \&quot;demo\&quot;" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
Example response:
[
    {
        "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"
    }
]

Revoke a token.

DELETE
https://app.orgonaut.co
/api/v1/tokens/{id}
requires authentication

Headers

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
X-Tenant
Example:
string required Tenant slug; required for tenant-scoped endpoints. Example: "demo"
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

id
string
required

The ID of the token.

Example:
ab
token
integer
required

The token ID.

Example:
11
Example request:
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: \&quot;demo\&quot;" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
Example response:
[Empty response]

Rotate a token.

POST
https://app.orgonaut.co
/api/v1/tokens/{token}/rotate
requires authentication

Headers

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
X-Tenant
Example:
string required Tenant slug; required for tenant-scoped endpoints. Example: "demo"
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

token
integer
required

The token ID.

Example:
11
Example request:
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: \&quot;demo\&quot;" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
Example response:
{
    "token": "1|abcdef123456"
}

Rename a token.

PATCH
https://app.orgonaut.co
/api/v1/tokens/{id}
requires authentication

Headers

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
X-Tenant
Example:
string required Tenant slug; required for tenant-scoped endpoints. Example: "demo"
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

id
string
required

The ID of the token.

Example:
ab
token
integer
required

The token ID.

Example:
11

Body Parameters

Example request:
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: \&quot;demo\&quot;" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"CI bot token\"
}"
Example response:
[Empty response]

Issue a new actoral access token.

POST
https://app.orgonaut.co
/api/v1/tokens

Headers

X-Tenant
Example:
string required Tenant slug for token scope. Example: "demo"
Content-Type
Example:
application/json
Accept
Example:
application/json

Body Parameters

Example request:
curl --request POST \
    "https://app.orgonaut.co/api/v1/tokens" \
    --header "X-Tenant: string required Tenant slug for token scope. Example: \&quot;demo\&quot;" \
    --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\"
    ]
}"
Example response:
{
    "token": "1|abcdef123456"
}
{
    "code": "auth.forbidden",
    "message": "Forbidden."
}
{
    "code": "limit.api_tokens",
    "message": "API token plan limit reached (1/1). Revoke an existing token or upgrade your plan.",
    "limit": 1,
    "current": 1
}

Costs

Agent Cost Events — Create

POST
https://app.orgonaut.co
/api/v1/actor-cost-events
requires authentication

Ingest a machine cost event with idempotency protection. Duplicate idempotency keys return the existing event instead of creating a new row.

Headers

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
X-Tenant
Example:
string required Tenant slug; required for tenant-scoped endpoints. Example: "demo"
Content-Type
Example:
application/json
Accept
Example:
application/json

Body Parameters

Example request:
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: \&quot;demo\&quot;" \
    --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
    }
}"
Example response:
{
    "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"
    }
}
{
    "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"
    }
}

AI Model Costs — List

GET
https://app.orgonaut.co
/api/v1/settings/ai/costs
requires authentication

List tenant-global model pricing rows.

Headers

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
X-Tenant
Example:
string required Tenant slug; required for tenant-scoped endpoints. Example: "demo"
Content-Type
Example:
application/json
Accept
Example:
application/json

Query Parameters

sort
string

Comma-separated sort list. Allowed: id,provider,model,effective_from,effective_to,created_at. Prefix with - for descending order.

Example:
-effective_from,provider
filter[provider]
string

Filter by provider slug.

Example:
openai
filter[model]
string

Filter by model identifier.

Example:
gpt-4.1
filter[currency]
string

Filter by currency code.

Example:
USD
fields[ai_model_costs]
string

Sparse fieldset for AI model costs.

Example:
id,provider,model,currency,is_active
Example request:
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: \&quot;demo\&quot;" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
Example response:
{
    "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
    }
}

AI Model Costs — Create

POST
https://app.orgonaut.co
/api/v1/settings/ai/costs
requires authentication

Create a tenant-global model pricing row.

Headers

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
X-Tenant
Example:
string required Tenant slug; required for tenant-scoped endpoints. Example: "demo"
Content-Type
Example:
application/json
Accept
Example:
application/json

Body Parameters

Example request:
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: \&quot;demo\&quot;" \
    --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\"
}"
Example response:
{
    "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"
    }
}

AI Model Costs — Show

GET
https://app.orgonaut.co
/api/v1/settings/ai/costs/{ai_model_cost}
requires authentication

Return a single tenant-global model pricing row.

Headers

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
X-Tenant
Example:
string required Tenant slug; required for tenant-scoped endpoints. Example: "demo"
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

ai_model_cost
integer
required

The AI model cost row id.

Example:
11

Query Parameters

fields[ai_model_costs]
string

Sparse fieldset for AI model costs.

Example:
id,provider,model,currency,is_active
Example request:
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: \&quot;demo\&quot;" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
Example response:
{
    "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"
    }
}

AI Model Costs — Update

PATCH
https://app.orgonaut.co
/api/v1/settings/ai/costs/{ai_model_cost}
requires authentication

Update a tenant-global model pricing row.

Headers

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
X-Tenant
Example:
string required Tenant slug; required for tenant-scoped endpoints. Example: "demo"
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

ai_model_cost
integer
required

The AI model cost row id.

Example:
11

Body Parameters

Example request:
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: \&quot;demo\&quot;" \
    --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\"
}"
Example response:
{
    "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"
    }
}

AI Model Costs — Delete

DELETE
https://app.orgonaut.co
/api/v1/settings/ai/costs/{ai_model_cost}
requires authentication

Delete a tenant-global model pricing row.

Headers

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
X-Tenant
Example:
string required Tenant slug; required for tenant-scoped endpoints. Example: "demo"
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

ai_model_cost
integer
required

The AI model cost row id.

Example:
11
Example request:
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: \&quot;demo\&quot;" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
Example response:
[Empty response]

Department Types

GET
https://app.orgonaut.co
/api/v1/department-types/search
requires authentication

Requires departments.read ability.

Headers

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
X-Tenant
Example:
string required Tenant slug; required for tenant-scoped endpoints. Example: "acme"
Content-Type
Example:
application/json
Accept
Example:
application/json

Query Parameters

q
string

Search term applied to name and slug.

Example:
ops
Example request:
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: \&quot;acme\&quot;" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
Example response:

Create a Department Type for the active tenant.

POST
https://app.orgonaut.co
/api/v1/department-types
requires authentication

Requires departments.create ability.

Headers

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
X-Tenant
Example:
string required Tenant slug; required for tenant-scoped endpoints. Example: "acme"
Content-Type
Example:
application/json
Accept
Example:
application/json

Body Parameters

Example request:
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: \&quot;acme\&quot;" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"Operations\",
    \"slug\": \"ops\",
    \"color\": \"#008080\",
    \"description\": \"Supports company-wide services\"
}"
Example response:
{
    "id": 3,
    "name": "Operations",
    "slug": "operations",
    "color": "#008080"
}

Departments

Display a paginated listing of departments.

GET
https://app.orgonaut.co
/api/v1/departments
requires authentication

Requires departments.read ability.

Headers

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
X-Tenant
Example:
string required Tenant slug; required for tenant-scoped endpoints. Example: "demo"
Content-Type
Example:
application/json
Accept
Example:
application/json

Query Parameters

page
integer

The page number.

Example:
1
per_page
integer

Max 100.

Example:
25
sort
string

Comma-separated columns, prefix with - for DESC. Allowed: id,name,created_at.

Example:
-created_at,name
filter[lead_id]
integer

Filter by lead.

Example:
44
fields[departments]
string

Sparse fields for departments.

Example:
id,name,department_type_id
include
string

Comma-separated relationships. Allowed: lead,departmentType,parentDepartment,aggregate.

Example:
lead,departmentType
Example request:
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: \&quot;demo\&quot;" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
Example response:
{
    "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
    }
}
{
    "code": "query.invalid_parameter",
    "message": "Unsupported sort: salary",
    "details": {
        "allowed": [
            "id",
            "name",
            "created_at"
        ]
    }
}
{
    "message": "The given data was invalid.",
    "errors": {
        "per_page": [
            "The per page must be at least 1."
        ]
    }
}

Store a newly created department.

POST
https://app.orgonaut.co
/api/v1/departments
requires authentication

Requires departments.create ability.

Headers

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
X-Tenant
Example:
string required Tenant slug; required for tenant-scoped endpoints. Example: "demo"
Content-Type
Example:
application/json
Accept
Example:
application/json

Body Parameters

Example request:
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: \&quot;demo\&quot;" \
    --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.\"
}"
Example response:
{
    "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."
    }
}

Display a specific department.

GET
https://app.orgonaut.co
/api/v1/departments/{id}
requires authentication

Requires departments.read ability.

Headers

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
X-Tenant
Example:
string required Tenant slug; required for tenant-scoped endpoints. Example: "demo"
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

id
integer
required

The ID of the department.

Example:
11
Example request:
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: \&quot;demo\&quot;" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
Example response:
{
    "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."
    }
}

Update a department.

PUT
PATCH
https://app.orgonaut.co
/api/v1/departments/{id}
requires authentication

Requires departments.update ability.

Headers

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
X-Tenant
Example:
string required Tenant slug; required for tenant-scoped endpoints. Example: "demo"
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

id
integer
required

The ID of the department.

Example:
11

Body Parameters

Example request:
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: \&quot;demo\&quot;" \
    --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.\"
}"
Example response:
{
    "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."
    }
}

Delete a department.

DELETE
https://app.orgonaut.co
/api/v1/departments/{id}
requires authentication

Requires departments.delete ability.

Headers

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
X-Tenant
Example:
string required Tenant slug; required for tenant-scoped endpoints. Example: "demo"
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

id
integer
required

The ID of the department.

Example:
11
Example request:
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: \&quot;demo\&quot;" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
Example response:
[Empty response]

Initiatives

Display a paginated listing of initiatives.

GET
https://app.orgonaut.co
/api/v1/initiatives
requires authentication

Requires initiatives.read ability.

Headers

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
X-Tenant
Example:
string required Tenant slug; required for tenant-scoped endpoints. Example: "demo"
Content-Type
Example:
application/json
Accept
Example:
application/json

Query Parameters

page
integer

The page number.

Example:
1
per_page
integer

Max 100.

Example:
25
sort
string

Comma-separated columns, prefix with - for DESC. Allowed: id,title,created_at.

Example:
-created_at,title
search
string

Search by title or description.

Example:
cost
filter[status]
string

Filter by status.

Example:
active
filter[baseline_scenario_id]
integer

Filter by baseline scenario.

Example:
1
filter[target_scenario_id]
integer

Filter by target scenario.

Example:
2
fields[initiatives]
string

Sparse fields for initiatives.

Example:
id,title
include
string

Comma-separated relationships. Allowed: baseline_scenario,target_scenario.

Example:
baseline_scenario,target_scenario
Example request:
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: \&quot;demo\&quot;" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
Example response:
{
    "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
    }
}
{
    "code": "query.invalid_parameter",
    "message": "Unsupported sort: salary",
    "details": {
        "allowed": [
            "id",
            "title",
            "created_at"
        ]
    }
}
{
    "message": "The given data was invalid.",
    "errors": {
        "per_page": [
            "The per page must be at least 1."
        ]
    }
}

Store a newly created initiative.

POST
https://app.orgonaut.co
/api/v1/initiatives
requires authentication

Requires initiatives.create ability.

Headers

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
X-Tenant
Example:
string required Tenant slug; required for tenant-scoped endpoints. Example: "demo"
Content-Type
Example:
application/json
Accept
Example:
application/json

Query Parameters

fields[initiatives]
string

Sparse fields for initiatives.

Example:
id,title
include
string

Comma-separated relationships. Allowed: baseline_scenario,target_scenario.

Example:
baseline_scenario,target_scenario

Body Parameters

Example request:
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: \&quot;demo\&quot;" \
    --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
}"
Example response:
{
    "data": {
        "id": 1,
        "title": "Cost Reduction",
        "description": "Reduce infrastructure spend by 15%",
        "status": "active",
        "baseline_scenario_id": 1,
        "target_scenario_id": 2
    }
}
{
    "message": "The given data was invalid.",
    "errors": {
        "title": [
            "The title field is required."
        ]
    }
}

Display a specific initiative.

GET
https://app.orgonaut.co
/api/v1/initiatives/{id}
requires authentication

Requires initiatives.read ability.

Headers

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
X-Tenant
Example:
string required Tenant slug; required for tenant-scoped endpoints. Example: "demo"
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

id
integer
required

The ID of the initiative.

Example:
11

Query Parameters

fields[initiatives]
string

Sparse fields for initiatives.

Example:
id,title
include
string

Comma-separated relationships. Allowed: baseline_scenario,target_scenario.

Example:
baseline_scenario,target_scenario
Example request:
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: \&quot;demo\&quot;" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
Example response:
{
    "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"
        }
    }
}

Update a specific initiative.

PUT
PATCH
https://app.orgonaut.co
/api/v1/initiatives/{id}
requires authentication

Requires initiatives.update ability.

Headers

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
X-Tenant
Example:
string required Tenant slug; required for tenant-scoped endpoints. Example: "demo"
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

id
integer
required

The ID of the initiative.

Example:
11

Query Parameters

fields[initiatives]
string

Sparse fields for initiatives.

Example:
id,title
include
string

Comma-separated relationships. Allowed: baseline_scenario,target_scenario.

Example:
baseline_scenario,target_scenario

Body Parameters

Example request:
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: \&quot;demo\&quot;" \
    --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
}"
Example response:
{
    "data": {
        "id": 1,
        "title": "Cost Optimization",
        "description": "Reduce infrastructure spend by 20%",
        "status": "active",
        "baseline_scenario_id": 1,
        "target_scenario_id": 2
    }
}
{
    "message": "The given data was invalid.",
    "errors": {
        "status": [
            "The selected status is invalid."
        ]
    }
}

Delete a specific initiative.

DELETE
https://app.orgonaut.co
/api/v1/initiatives/{id}
requires authentication

Requires initiatives.delete ability.

Headers

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
X-Tenant
Example:
string required Tenant slug; required for tenant-scoped endpoints. Example: "demo"
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

id
integer
required

The ID of the initiative.

Example:
11
Example request:
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: \&quot;demo\&quot;" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
Example response:
[Empty response]

Integrations

Receive BambooHR webhook payload.

POST
https://app.orgonaut.co
/api/v1/integrations/bamboohr/webhook/{tenant}

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.

Headers

Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

tenant
string
required

Tenant slug.

Example:
demo
Example request:
curl --request POST \
    "https://app.orgonaut.co/api/v1/integrations/bamboohr/webhook/demo" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
Example response:
{
    "status": "accepted"
}

Lineage

List baseline lineage events (promotions + snapshot restores).

GET
https://app.orgonaut.co
/api/v1/lineage
requires authentication

Headers

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
X-Tenant
Example:
string required Tenant slug; required for tenant-scoped endpoints. Example: "demo"
Content-Type
Example:
application/json
Accept
Example:
application/json

Query Parameters

page
integer

The page number.

Example:
1
per_page
integer

Max 100.

Example:
25
filter[type]
string

Filter by lineage type (scenario_promotion, snapshot_restore).

Example:
scenario_promotion
filter[scenario_id]
integer

Filter by related scenario id (promoted/applied/archived).

Example:
42
filter[applied_from]
string

date Filter by applied_at date (inclusive, YYYY-MM-DD).

Example:
2025-01-01
filter[applied_to]
string

date Filter by applied_at date (inclusive, YYYY-MM-DD).

Example:
2025-12-31

Body Parameters

Example request:
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: \&quot;demo\&quot;" \
    --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\"
    }
}"
Example response:
{
    "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
    }
}

Org Placements

Actor placements — List

GET
https://app.orgonaut.co
/api/v1/actors/{actor_id}/placements
requires authentication

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.

Headers

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
X-Tenant
Example:
string required Tenant slug; required for tenant-scoped endpoints. Example: "demo"
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

actor_id
integer
required

The ID of the actor.

Example:
11
actor
integer
required

The actor identifier.

Example:
11

Query Parameters

as_of
string

Filter placements active on this ISO 8601 date.

Example:
2025-09-01
include_history
boolean

Include historical placements in addition to the active set.

Example:
true
scenario_id
string

Scenario slug or id to scope placements; omit or pass null for baseline.

Example:
future-plan
include
string

Comma-separated relationships. Allowed: actor,org_unit.

Example:
actor,org_unit
fields[placements]
string

Sparse fieldset.

Example:
id,org_unit_id,valid_from,valid_to
Example request:
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: \&quot;demo\&quot;" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
Example response:
{
    "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
        }
    ]
}

Actor placements — Create

POST
https://app.orgonaut.co
/api/v1/actors/{actor_id}/placements
requires authentication

Creates a new placement for the given actor.

Requires placements.write ability.

Headers

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
X-Tenant
Example:
string required Tenant slug; required for tenant-scoped endpoints. Example: "demo"
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

actor_id
integer
required

The ID of the actor.

Example:
11
actor
integer
required

The actor identifier.

Example:
11

Query Parameters

include
string

Comma-separated relationships. Allowed: actor,org_unit.

Example:
org_unit

Body Parameters

Example request:
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: \&quot;demo\&quot;" \
    --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
}"
Example response:
{
    "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
    }
}

Actor placements — Update

PATCH
https://app.orgonaut.co
/api/v1/placements/{id}
requires authentication

Updates an existing placement.

Requires placements.write ability.

Headers

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
X-Tenant
Example:
string required Tenant slug; required for tenant-scoped endpoints. Example: "demo"
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

id
integer
required

The ID of the placement.

Example:
11
placement
integer
required

Placement identifier.

Example:
11

Query Parameters

include
string

Comma-separated relationships. Allowed: actor,org_unit.

Example:
actor

Body Parameters

Example request:
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: \&quot;demo\&quot;" \
    --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
}"
Example response:
{
    "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
    }
}

Actor placements — End

DELETE
https://app.orgonaut.co
/api/v1/placements/{id}
requires authentication

Ends a placement by stamping the valid_to date. Omitting the valid_to query parameter defaults to today.

Requires placements.delete ability.

Headers

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
X-Tenant
Example:
string required Tenant slug; required for tenant-scoped endpoints. Example: "demo"
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

id
integer
required

The ID of the placement.

Example:
11
placement
integer
required

Placement identifier.

Example:
11

Query Parameters

valid_to
string

Date to end the placement on (YYYY-MM-DD). Defaults to today.

Example:
2025-10-01
include
string

Comma-separated relationships. Allowed: actor,org_unit.

Example:
org_unit
Example request:
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: \&quot;demo\&quot;" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
Example response:
{
    "data": {
        "id": 9,
        "valid_to": "2025-10-01",
        "is_active": false
    }
}

Org unit roster — List

GET
https://app.orgonaut.co
/api/v1/org-units/{org_unit_id}/actors
requires authentication

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.

Headers

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
X-Tenant
Example:
string required Tenant slug; required for tenant-scoped endpoints. Example: "demo"
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

org_unit_id
integer
required

The ID of the org unit.

Example:
11
org_unit
integer
required

The org unit identifier.

Example:
11

Query Parameters

as_of
string

Date used to evaluate active placements.

Example:
2025-09-01
scenario_id
string

Scenario slug or id to scope placements; omit or pass null for baseline.

Example:
future-plan
include
string

Comma-separated relationships. Allowed: actor,org_unit.

Example:
actor
fields[placements]
string

Sparse fieldset.

Example:
id,actor_id,allocation_pct
Example request:
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: \&quot;demo\&quot;" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
Example response:
{
    "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
        }
    ]
}

Org Units

Display a paginated listing of org units.

GET
https://app.orgonaut.co
/api/v1/org-units
requires authentication

Headers

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
X-Tenant
Example:
string required Tenant slug; required for tenant-scoped endpoints. Example: "demo"
Content-Type
Example:
application/json
Accept
Example:
application/json

Query Parameters

page
integer

The page number.

Example:
1
per_page
integer

Max 100.

Example:
25
sort
string

Comma-separated columns, prefix with - for DESC. Allowed: id,label,created_at.

Example:
-created_at,label
filter[type]
string

Filter by the org unit type (string). Typical values include node, team, and department. Other values may appear if inserted in data.

Example:
node
filter[scenario_id]
integer

Filter by scenario ID.

Example:
1
filter[parent_id]
integer

Filter by parent org unit ID.

Example:
42
fields[org_units]
string

Sparse fields for org units.

Example:
id,label
include
string

Comma-separated relationships. Allowed: scenario,actors,metrics.

Example:
scenario,actors,metrics
as_of
string

date Filter actors memberships or metrics by date. Format: YYYY-MM-DD.

Example:
2025-09-01
Example request:
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: \&quot;demo\&quot;" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
Example response:
{
    "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
    }
}
{
    "code": "query.invalid_parameter",
    "message": "Unsupported sort: salary",
    "details": {
        "allowed": [
            "id",
            "label",
            "created_at"
        ]
    }
}
{
    "message": "The given data was invalid.",
    "errors": {
        "per_page": [
            "The per page must be at least 1."
        ]
    }
}

Get a summarized charts view.

GET
https://app.orgonaut.co
/api/v1/org-units/summary
requires authentication

Headers

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
X-Tenant
Example:
string required Tenant slug; required for tenant-scoped endpoints. Example: "demo"
Content-Type
Example:
application/json
Accept
Example:
application/json

Query Parameters

root_id
integer
required

The ID of the root org unit.

Example:
202
as_of
string

date Format YYYY-MM-DD.

Example:
2025-09-01
sprint_id
integer

The sprint for velocity metrics.

Example:
42
Example request:
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: \&quot;demo\&quot;" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
Example response:
{
    "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": []
    }
}

Get an org subtree (nested) for the current tenant.

GET
https://app.orgonaut.co
/api/v1/org-units/tree
requires authentication

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.

Headers

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
X-Tenant
Example:
string required The tenant slug or id.
Content-Type
Example:
application/json
Accept
Example:
application/json

Query Parameters

root_id
integer

Optional root node id.

Example:
1
depth
integer

The max depth to traverse from the root. Default: 2.

Example:
3
include
string

Comma-separated includes: actors,members,parent,ancestors,path,metrics.

Example:
actors,parent
filter
object
Example:
[]
filter.type
string

Filter by org unit type.

Example:
team
search
string

Case-insensitive search on label.

Example:
Apollo
sort
string

Sort by label asc/desc. Allowed: label, -label. Default: label.

Example:
-label
filter[type]
string

Filter by org unit type.

Example:
team
Example request:
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"
Example response:
{
    "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": []
            }
        ]
    }
}

Get flattened descendants with cursor pagination.

GET
https://app.orgonaut.co
/api/v1/org-units/{id}/descendants
requires authentication

Headers

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
X-Tenant
Example:
string required The tenant slug or id.
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

id
integer
required

The root id.

Example:
1

Query Parameters

depth
integer

The max depth to traverse from the root. Default: 3.

Example:
2
include
string

Comma-separated includes: actors,members,parent,ancestors,path,metrics.

Example:
parent
filter
object
Example:
[]
filter.type
string

Filter by org unit type.

Example:
team
search
string

Case-insensitive search on label.

Example:
Apollo
per_page
integer

Items per page. Max 200.

Example:
50
cursor
string

Pagination cursor

Example:
ab
filter[type]
string

Filter by org unit type.

Example:
team
Example request:
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"
Example response:
{
    "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
    }
}

Show a single org unit summary.

GET
https://app.orgonaut.co
/api/v1/org-units/{org_unit}
requires authentication

Headers

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
X-Tenant
Example:
string required Tenant slug; required for tenant-scoped endpoints. Example: "demo"
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

org_unit
integer
required

The ID of the org unit.

Example:
202

Query Parameters

as_of
string

date Format YYYY-MM-DD.

Example:
2025-09-01
Example request:
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: \&quot;demo\&quot;" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
Example response:
{
    "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": []
    }
}

List an org unit's immediate children.

GET
https://app.orgonaut.co
/api/v1/org-units/{org_unit}/children
requires authentication

Headers

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
X-Tenant
Example:
string required Tenant slug; required for tenant-scoped endpoints. Example: "demo"
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

org_unit
integer
required

The ID of the org unit.

Example:
202

Query Parameters

as_of
string

date Format YYYY-MM-DD.

Example:
2025-09-01
Example request:
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: \&quot;demo\&quot;" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
Example response:
{
    "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": []
        }
    ]
}

Create a new org unit.

POST
https://app.orgonaut.co
/api/v1/org-units
requires authentication

Headers

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
X-Tenant
Example:
string required Tenant slug; required for tenant-scoped endpoints. Example: "demo"
Content-Type
Example:
application/json
Accept
Example:
application/json

Body Parameters

Response Fields

Example request:
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: \&quot;demo\&quot;" \
    --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\"
}"
Example response:
{
    "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"
    }
}

Update an org unit.

PATCH
https://app.orgonaut.co
/api/v1/org-units/{org_unit}
requires authentication

Headers

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
X-Tenant
Example:
string required Tenant slug; required for tenant-scoped endpoints. Example: "demo"
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

org_unit
integer
required

The ID of the org unit.

Example:
210

Body Parameters

Response Fields

Example request:
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: \&quot;demo\&quot;" \
    --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\"
}"
Example response:
{
    "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"
    }
}

Org Units — Metrics

Show the cached aggregate metrics for a single org unit.

GET
https://app.orgonaut.co
/api/v1/org-units/{org_unit}/metrics
requires authentication

Headers

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
X-Tenant
Example:
string required Tenant slug; required for tenant-scoped endpoints. Example: "demo"
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

org_unit
integer
required

The org unit id.

Example:
202

Query Parameters

as_of
string

date The date to compute metrics as of.

Example:
2025-09-01
Example request:
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: \&quot;demo\&quot;" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
Example response:
{
    "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
        }
    }
}

Org Units — Structure

Move an org unit to a new parent.

POST
https://app.orgonaut.co
/api/v1/org-units/{org_unit_id}/move
requires authentication

Headers

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
X-Tenant
Example:
string required The tenant slug.
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

org_unit_id
integer
required

The ID of the org unit.

Example:
11
org_unit
integer
required

The org unit id being moved.

Example:
202

Body Parameters

Example request:
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\"
}"
Example response:
{
    "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"
    }
}

Merge two org units.

POST
https://app.orgonaut.co
/api/v1/org-units/merge
requires authentication

Headers

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
X-Tenant
Example:
string required The tenant slug.
Content-Type
Example:
application/json
Accept
Example:
application/json

Body Parameters

Example request:
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\"
}"
Example response:
{
    "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"
    }
}

Split an org unit.

POST
https://app.orgonaut.co
/api/v1/org-units/{org_unit_id}/split
requires authentication

Headers

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
X-Tenant
Example:
string required The tenant slug.
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

org_unit_id
integer
required

The ID of the org unit.

Example:
11
org_unit
integer
required

The org unit id being split.

Example:
202

Body Parameters

Example request:
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\"
}"
Example response:
{
    "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"
        }
    }
}

Soft delete an org unit.

DELETE
https://app.orgonaut.co
/api/v1/org-units/{org_unit_id}
requires authentication

Headers

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
X-Tenant
Example:
string required The tenant slug.
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

org_unit_id
integer
required

The ID of the org unit.

Example:
11
org_unit
integer
required

The org unit id being deleted.

Example:
202

Body Parameters

Example request:
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\"
}"
Example response:
[Empty response]

Restore an org unit.

POST
https://app.orgonaut.co
/api/v1/org-units/{org_unit_id}/restore
requires authentication

Headers

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
X-Tenant
Example:
string required The tenant slug.
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

org_unit_id
integer
required

The ID of the org unit.

Example:
11
org_unit
integer
required

The soft-deleted org unit id.

Example:
202
Example request:
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"
Example response:
{
    "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"
    }
}

Org Units — Velocity

Get velocity for an org unit.

GET
https://app.orgonaut.co
/api/v1/org-units/{org_unit}/velocity
requires authentication

Headers

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
X-Tenant
Example:
string required Tenant slug; required for tenant-scoped endpoints. Example: "demo"
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

org_unit
integer
required

The org unit ID.

Example:
202

Query Parameters

sprint_id
integer

The sprint to query.

Example:
11
as_of
string

date Mutually exclusive with sprint_id.

Example:
ab
Example request:
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: \&quot;demo\&quot;" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
Example response:
{
    "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
    }
}

Get velocity series for an org unit.

GET
https://app.orgonaut.co
/api/v1/org-units/{org_unit}/velocity/series
requires authentication

Headers

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
X-Tenant
Example:
string required Tenant slug; required for tenant-scoped endpoints. Example: "demo"
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

org_unit
integer
required

The org unit ID.

Example:
202

Query Parameters

from_sprint_id
integer

Starting sprint ID. The id of an existing record in the sprint_periods table.

Example:
1
to_sprint_id
integer

Ending sprint ID. The id of an existing record in the sprint_periods table.

Example:
10
from
string

Start date (YYYY-MM-DD). Must be a valid date. Must be a valid date in the format Y-m-d.

Example:
2025-01-01
to
string

End date (YYYY-MM-DD). Must be a valid date. Must be a valid date in the format Y-m-d.

Example:
2025-06-01
limit
integer

Maximum number of sprints to return. Must be at least 1. Must not be greater than 50.

Example:
12
order
string

Sort order by sprint start.

Must be one of:
  • asc
  • desc
Example:
asc
Example request:
curl --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: \&quot;demo\&quot;" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
Example response:
{
    "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
        }
    ]
}

Organisation Accounts

API descriptions intentionally use “Organisation Account” wording for user-facing clarity.

List Organisation Accounts available to the authenticated user.

GET
https://app.orgonaut.co
/api/v1/me/organisations
requires authentication

Returns the Organisation Accounts that the authenticated user can access.

Headers

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

Response Fields

Example request:
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"
Example response:
{
    "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"
        }
    ]
}

Get the current Organisation Account details.

GET
https://app.orgonaut.co
/api/v1/organisations/current
requires authentication

Resolution follows the standard precedence (subdomain, last-used Organisation, session fallback).

Headers

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

Response Fields

Example request:
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"
Example response:
{
    "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
        }
    }
}
{
    "code": "tenant.not_resolved",
    "message": "No Organisation Account is currently selected."
}

Update onboarding choice for the current Organisation Account.

POST
https://app.orgonaut.co
/api/v1/organisations/current/onboarding-choice
requires authentication

Persists how this Organisation Account will start onboarding.

Headers

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

Body Parameters

Response Fields

Example request:
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\"
}"
Example response:
{
    "data": {
        "id": 12,
        "name": "Acme Product",
        "slug": "acme-product",
        "onboarding_choice": "import",
        "subscription_status": "trialing"
    }
}
{
    "code": "tenant.not_resolved",
    "message": "No Organisation Account is currently selected."
}

Positions

Manage effective-dated team positions, linking actors, teams, and compensation within each scenario.

List positions with pagination, filters, and search.

GET
https://app.orgonaut.co
/api/v1/positions
requires authentication

Returns baseline data when no scenario filter is supplied; pass filter[scenario]=current to reflect the active scenario.

Headers

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
X-Tenant
Example:
string required Tenant slug; required for tenant-scoped endpoints. Example: "demo"
Content-Type
Example:
application/json
Accept
Example:
application/json

Query Parameters

page
integer

The page number to return.

Example:
1
per_page
integer

Results per page (max 100).

Example:
25
sort
string

Comma-separated columns, prefix with - for DESC. Allowed: id,valid_from,valid_to,fte,created_at.

Example:
-valid_from
filter[org_unit_team_id]
integer

Filter by a budgeted team org unit (planning metadata only).

Example:
4201
filter[target_employment_type]
string

Restrict by budgeted employment type (perm or contractor).

Example:
perm
filter[active_as_of]
string

date Return positions active on this ISO date (YYYY-MM-DD).

Example:
2025-09-20
filter[scenario]
string

Scenario shorthand: baseline, current, or an id.

Example:
current
filter[scenario_id]
integer

Scenario identifier; overrides shorthand when present.

Example:
7
q
string

Free-text search across title, team name, and actor name.

Example:
platform engineer
include
string

Comma-separated relationships. Allowed: team,actor.

Example:
team,actor
fields[positions]
string

Sparse fieldset selection.

Example:
id,title,team

Response Fields

Example request:
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: \&quot;demo\&quot;" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
Example response:
{
    "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
    }
}
{
    "code": "query.invalid_parameter",
    "message": "Unsupported scenario filter value: future",
    "details": {
        "allowed": [
            "baseline",
            "current",
            "{id}"
        ]
    }
}

Create a position within the active scenario.

POST
https://app.orgonaut.co
/api/v1/positions
requires authentication

Applies baseline defaults when the current scenario guard is baseline, otherwise stores the record against the active scenario id.

Headers

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
X-Tenant
Example:
string required Tenant slug; required for tenant-scoped endpoints. Example: "demo"
Content-Type
Example:
application/json
Accept
Example:
application/json

Body Parameters

Response Fields

Example request:
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: \&quot;demo\&quot;" \
    --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
}"
Example response:
{
    "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"
    }
}
{
    "message": "The given data was invalid.",
    "errors": {
        "target_annual_salary_cents": [
            "Budgeted annual salary applies to permanent roles only."
        ]
    }
}

Display a specific position.

GET
https://app.orgonaut.co
/api/v1/positions/{id}
requires authentication

Honors the active scenario guard unless filter[scenario]/filter[scenario_id] were provided on the index request and cached via query options middleware.

Headers

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
X-Tenant
Example:
string required Tenant slug; required for tenant-scoped endpoints. Example: "demo"
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

id
integer
required

The ID of the position.

Example:
11
position
integer
required

The ID of the position.

Example:
24

Query Parameters

include
string

Comma-separated relationships. Allowed: team,actor.

Example:
team
fields[positions]
string

Sparse fieldset.

Example:
id,title,team

Response Fields

Example request:
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: \&quot;demo\&quot;" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
Example response:
{
    "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"
    }
}

Update a position.

PUT
PATCH
https://app.orgonaut.co
/api/v1/positions/{id}
requires authentication

Validation enforces mutual exclusivity between salary and daily rate, mirroring the create endpoint rules.

Headers

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
X-Tenant
Example:
string required Tenant slug; required for tenant-scoped endpoints. Example: "demo"
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

id
integer
required

The ID of the position.

Example:
11

Body Parameters

Response Fields

Example request:
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: \&quot;demo\&quot;" \
    --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
}"
Example response:
{
    "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"
    }
}
{
    "message": "The given data was invalid.",
    "errors": {
        "target_daily_rate_cents": [
            "Budgeted daily rate applies to contractor roles only."
        ]
    }
}

Soft delete a position.

DELETE
https://app.orgonaut.co
/api/v1/positions/{id}
requires authentication

Headers

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
X-Tenant
Example:
string required Tenant slug; required for tenant-scoped endpoints. Example: "demo"
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

id
integer
required

The ID of the position.

Example:
11
Example request:
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: \&quot;demo\&quot;" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
Example response:
[Empty response]

Scenario Tasks

List scenario tasks.

GET
https://app.orgonaut.co
/api/v1/scenarios/tasks
requires authentication

Returns scenario tasks for the authenticated tenant, ordered by latest first. These tasks mirror the progress shown in the Flux UI at /scenarios/tasks.

Headers

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
X-Tenant
Example:
string required Tenant slug; required for tenant-scoped endpoints. Example: "demo"
Content-Type
Example:
application/json
Accept
Example:
application/json

Query Parameters

status
string

Filter by status (pending, running, failed, complete).

Example:
running
type
string

Filter by task type (clone, promotion, snapshot, all). Defaults to clone for compatibility.

Example:
promotion
Example request:
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: \&quot;demo\&quot;" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
Example response:
[
    {
        "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"
    }
]

Scenarios

Display a paginated listing of scenarios.

GET
https://app.orgonaut.co
/api/v1/scenarios
requires authentication

Headers

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
X-Tenant
Example:
string required Tenant slug; required for tenant-scoped endpoints. Example: "demo"
Content-Type
Example:
application/json
Accept
Example:
application/json

Query Parameters

page
integer

The page number.

Example:
1
per_page
integer

Max 100.

Example:
25
sort
string

Comma-separated columns, prefix with - for DESC. Allowed: id,name,created_at.

Example:
-created_at,name
filter[status]
string

Filter by status.

Example:
cloning
filter[kind]
string

Filter by kind (planning, baseline_archive, applied_scenario).

Example:
planning
fields[scenarios]
string

Sparse fields for scenarios.

Example:
id,name,status
include
string

Comma-separated relationships. Allowed: teams,aggregate.

Example:
teams,aggregate
as_of
string

Snapshot date for aggregates. Format: YYYY-MM-DD.

Example:
2025-09-01
Example request:
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: \&quot;demo\&quot;" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
Example response:
{
    "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
    }
}
{
    "code": "query.invalid_parameter",
    "message": "Unsupported sort: salary",
    "details": {
        "allowed": [
            "id",
            "name",
            "created_at"
        ]
    }
}
{
    "message": "The given data was invalid.",
    "errors": {
        "per_page": [
            "The per page must be at least 1."
        ]
    }
}

Create a new scenario.

POST
https://app.orgonaut.co
/api/v1/scenarios
requires authentication

Triggers a background clone pipeline and returns immediately with status=initialising.

Headers

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
X-Tenant
Example:
string required Tenant slug; required for tenant-scoped endpoints. Example: "demo"
Content-Type
Example:
application/json
Accept
Example:
application/json

Body Parameters

Example request:
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: \&quot;demo\&quot;" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"\\\"Q2 Planning\\\"\",
    \"notes\": \"\\\"Budget-cut planning run.\\\"\",
    \"source_scenario_id\": 12
}"
Example response:
{
    "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"
}
{
    "code": "feature.unavailable",
    "message": "Your current subscription plan does not include this feature."
}
{
    "code": "limit.scenarios",
    "message": "Active planning scenario limit reached (1/1). Archive or apply an existing scenario, or upgrade your plan.",
    "limit": 1,
    "current": 1
}

Display the specified scenario.

GET
https://app.orgonaut.co
/api/v1/scenarios/{slug}
requires authentication

Headers

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
X-Tenant
Example:
string required Tenant slug; required for tenant-scoped endpoints. Example: "demo"
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

slug
string
required

The slug of the scenario.

Example:
ab
scenario
integer
required

The ID of the scenario.

Example:
1

Query Parameters

include
string

Comma-separated relationships. Allowed: teams,aggregate.

Example:
aggregate
as_of
string

Snapshot date for aggregates. Format: YYYY-MM-DD.

Example:
2025-09-01

Response Fields

Example request:
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: \&quot;demo\&quot;" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
Example response:
{
    "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": {}
        }
    }
}

Show computed deltas between a scenario and its source baseline.

GET
https://app.orgonaut.co
/api/v1/scenarios/{scenario_slug}/delta
requires authentication

Headers

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
X-Tenant
Example:
string required Tenant slug; required for tenant-scoped endpoints. Example: "demo"
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

scenario_slug
string
required

The slug of the scenario.

Example:
ab
scenario
integer
required

Scenario id.

Example:
7
Example request:
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: \&quot;demo\&quot;" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
Example response:
{
    "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
        }
    ]
}

Promote a planning scenario to the live baseline.

POST
https://app.orgonaut.co
/api/v1/scenarios/{scenario_slug}/promote
requires authentication

Queues the existing promotion pipeline with type scenario_promotion.

Headers

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
X-Tenant
Example:
string required Tenant slug; required for tenant-scoped endpoints. Example: "demo"
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

scenario_slug
string
required

The slug of the scenario.

Example:
ab
scenario
integer
required

The ID of the scenario.

Example:
1

Body Parameters

Example request:
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: \&quot;demo\&quot;" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"confirmed_promotion\": true,
    \"confirmed_archive\": true
}"
Example response:
{
    "message": "Scenario promotion started. Promotion in progress.",
    "status": "queued",
    "scenario_id": 1,
    "tasks_url": "https://app.orgonaut.test/api/v1/scenarios/tasks"
}

Submit the scenario for review.

POST
https://app.orgonaut.co
/api/v1/scenarios/{scenario_slug}/submit
requires authentication

Headers

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
X-Tenant
Example:
string required Tenant slug; required for tenant-scoped endpoints. Example: "demo"
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

scenario_slug
string
required

The slug of the scenario.

Example:
ab
scenario
integer
required

The ID of the scenario.

Example:
1
Example request:
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: \&quot;demo\&quot;" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
Example response:
{
    "data": {
        "id": 1,
        "name": "FY26 Cost Optimisation",
        "status": "under_review"
    }
}

Approve the scenario.

POST
https://app.orgonaut.co
/api/v1/scenarios/{scenario_slug}/approve
requires authentication

Headers

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
X-Tenant
Example:
string required Tenant slug; required for tenant-scoped endpoints. Example: "demo"
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

scenario_slug
string
required

The slug of the scenario.

Example:
ab
scenario
integer
required

The ID of the scenario.

Example:
1
Example request:
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: \&quot;demo\&quot;" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
Example response:
{
    "data": {
        "id": 1,
        "name": "FY26 Cost Optimisation",
        "status": "approved"
    }
}

Snapshots

List baseline snapshots.

GET
https://app.orgonaut.co
/api/v1/snapshots
requires authentication

Headers

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
X-Tenant
Example:
string required Tenant slug; required for tenant-scoped endpoints. Example: "demo"
Content-Type
Example:
application/json
Accept
Example:
application/json

Query Parameters

page
integer

The page number.

Example:
1
per_page
integer

Max 100.

Example:
25
sort
string

Comma-separated columns, prefix with - for DESC. Allowed: id,name,created_at.

Example:
-created_at,name
filter[status]
string

Filter by status.

Example:
archived
fields[scenarios]
string

Sparse fields for scenarios.

Example:
id,name,kind
include
string

Comma-separated relationships. Allowed: teams,aggregate.

Example:
aggregate
as_of
string

Snapshot date for aggregates. Format: YYYY-MM-DD.

Example:
2025-09-01
Example request:
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: \&quot;demo\&quot;" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
Example response:
{
    "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
    }
}

Display a baseline snapshot.

GET
https://app.orgonaut.co
/api/v1/snapshots/{scenario_slug}
requires authentication

Headers

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
X-Tenant
Example:
string required Tenant slug; required for tenant-scoped endpoints. Example: "demo"
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

scenario_slug
string
required

The slug of the scenario.

Example:
ab
scenario
integer
required

Snapshot id.

Example:
12

Query Parameters

include
string

Comma-separated relationships. Allowed: teams,aggregate.

Example:
aggregate
as_of
string

Snapshot date for aggregates. Format: YYYY-MM-DD.

Example:
2025-09-01
Example request:
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: \&quot;demo\&quot;" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
Example response:
{
    "data": {
        "id": 12,
        "name": "Baseline Snapshot 2025-11-01",
        "kind": "baseline_archive",
        "status": "archived"
    }
}

Restore a baseline snapshot to become the live baseline.

POST
https://app.orgonaut.co
/api/v1/snapshots/{scenario_slug}/restore
requires authentication

Queues the existing promotion pipeline with type snapshot_restore.

Headers

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
X-Tenant
Example:
string required Tenant slug; required for tenant-scoped endpoints. Example: "demo"
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

scenario_slug
string
required

The slug of the scenario.

Example:
ab
scenario
integer
required

Snapshot id.

Example:
12

Body Parameters

Example request:
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: \&quot;demo\&quot;" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"confirmed_promotion\": true,
    \"confirmed_archive\": true
}"
Example response:
{
    "message": "Snapshot restore started. Promotion in progress.",
    "status": "queued",
    "snapshot_id": 12,
    "tasks_url": "https://app.orgonaut.test/api/v1/scenarios/tasks"
}

Teams

Display a paginated listing of teams.

GET
https://app.orgonaut.co
/api/v1/teams
requires authentication

Requires teams.read ability.

Headers

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
X-Tenant
Example:
string required Tenant slug; required for tenant-scoped endpoints. Example: "demo"
Content-Type
Example:
application/json
Accept
Example:
application/json

Query Parameters

page
integer

The page number.

Example:
1
per_page
integer

Max 100.

Example:
25
sort
string

Comma-separated columns, prefix with - for DESC. Allowed: id,name,created_at.

Example:
-created_at,name
filter[department_id]
integer

Filter by department id.

Example:
5
filter[org_unit_id]
integer

Filter by org unit id (department subtree).

Example:
10
fields[teams]
string

Sparse fields for teams.

Example:
id,name
include
string

Comma-separated relationships. Allowed: aggregate.

Example:
aggregate
Example request:
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: \&quot;demo\&quot;" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
Example response:
{
    "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
    }
}
{
    "code": "query.invalid_parameter",
    "message": "Unsupported sort: salary",
    "details": {
        "allowed": [
            "id",
            "name",
            "created_at"
        ]
    }
}
{
    "message": "The given data was invalid.",
    "errors": {
        "per_page": [
            "The per page must be at least 1."
        ]
    }
}

Store a newly created team.

POST
https://app.orgonaut.co
/api/v1/teams
requires authentication

Requires teams.create ability.

Headers

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
X-Tenant
Example:
string required Tenant slug; required for tenant-scoped endpoints. Example: "demo"
Content-Type
Example:
application/json
Accept
Example:
application/json

Body Parameters

Response Fields

Example request:
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: \&quot;demo\&quot;" \
    --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
}"
Example response:
{
    "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
    }
}

Display a specific team.

GET
https://app.orgonaut.co
/api/v1/teams/{id}
requires authentication

Requires teams.read ability.

Headers

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
X-Tenant
Example:
string required Tenant slug; required for tenant-scoped endpoints. Example: "demo"
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

id
integer
required

The ID of the team.

Example:
11
Example request:
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: \&quot;demo\&quot;" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
Example response:
{
    "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"
    }
}

Update a team.

PUT
PATCH
https://app.orgonaut.co
/api/v1/teams/{id}
requires authentication

Requires teams.update ability.

Headers

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
X-Tenant
Example:
string required Tenant slug; required for tenant-scoped endpoints. Example: "demo"
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

id
integer
required

The ID of the team.

Example:
11

Body Parameters

Response Fields

Example request:
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: \&quot;demo\&quot;" \
    --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
}"
Example response:
{
    "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
    }
}

Delete a team.

DELETE
https://app.orgonaut.co
/api/v1/teams/{id}
requires authentication

Requires teams.delete ability.

Headers

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
X-Tenant
Example:
string required Tenant slug; required for tenant-scoped endpoints. Example: "demo"
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

id
integer
required

The ID of the team.

Example:
11
Example request:
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: \&quot;demo\&quot;" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
Example response:
[Empty response]

Teams — Velocity

Get velocity stats for a team in a sprint.

GET
https://app.orgonaut.co
/api/v1/teams/{team_id}/velocity
requires authentication

Headers

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
X-Tenant
Example:
string required Tenant slug; required for tenant-scoped endpoints. Example: "demo"
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

team_id
integer
required

The ID of the team.

Example:
11
team
integer
required

The team ID.

Example:
12

Query Parameters

sprint_id
integer

The sprint to query.

Example:
11
as_of
string

date Mutually exclusive with sprint_id.

Example:
ab
Example request:
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: \&quot;demo\&quot;" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
Example response:
{
    "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"
    }
}

Get a velocity series for a team.

GET
https://app.orgonaut.co
/api/v1/teams/{team_id}/velocity/series
requires authentication

Headers

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
X-Tenant
Example:
string required Tenant slug; required for tenant-scoped endpoints. Example: "demo"
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

team_id
integer
required

The ID of the team.

Example:
11
team
integer
required

The team ID.

Example:
12

Query Parameters

from_sprint_id
integer

Starting sprint ID.

Example:
11
to_sprint_id
integer

Ending sprint ID.

Example:
11
from
string

date Start date.

Example:
ab
to
string

date End date.

Example:
ab
limit
integer

Maximum results. Defaults to 12.

Example:
11
order
string

asc or desc. Defaults to asc.

Example:
ab
Example request:
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: \&quot;demo\&quot;" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
Example response:
{
    "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"
        }
    ]
}

Tenant Invitations

List invitations for the current tenant.

GET
https://app.orgonaut.co
/api/v1/tenant-invitations
requires authentication

Headers

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
X-Tenant
Example:
string required Tenant slug; required for tenant-scoped endpoints. Example: "acme"
Content-Type
Example:
application/json
Accept
Example:
application/json
Example request:
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: \&quot;acme\&quot;" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
Example response:
{
    "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"
        }
    ]
}

Create a new tenant invitation.

POST
https://app.orgonaut.co
/api/v1/tenant-invitations
requires authentication

Headers

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
X-Tenant
Example:
string required Tenant slug; required for tenant-scoped endpoints. Example: "acme"
Content-Type
Example:
application/json
Accept
Example:
application/json

Body Parameters

Example request:
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: \&quot;acme\&quot;" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"email\": \"\\\"new.user@example.com\\\"\",
    \"role\": \"\\\"manager\\\"\"
}"
Example response:
{
    "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"
    }
}

Resend a pending invitation and revoke the existing pending token.

POST
https://app.orgonaut.co
/api/v1/tenant-invitations/{invite}/resend
requires authentication

Headers

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
X-Tenant
Example:
string required Tenant slug; required for tenant-scoped endpoints. Example: "acme"
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

invite
integer
required

Invitation id.

Example:
17
Example request:
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: \&quot;acme\&quot;" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
Example response:
{
    "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"
    }
}

Revoke a pending invitation.

POST
https://app.orgonaut.co
/api/v1/tenant-invitations/{invite}/revoke
requires authentication

Headers

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
X-Tenant
Example:
string required Tenant slug; required for tenant-scoped endpoints. Example: "acme"
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

invite
integer
required

Invitation id.

Example:
17
Example request:
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: \&quot;acme\&quot;" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
Example response:
{
    "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"
    }
}

Tenant Members

List active and archived tenant memberships.

GET
https://app.orgonaut.co
/api/v1/tenant-members
requires authentication

Headers

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
X-Tenant
Example:
string required Tenant slug; required for tenant-scoped endpoints. Example: "acme"
Content-Type
Example:
application/json
Accept
Example:
application/json

Response Fields

Example request:
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: \&quot;acme\&quot;" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
Example response:
{
    "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
            }
        ]
    }
}

Archive a non-owner tenant membership.

PATCH
https://app.orgonaut.co
/api/v1/tenant-members/{user}/archive
requires authentication

Headers

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
X-Tenant
Example:
string required Tenant slug; required for tenant-scoped endpoints. Example: "acme"
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

user
integer
required

Tenant user id.

Example:
42

Response Fields

Example request:
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: \&quot;acme\&quot;" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
Example response:
{
    "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
    }
}

Reactivate an archived tenant membership.

PATCH
https://app.orgonaut.co
/api/v1/tenant-members/{user}/reactivate
requires authentication

Headers

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
X-Tenant
Example:
string required Tenant slug; required for tenant-scoped endpoints. Example: "acme"
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

user
integer
required

Tenant user id.

Example:
42

Response Fields

Example request:
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: \&quot;acme\&quot;" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
Example response:
{
    "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
    }
}

Update a tenant member role without using ownership transfer.

PATCH
https://app.orgonaut.co
/api/v1/tenant-members/{user}/role
requires authentication

Headers

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
X-Tenant
Example:
string required Tenant slug; required for tenant-scoped endpoints. Example: "acme"
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

user
integer
required

Tenant user id.

Example:
42

Body Parameters

Response Fields

Example request:
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: \&quot;acme\&quot;" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"role\": \"\\\"viewer\\\"\"
}"
Example response:
{
    "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
    }
}
{
    "message": "Archived memberships must be reactivated before changing the user type.",
    "code": "tenancy.invalid_state"
}

Transfer tenant ownership to an existing active admin.

POST
https://app.orgonaut.co
/api/v1/tenant-members/transfer-ownership
requires authentication

Headers

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
X-Tenant
Example:
string required Tenant slug; required for tenant-scoped endpoints. Example: "acme"
Content-Type
Example:
application/json
Accept
Example:
application/json

Body Parameters

Example request:
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: \&quot;acme\&quot;" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"target_user_id\": 42
}"
Example response:
{
    "data": {
        "status": "ok"
    }
}