Organization API: Org Staff Insight
Every Organization API operation tagged Org Staff Insight.
Base URL: https://api.coritan.com/api/v1. Paths below are complete.
To try these requests in the browser, open the interactive Organization API reference.
Operations
Section titled Operations| Method | Path | Summary |
|---|---|---|
| GET | /api/v1/orgs/{org_slug}/staff/activity |
The org's audit log, newest first |
| GET | /api/v1/orgs/{org_slug}/staff/activity/actions |
Staff activity actions |
| GET | /api/v1/orgs/{org_slug}/staff/activity/export.csv |
The filtered audit log as a CSV, newest first |
| GET | /api/v1/orgs/{org_slug}/staff/activity/facets |
Counts of the log's entries by area, for the chips above the list |
| GET | /api/v1/orgs/{org_slug}/staff/insights |
Money, orders, customers and support over a period, by day, and set against another period |
| GET | /api/v1/orgs/{org_slug}/staff/insights/acquisition |
Acquisition report |
| GET | /api/v1/orgs/{org_slug}/staff/insights/export.csv |
Staff insights export |
| GET | /api/v1/orgs/{org_slug}/staff/insights/report |
One figure split by one dimension over a period, against another period |
| GET | /api/v1/orgs/{org_slug}/staff/insights/report/registry |
What the report builder can count and split by |
The org's audit log, newest first
Section titled The org's audit log, newest firstGET /api/v1/orgs/{org_slug}/staff/activity
The org's audit log, newest first. Admins read all of it. Tier 3 and billing must name the customer, order or server they are looking at, or ask for their own actions, which is all Tiers 1 and 2 may see.
Parameters
Section titled Parameters| Name | In | Type | Required | Description |
|---|---|---|---|---|
org_slug |
path | string | yes | |
customer_id |
query | integer or null | no | Only entries about this customer and their orders. |
service_id |
query | integer or null | no | Only entries about this order. |
server_uuid |
query | string or null | no | Only entries about this server. |
actor_id |
query | integer or null | no | Only actions by this person. Tiers 1 and 2 may only ask for their own. |
action |
query | string or null | no | Actions that start with these words, such as invoice or customer.suspended. |
resource_type |
query | string or null | no | Only entries about this kind of record, such as customer, org_service or invoice. |
since |
query | string (date) or null | no | First day to include, YYYY-MM-DD (UTC). |
until |
query | string (date) or null | no | Last day to include, YYYY-MM-DD (UTC). |
q |
query | string or null | no | Part of an action name, or a record number. |
limit |
query | integer | no | Default: 50. |
offset |
query | integer | no | Default: 0. |
Responses
Section titled Responses| Status | Meaning |
|---|---|
200 |
Success. |
422 |
The request is not valid. detail lists each problem. |
Staff activity actions
Section titled Staff activity actionsGET /api/v1/orgs/{org_slug}/staff/activity/actions
The action names that have occurred, for the filter, with how many times each occurred, most often first and by name when two are equal. At most 100 names are listed. Below Tier 3 the list holds only the actions the caller took, and it is current. Tier 3 and above read the whole brand's list, which is normally under a minute old and can be a few minutes old on the first request after a quiet spell.
Parameters
Section titled Parameters| Name | In | Type | Required |
|---|---|---|---|
org_slug |
path | string | yes |
Responses
Section titled Responses| Status | Meaning |
|---|---|
200 |
Success. |
422 |
The request is not valid. detail lists each problem. |
The filtered audit log as a CSV, newest first
Section titled The filtered audit log as a CSV, newest firstGET /api/v1/orgs/{org_slug}/staff/activity/export.csv
The filtered audit log as a CSV, newest first. For org admins only.
Takes the filters of GET /staff/activity. Carries at most 50,000
entries, with times in UTC as ISO 8601 (2026-09-28T12:00:00Z). The
columns are time, action, actor_type, actor_id,
actor_name, resource_type, resource_id, details (JSON) and
ip_address. A text that would open as a formula in a spreadsheet
starts with an apostrophe.
Parameters
Section titled Parameters| Name | In | Type | Required | Description |
|---|---|---|---|---|
org_slug |
path | string | yes | |
customer_id |
query | integer or null | no | Only entries about this customer and their orders. |
service_id |
query | integer or null | no | Only entries about this order. |
server_uuid |
query | string or null | no | Only entries about this server. |
actor_id |
query | integer or null | no | Only actions by this person. Tiers 1 and 2 may only ask for their own. |
action |
query | string or null | no | Actions that start with these words, such as invoice or customer.suspended. |
resource_type |
query | string or null | no | Only entries about this kind of record, such as customer, org_service or invoice. |
since |
query | string (date) or null | no | First day to include, YYYY-MM-DD (UTC). |
until |
query | string (date) or null | no | Last day to include, YYYY-MM-DD (UTC). |
q |
query | string or null | no | Part of an action name, or a record number. |
Responses
Section titled Responses| Status | Meaning |
|---|---|
200 |
Success. |
422 |
The request is not valid. detail lists each problem. |
Counts of the log's entries by area, for the chips above the list
Section titled Counts of the log's entries by area, for the chips above the listGET /api/v1/orgs/{org_slug}/staff/activity/facets
Counts of the log's entries by area, for the chips above the list.
Takes the filters of GET /staff/activity and the same role rules: Tiers
1 and 2 count only their own actions, Tier 3 and billing must name a
customer, order or server, and admins count the whole log. An area is the
text of an action before its first dot (customer for
customer.suspended), worded as the console words actions. Each area's
prefix is the action filter that narrows the list to it (customer.).
total is the number of entries
the filters match, so it equals the sum of the area counts. With a filter
the counts are current. With no filter they cover the whole log, are
normally under a minute old, and can be a few minutes old on the first
request after a quiet spell.
Parameters
Section titled Parameters| Name | In | Type | Required | Description |
|---|---|---|---|---|
org_slug |
path | string | yes | |
customer_id |
query | integer or null | no | Only entries about this customer and their orders. |
service_id |
query | integer or null | no | Only entries about this order. |
server_uuid |
query | string or null | no | Only entries about this server. |
actor_id |
query | integer or null | no | Only actions by this person. Tiers 1 and 2 may only ask for their own. |
action |
query | string or null | no | Actions that start with these words, such as invoice or customer.suspended. |
resource_type |
query | string or null | no | Only entries about this kind of record, such as customer, org_service or invoice. |
since |
query | string (date) or null | no | First day to include, YYYY-MM-DD (UTC). |
until |
query | string (date) or null | no | Last day to include, YYYY-MM-DD (UTC). |
q |
query | string or null | no | Part of an action name, or a record number. |
Responses
Section titled Responses| Status | Meaning |
|---|---|
200 |
Success. |
422 |
The request is not valid. detail lists each problem. |
Money, orders, customers and support over a period, by day, and set against another period
Section titled Money, orders, customers and support over a period, by day, and set against another periodGET /api/v1/orgs/{org_slug}/staff/insights
Money, orders, customers and support over a period, by day, and set against another period.
Needs billing or admin. The period is the last days days (30 by
default), or the days from from to to in the brand's own time zone,
at most 366. compare sets it against previous (the same number of
days just before it; a calendar month compares to the prior month),
week, month or year (the same days earlier), custom (the
days from compare_from to compare_to) or none. A bad word, a
period over 366 days or a custom comparison without both days answers 422.
The answer keeps its daily series (revenue, orders, customers
and support) and adds period (from, to, days and the
bucket a chart groups by), compare (the other period's days, or
null), totals and previous_totals. Money is never added across
currencies: totals.currency is the one with the most payments, the
money figures are in it, and totals.by_currency lists every currency.
mrr is what is recurring now, so it is null for a period that ended
before today and for previous_totals. New customers are accounts:
placeholders for moved forum authors are left out.
Parameters
Section titled Parameters| Name | In | Type | Required | Description |
|---|---|---|---|---|
org_slug |
path | string | yes | |
days |
query | integer | no | The last this many days, ending today. Ignored when from or to is given. Default: 30. |
from |
query | string (date) or null | no | First day of the period, YYYY-MM-DD, in the brand's time zone. A period is at most 366 days. |
to |
query | string (date) or null | no | Last day of the period, YYYY-MM-DD, in the brand's time zone. Left out, today. |
compare |
query | string or null | no | What to set the period against: previous (the same number of days just before it; a calendar month compares to the prior month), week, month or year (the same days one week, month or year earlier), custom (the days between compare_from and compare_to) or none. Left out, none. |
compare_from |
query | string (date) or null | no | First day of the comparison period for compare=custom, YYYY-MM-DD. |
compare_to |
query | string (date) or null | no | Last day of the comparison period for compare=custom, YYYY-MM-DD. |
Responses
Section titled Responses| Status | Meaning |
|---|---|
200 |
Success. |
422 |
The request is not valid. detail lists each problem. |
Acquisition report
Section titled Acquisition reportGET /api/v1/orgs/{org_slug}/staff/insights/acquisition
Where the organization's visits, sign-ups, orders and revenue came from, over a period and against the one before it. Needs billing or admin.
The period is from to to in the brand's time zone, the last 30 days when left out, and at most 366 days. Every list holds at most limit rows, ranked by orders, then revenue, then visits. The totals always cover every row.
An order is a paid storefront order that is not free, counted in currency. Orders and revenue never mix currencies: currencies names every currency with an order in the period, and currency picks the one the answer is in. Revenue is the invoice total without tax, in that currency's minor units. A sign-up is a customer made through the storefront, so a customer the staff create is not one. A visit is a stored session with bots left out. Sessions are kept for 180 days, so visits_complete is false when the period starts earlier and the visit figures are partial.
The answer holds:
totals:visits,signups,orders,new_customers(orders from a customer's first paid order),revenue_minorandconversion_rate_bp(orders over visits).previousholds the same figures for the earlier period, or null whencompareisnone. Every figure ending in_bpis basis points, so 123 is 1.23 percent.channels: each channel of the last touch with itsvisits,signups,orders,new_customers,revenue_minorandshare_bp(its share of the orders).first_touchranks the channels of the first touch, andmatrixcounts orders by first channel and last channel.sources,campaigns,landing_pagesanddevices: the same figures by the last touch's source and medium, its campaign, the page it landed on (the path, with no query and no language prefix) and the device.click_ids: how many orders carry an ad click ID, and for which ad network.heard_about: the answers to "How did you first hear about us?" with their share of the answered orders.return: the ad spend return report for the period incurrency(rows,totals,truncated), or null when the organization has no ad spend in the period.truncatedis true when the return report read only its first 50,000 orders.
A from after to, a period over 366 days, a compare other than previous or none, a currency that is not three letters and a limit outside 1 to 50 answer 422.
Parameters
Section titled Parameters| Name | In | Type | Required | Description |
|---|---|---|---|---|
org_slug |
path | string | yes | |
from |
query | string (date) or null | no | First day of the period, YYYY-MM-DD, in the brand's time zone. Left out, 29 days before the last day, so the period is the last 30 days. A period is at most 366 days. |
to |
query | string (date) or null | no | Last day of the period, YYYY-MM-DD, in the brand's time zone. Left out, today. |
compare |
query | string or null | no | previous (the default) sets every total against the same number of days just before the period, and a calendar month against the month before it. none leaves the comparison out. Default: previous. |
currency |
query | string or null | no | A three letter currency code. Orders and revenue are counted in this one currency and never added across currencies. Left out, the currency with the most revenue in the period, else the brand's own. |
limit |
query | integer | no | Rows in each ranked list, 1 to 50. Totals always cover every row. Left out, 10. Default: 10. |
Responses
Section titled Responses| Status | Meaning |
|---|---|
200 |
Success. |
422 |
The request is not valid. detail lists each problem. |
Staff insights export
Section titled Staff insights exportGET /api/v1/orgs/{org_slug}/staff/insights/export.csv
The daily series as one CSV: a column per measure, a row per day, for the same period as GET /staff/insights. Needs billing or admin.
Parameters
Section titled Parameters| Name | In | Type | Required | Description |
|---|---|---|---|---|
org_slug |
path | string | yes | |
days |
query | integer | no | The last this many days, ending today. Ignored when from or to is given. Default: 30. |
from |
query | string (date) or null | no | First day of the period, YYYY-MM-DD, in the brand's time zone. A period is at most 366 days. |
to |
query | string (date) or null | no | Last day of the period, YYYY-MM-DD, in the brand's time zone. Left out, today. |
Responses
Section titled Responses| Status | Meaning |
|---|---|
200 |
Success. |
422 |
The request is not valid. detail lists each problem. |
One figure split by one dimension over a period, against another period
Section titled One figure split by one dimension over a period, against another periodGET /api/v1/orgs/{org_slug}/staff/insights/report
One figure split by one dimension over a period, against another period. Needs billing or admin.
The answer is { metric, dimension, period, compare, rows, total, previous_total, series }. A row is { key, label, value, previous, filter }: filter is the list behind the row, { path, query } for
the console (/staff/orders with plan=Paper), so a row or a chart
point opens what it counts. series is the figure over the period by its
bucket (hours up to 2 days, days up to 92, weeks up to 220, then months),
each point { key, x, label, value, previous, filter } (x repeats
key, the bucket's start) with previous from the comparison period at
the same place. dimension.bucket is the grain of a time split and null
for a category split, whose series follows period.bucket. period, compare and the period words are those of
GET /staff/insights; the period is the last 30 days when left out.
Money is per currency and never added across them: currency is the one
with the most money, every money figure is in it, and currencies and a
row's by_currency carry the rest. active_services is what is active
now, so it has no previous and no series. A metric the dimension
does not suit answers 422 naming the dimensions it takes. truncated is
true when a median read only the newest 20,000 tickets.
The attribution dimensions (channel, first_channel, source,
medium, campaign, landing, device, heard_about and
coupon_campaign) split revenue, orders and new customers by where the
buyer came from: channel, source, medium, campaign and
landing read the last touch. A payment, order or account with no
attribution record is the group unknown. visits and
conversion_rate (paid orders over visits, in basis points, null when
there were no visits) take time and the visit words. A row whose list has
no page to open, such as every visit row or a landing row, has a
filter with a null path.
Parameters
Section titled Parameters| Name | In | Type | Required | Description |
|---|---|---|---|---|
org_slug |
path | string | yes | |
metric |
query | string | yes | The figure to count: net_revenue, payments, refunds, new_customers, orders_placed, orders_failed, active_services, tickets_opened, median_first_reply, visits, conversion_rate. |
dimension |
query | string | no | What to split it by: day, week, month, product, plan, location, gateway, coupon, department, customer_type, channel, first_channel, source, medium, campaign, landing, device, heard_about, coupon_campaign. Not every metric takes every one; see report/registry. Default: day. |
from |
query | string (date) or null | no | First day of the period, YYYY-MM-DD, in the brand's time zone. A period is at most 366 days. |
to |
query | string (date) or null | no | Last day of the period, YYYY-MM-DD, in the brand's time zone. Left out, today. |
compare |
query | string or null | no | What to set the period against: previous (the same number of days just before it; a calendar month compares to the prior month), week, month or year (the same days one week, month or year earlier), custom (the days between compare_from and compare_to) or none. Left out, none. |
compare_from |
query | string (date) or null | no | First day of the comparison period for compare=custom, YYYY-MM-DD. |
compare_to |
query | string (date) or null | no | Last day of the comparison period for compare=custom, YYYY-MM-DD. |
limit |
query | integer | no | Rows to answer for a category split, biggest first. A time split answers every bucket. Default: 10. |
Responses
Section titled Responses| Status | Meaning |
|---|---|
200 |
Success. |
422 |
The request is not valid. detail lists each problem. |
What the report builder can count and split by
Section titled What the report builder can count and split byGET /api/v1/orgs/{org_slug}/staff/insights/report/registry
What the report builder can count and split by.
metrics lists each figure with its format (money, count,
duration in seconds or percent in basis points) and the
dimensions it may be split by, so a
page offers only pairs GET /staff/insights/report accepts.
dimensions lists the splits: a time one gives a row per day, week or
month, a category one gives the biggest groups. Needs billing or admin.
Parameters
Section titled Parameters| Name | In | Type | Required |
|---|---|---|---|
org_slug |
path | string | yes |
Responses
Section titled Responses| Status | Meaning |
|---|---|
200 |
Success. |
422 |
The request is not valid. detail lists each problem. |