Explain a period total
const url = 'https://api.europlaybook.com/v1/periods/2489E9AD-2EE2-8E00-8EC9-32D5F69181C0/totals/example/explain';const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request GET \ --url https://api.europlaybook.com/v1/periods/2489E9AD-2EE2-8E00-8EC9-32D5F69181C0/totals/example/explain \ --header 'Authorization: Bearer <token>'Where a figure comes from: the pack line key (as in declared.lines of the totals) > the ledger
entries behind it > products > the packaging lines used (own or inherited, with source and evidence
count) + sales facts per month and channel. Recorded at the ledger build; closed periods keep it.
Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Path Parameters
Section titled “Path Parameters”Responses
Section titled “Responses”OK
object
object
The pack line key, e.g. paper.household.
The line’s label as the scheme calculator names it.
The line’s value as a decimal string.
Returns are netted in this scheme (negative entries).
How entries were matched to the line: indexes (by the calculator) or material.
Lineage was recorded at the build (false: built before; rebuild the period).
object
Packaging lines that fed this entry.
Parcel facts per month (parcel entries).
Products behind the line, largest share first.
object
Ledger entries of this product in the line.
This product’s share of the line, milligrams.
object
The packaging line that was used (as it was at the ledger build).
Sales, grouped or transport.
The line is the product group’s (the product had no own line).
The line still exists (false: deleted after the build).
Evidence files on the line and on its packaging item.
Parcel facts behind parcel packaging entries.
Example
{ "period_status": "open", "line": { "key": "paper.household", "value": "27.580", "unit": "kg" }, "entries": [ { "kind": "product", "fact_kind": "sale", "packaging_line_ids": [], "sales": [], "parcel_facts": [] } ], "products": [ { "packaging_lines": [ { "layer": "", "evidence_count": 0 } ], "sales": [ { "month": "2026-03", "fact_kind": "sale" } ] } ], "parcels": []}Bad Request
object
Example
{ "detail": "This API key lacks the scope catalogue:write", "code": "insufficient_scope", "params": { "required_scope": "catalogue:write" }}Unauthorized
object
Example
{ "detail": "This API key lacks the scope catalogue:write", "code": "insufficient_scope", "params": { "required_scope": "catalogue:write" }}Forbidden
object
Example
{ "detail": "This API key lacks the scope catalogue:write", "code": "insufficient_scope", "params": { "required_scope": "catalogue:write" }}Not Found
object
Example
{ "detail": "This API key lacks the scope catalogue:write", "code": "insufficient_scope", "params": { "required_scope": "catalogue:write" }}Conflict
object
Example
{ "detail": "This API key lacks the scope catalogue:write", "code": "insufficient_scope", "params": { "required_scope": "catalogue:write" }}Unprocessable Content
object
What went wrong, in English, for people and logs.
Stable machine-readable error code; translate and branch on this.
Per-field problems (pydantic format: loc, msg, type).
object
Example
{ "detail": "This API key lacks the scope catalogue:write", "code": "insufficient_scope", "params": { "required_scope": "catalogue:write" }, "errors": []}Too Many Requests
object
Example
{ "detail": "This API key lacks the scope catalogue:write", "code": "insufficient_scope", "params": { "required_scope": "catalogue:write" }}