Skip to content

What my account and my companies have used

GET
/v1/usage
curl --request GET \
--url https://beta-api.plune.ai/v1/usage \
--cookie plune_session=<plune_session>

Usage accounting (#1050): for the signed-in person, their account (the projects they made outside a company) and each company they own or administer — the tier it is on, and per project and in total the members, cases, runs, results, files and their bytes, and the Plune AI drafts of this month; in total only, the results of this month (usage.resultsThisMonth, #1441). It is accounting, not enforcement: the tier’s limits stand beside the figures, and nearLimit names those the scope has used 80% or more of; nothing is refused because of it. Rows are counted, not measured; only the files kept in the database are in bytes. The session only, as GET /v1/me. Nothing in the request names an account, so there is no other account’s figure to ask for. A scope in grace or disabled also carries onFree, what Free’s cleanup would delete of it on the day its 14 days end, counted as of that day over the runs there are now (#1054); every other scope carries null.

The account and its companies

Media type application/json
object
enforcement
required

Whether the new tier limits refuse (enforce) or are only counted and logged (report, the default).

string
Allowed values: report enforce
account
required

The caller’s account: the projects they made outside a company.

object
subject
required
object
kind
required
string
Allowed values: user company
id
required
string
label
required

The address of an account, the name of a company.

string
tier
required

What it is on now, as GET /v1/me shows it.

object
tier
required

Free and Personal are an account’s, Team and Enterprise a company’s; Free may also be a company’s, as the row that cancels its Team.

string
Allowed values: free personal team enterprise
tierState
required

Worked out from the grants at the database’s clock, never stored. active: a paid grant covers now. grace: it ended or was cancelled less than 14 days ago, and the limits are still the tier’s. expired: the 14 days are over — Free. disabled: the operator switched it off — Free at once, and nothing is deleted for 14 days. No grant ever is plain Free, active.

string
Allowed values: active grace expired disabled
options
required

What a grant carries besides its tier. A free grant carries none.

object
saml
boolean
extra_storage_packs
integer
<= 1000
extra_full_months
integer
<= 120
tierValidUntil
required
string format: date-time
nullable
tierGraceEndsAt
required
string format: date-time
nullable
limits
required

What the tier allows, beside usage (TIER_LIMITS, #1048). null is no limit. Whether a limit refuses yet is enforcement.

object
projects
required

Projects an account may own outside a company.

integer
nullable
writeSeats
required

People with write access. Refuses (429, quota.kind: "writeSeats") only in enforce mode; usage.writeSeats is the count.

integer
nullable
readerSeats
required

People who only read: Free 1, Personal 3, Team 5, Enterprise none. A person who writes anywhere in the scope is a writer, once. Refuses (429, quota.kind: "readerSeats") only in enforce mode; usage.readerSeats is the count.

integer
nullable
fileBytes
required

Bytes of files, over fileBytesPer.

integer
fileBytesPer
required
string
Allowed values: account project
results
required

Results, over resultsPer; null is by contract.

integer
nullable
resultsPer
required
string
Allowed values: account project month month-per-paid-user contract
historyDays
required

Days of history kept on Free; null is no day limit.

integer
nullable
resultsThisMonth
required

The results limit of this calendar month (#1441), beside usage.resultsThisMonth: Personal 5 000 000, Team 5 000 000 for each writer (usage.writeSeats). null on Free, whose results is over the account, and on Enterprise, by contract. Never refuses: ingest is not stopped by it in either enforcement.

integer
nullable
usage
required
object
members
required

People in it. On an account or a company, the distinct people across its projects (and a company’s own members), not a sum.

integer
cases
required

Cases not in the Bin.

integer
runs
required

Runs not in the Bin.

integer
results
required

Results stored, of every run (also of a run in the Bin).

integer
files
required

Files kept in Plune’s database: the ones that count against the files budget.

integer
fileBytes
required

The size of those files in bytes.

integer
bucketFiles
required

Files in the customer’s own bucket (ready). Counted, not measured: they cost the database nothing.

integer
aiDraftsThisMonth
required

Plune AI draft requests since the start of the calendar month (UTC).

integer
projects
required

Projects not in the Bin.

integer
writeSeats
required

People with write access (owner, manager, member) in the scope, each once — read it beside limits.writeSeats. Open invitations are not counted.

integer
readerSeats
required

People who only read in the scope, each once — read it beside limits.readerSeats.

integer
resultsThisMonth
required

Result rows of the finished runs started this calendar month (UTC), read beside limits.resultsThisMonth (#1441). A run is counted once, as it finishes (a run that crosses midnight at the end of a month counts in the month it started), with every row it holds — those a retest replaced too, as results counts rows; a result an approved Cairn proposal adds to its finished run counts as it is added. A run that is open or was terminated is not counted until it finishes; a counted run stays counted after it goes to the Bin. null only on Free, whose results limit is over the account; Enterprise has the figure and a null limit.

integer
nullable
nearLimit
required

The limits the scope has used 80% or more of (the threshold of the AI budget); empty when none. A mark to read, not a refusal. projects, writeSeats and readerSeats compare usage.<key> with limits.<key>; projects only for an account, since a company’s projects are not limited. fileBytes and results compare the scope’s usage.fileBytes / usage.results when the limit is over the account, and each project’s figure when it is over a project — near when any one project is. writeSeats is named only when the scope has more than one writer: the owner alone always holds a seat, so one writer is never a mark, not even of the one write seat of Free and Personal, where a second writer is already over the limit (#2020). results over a month or a month-per-paid-user compares usage.resultsThisMonth with limits.resultsThisMonth (#1441); over a contract it is never named. A null limit is never named; a limit of 0 is named once anything is used, except writeSeats, named only from the second writer. One mark says less than it seems: usage.results counts the results of runs in the Bin too, which the Free results limit (#1049) does not, so results can be named before that limit is reached, until the Bin is emptied.

Array<string>
Allowed values: projects writeSeats readerSeats fileBytes results
onFree
required

Only in grace and disabled (tier.tierGraceEndsAt set, and at is it): what the cleanup would delete on that day, counted as of it over the runs there are now. null on an active tier (with an end or without) and on Free. The admin list does not carry it.

object
at
required

When the cleanup first reaches the owner: the end of its 14 days in grace or disabled (tierGraceEndsAt); for an active paid tier, 14 days from now (the day it would start, were the tier switched off now); for Free, now (the next nightly pass).

string format: date-time
runs
required
integer
results
required

The results of those runs.

integer
fileBytes
required

The files of those results, in the database and in the customer’s bucket alike.

integer
deleting
required

True when the cleanup deletes (TIER_RETENTION_ENFORCE); false while it only reports.

boolean
projects
required

One row per project, oldest first.

Array
object
members
required

People in it. On an account or a company, the distinct people across its projects (and a company’s own members), not a sum.

integer
cases
required

Cases not in the Bin.

integer
runs
required

Runs not in the Bin.

integer
results
required

Results stored, of every run (also of a run in the Bin).

integer
files
required

Files kept in Plune’s database: the ones that count against the files budget.

integer
fileBytes
required

The size of those files in bytes.

integer
bucketFiles
required

Files in the customer’s own bucket (ready). Counted, not measured: they cost the database nothing.

integer
aiDraftsThisMonth
required

Plune AI draft requests since the start of the calendar month (UTC).

integer
projectId
required
string
name
required
string
companies
required

Each company they own or administer (not in the Bin), by name.

Array
object
subject
required
object
kind
required
string
Allowed values: user company
id
required
string
label
required

The address of an account, the name of a company.

string
tier
required

What it is on now, as GET /v1/me shows it.

object
tier
required

Free and Personal are an account’s, Team and Enterprise a company’s; Free may also be a company’s, as the row that cancels its Team.

string
Allowed values: free personal team enterprise
tierState
required

Worked out from the grants at the database’s clock, never stored. active: a paid grant covers now. grace: it ended or was cancelled less than 14 days ago, and the limits are still the tier’s. expired: the 14 days are over — Free. disabled: the operator switched it off — Free at once, and nothing is deleted for 14 days. No grant ever is plain Free, active.

string
Allowed values: active grace expired disabled
options
required

What a grant carries besides its tier. A free grant carries none.

object
saml
boolean
extra_storage_packs
integer
<= 1000
extra_full_months
integer
<= 120
tierValidUntil
required
string format: date-time
nullable
tierGraceEndsAt
required
string format: date-time
nullable
limits
required

What the tier allows, beside usage (TIER_LIMITS, #1048). null is no limit. Whether a limit refuses yet is enforcement.

object
projects
required

Projects an account may own outside a company.

integer
nullable
writeSeats
required

People with write access. Refuses (429, quota.kind: "writeSeats") only in enforce mode; usage.writeSeats is the count.

integer
nullable
readerSeats
required

People who only read: Free 1, Personal 3, Team 5, Enterprise none. A person who writes anywhere in the scope is a writer, once. Refuses (429, quota.kind: "readerSeats") only in enforce mode; usage.readerSeats is the count.

integer
nullable
fileBytes
required

Bytes of files, over fileBytesPer.

integer
fileBytesPer
required
string
Allowed values: account project
results
required

Results, over resultsPer; null is by contract.

integer
nullable
resultsPer
required
string
Allowed values: account project month month-per-paid-user contract
historyDays
required

Days of history kept on Free; null is no day limit.

integer
nullable
resultsThisMonth
required

The results limit of this calendar month (#1441), beside usage.resultsThisMonth: Personal 5 000 000, Team 5 000 000 for each writer (usage.writeSeats). null on Free, whose results is over the account, and on Enterprise, by contract. Never refuses: ingest is not stopped by it in either enforcement.

integer
nullable
usage
required
object
members
required

People in it. On an account or a company, the distinct people across its projects (and a company’s own members), not a sum.

integer
cases
required

Cases not in the Bin.

integer
runs
required

Runs not in the Bin.

integer
results
required

Results stored, of every run (also of a run in the Bin).

integer
files
required

Files kept in Plune’s database: the ones that count against the files budget.

integer
fileBytes
required

The size of those files in bytes.

integer
bucketFiles
required

Files in the customer’s own bucket (ready). Counted, not measured: they cost the database nothing.

integer
aiDraftsThisMonth
required

Plune AI draft requests since the start of the calendar month (UTC).

integer
projects
required

Projects not in the Bin.

integer
writeSeats
required

People with write access (owner, manager, member) in the scope, each once — read it beside limits.writeSeats. Open invitations are not counted.

integer
readerSeats
required

People who only read in the scope, each once — read it beside limits.readerSeats.

integer
resultsThisMonth
required

Result rows of the finished runs started this calendar month (UTC), read beside limits.resultsThisMonth (#1441). A run is counted once, as it finishes (a run that crosses midnight at the end of a month counts in the month it started), with every row it holds — those a retest replaced too, as results counts rows; a result an approved Cairn proposal adds to its finished run counts as it is added. A run that is open or was terminated is not counted until it finishes; a counted run stays counted after it goes to the Bin. null only on Free, whose results limit is over the account; Enterprise has the figure and a null limit.

integer
nullable
nearLimit
required

The limits the scope has used 80% or more of (the threshold of the AI budget); empty when none. A mark to read, not a refusal. projects, writeSeats and readerSeats compare usage.<key> with limits.<key>; projects only for an account, since a company’s projects are not limited. fileBytes and results compare the scope’s usage.fileBytes / usage.results when the limit is over the account, and each project’s figure when it is over a project — near when any one project is. writeSeats is named only when the scope has more than one writer: the owner alone always holds a seat, so one writer is never a mark, not even of the one write seat of Free and Personal, where a second writer is already over the limit (#2020). results over a month or a month-per-paid-user compares usage.resultsThisMonth with limits.resultsThisMonth (#1441); over a contract it is never named. A null limit is never named; a limit of 0 is named once anything is used, except writeSeats, named only from the second writer. One mark says less than it seems: usage.results counts the results of runs in the Bin too, which the Free results limit (#1049) does not, so results can be named before that limit is reached, until the Bin is emptied.

Array<string>
Allowed values: projects writeSeats readerSeats fileBytes results
onFree
required

Only in grace and disabled (tier.tierGraceEndsAt set, and at is it): what the cleanup would delete on that day, counted as of it over the runs there are now. null on an active tier (with an end or without) and on Free. The admin list does not carry it.

object
at
required

When the cleanup first reaches the owner: the end of its 14 days in grace or disabled (tierGraceEndsAt); for an active paid tier, 14 days from now (the day it would start, were the tier switched off now); for Free, now (the next nightly pass).

string format: date-time
runs
required
integer
results
required

The results of those runs.

integer
fileBytes
required

The files of those results, in the database and in the customer’s bucket alike.

integer
deleting
required

True when the cleanup deletes (TIER_RETENTION_ENFORCE); false while it only reports.

boolean
projects
required

One row per project, oldest first.

Array
object
members
required

People in it. On an account or a company, the distinct people across its projects (and a company’s own members), not a sum.

integer
cases
required

Cases not in the Bin.

integer
runs
required

Runs not in the Bin.

integer
results
required

Results stored, of every run (also of a run in the Bin).

integer
files
required

Files kept in Plune’s database: the ones that count against the files budget.

integer
fileBytes
required

The size of those files in bytes.

integer
bucketFiles
required

Files in the customer’s own bucket (ready). Counted, not measured: they cost the database nothing.

integer
aiDraftsThisMonth
required

Plune AI draft requests since the start of the calendar month (UTC).

integer
projectId
required
string
name
required
string
note
required

What is and is not measured, in words.

string
Example
{
"account": {
"subject": {
"kind": "user",
"id": "u-shop"
},
"label": "[email protected]",
"tier": {
"tier": "personal",
"tierState": "active",
"options": {},
"tierValidUntil": "2027-10-15T09:00:00.000Z",
"tierGraceEndsAt": null
},
"limits": {
"projects": 10,
"writeSeats": 1,
"readerSeats": 3,
"fileBytes": 5368709120,
"fileBytesPer": "project",
"results": 5000000,
"resultsPer": "month",
"historyDays": null,
"resultsThisMonth": 5000000
},
"usage": {
"projects": 1,
"members": 3,
"cases": 214,
"runs": 41,
"results": 18902,
"files": 37,
"fileBytes": 5242880,
"bucketFiles": 0,
"aiDraftsThisMonth": 12,
"writeSeats": 1,
"readerSeats": 2,
"resultsThisMonth": 1204556
},
"nearLimit": [],
"onFree": null,
"projects": [
{
"projectId": "u-shop::default",
"name": "Checkout",
"members": 3,
"cases": 214,
"runs": 41,
"results": 18902,
"files": 37,
"fileBytes": 5242880,
"bucketFiles": 0,
"aiDraftsThisMonth": 12
}
]
},
"companies": [
{
"subject": {
"kind": "company",
"id": "6f1c2b3a-0000-4000-8000-0000000000a5"
},
"label": "Acme",
"tier": {
"tier": "team",
"tierState": "grace",
"options": {
"saml": true
},
"tierValidUntil": "2026-10-20T00:00:00.000Z",
"tierGraceEndsAt": "2026-11-03T00:00:00.000Z"
},
"limits": {
"projects": null,
"writeSeats": 50,
"readerSeats": 5,
"fileBytes": 10737418240,
"fileBytesPer": "project",
"results": 5000000,
"resultsPer": "month-per-paid-user",
"historyDays": null,
"resultsThisMonth": 15000000
},
"usage": {
"projects": 1,
"members": 3,
"cases": 214,
"runs": 41,
"results": 18902,
"files": 37,
"fileBytes": 5242880,
"bucketFiles": 0,
"aiDraftsThisMonth": 12,
"writeSeats": 3,
"readerSeats": 0,
"resultsThisMonth": 2310004
},
"nearLimit": [],
"onFree": {
"at": "2026-11-03T00:00:00.000Z",
"runs": 1284,
"results": 1004556,
"fileBytes": 2576980378,
"deleting": false
},
"projects": [
{
"projectId": "u-shop::default",
"name": "Checkout",
"members": 3,
"cases": 214,
"runs": 41,
"results": 18902,
"files": 37,
"fileBytes": 5242880,
"bucketFiles": 0,
"aiDraftsThisMonth": 12
}
]
}
],
"enforcement": "report",
"note": "Rows are counted, not measured: results, cases and runs are numbers of rows, not the bytes they take in the database. Only files are in bytes, and only those kept in the database (a file in the customer’s bucket is counted, not measured). Cases and runs in the Bin are not counted; results and files are counted as long as they are stored."
}

No / invalid session

Session valid but the user no longer exists

Media type application/json
object
error
required
string
Example generated
{
"error": "example"
}

Rate-limited: the per-route throttle, or the per-minute request limit of the plan an API token counts by (#1442; the body names the plan, #2092). Retry-After carries the seconds until the window rolls over.

Media type application/json
object
error
required
string
Example generated
{
"error": "example"
}
Retry-After
integer

Seconds until the window rolls over