Export a closed month's journal
company.close.export
Returns the closed month's journal as CSV (`text/csv`, `Content-Disposition` filename, `Content-Digest` SHA-256); send `Accept: application/json` for this JSON object. Each posting effect in the month is one entry of two lines, a debit on its source account and a credit on its destination, with columns date, entry, account, account_name, account_role, account_binding, description, debit, credit, currency, reference (the transfer) and operation_id. Amounts are decimal riyals. The header row lets Daftra's journal import (Accounting, Journal Entries, Import) map each column. The file is rebuilt from the ledger statements and must match the digest the close stored, or it refuses with state_conflict. A month holds at most 10,000 posting effects. A month with no close refuses with resource_not_found; a v1 close from before r389 stored no journal digest and refuses with reporting_artifact_refused. Callers: the founder's CLI login, or an agent token with products:read, or a personal access token with finance:read.
GET /v1/company-closes/journal
Principal user_session. Idempotency not_required. Environment either.
Input
| Field | In | Type | Description |
|---|---|---|---|
period required | query | string | The closed UTC month. |
X-Hyperscale-Environment | header | sandbox | live |
Request sample
curl --request GET 'https://hyperscale0.ai/v1/company-closes/journal' \
--header "Authorization: Bearer $HYPERSCALE_API_KEY" \
--header 'X-Hyperscale-Environment: sandbox'Errors
| Code | HTTP | Cause |
|---|---|---|
agent_approval_denied | 403 | A human denied the agent's proposed operation. |
agent_approval_required | 202 | An agent proposed a protected live operation. |
environment_mismatch | 403 | The session was issued for sandbox or live and the request targets the other environment. |
internal_error | 500 | Hyperscale hit an unexpected server-side condition and hid internal implementation details from this audience. |
invalid_request | 400 | The request does not match the API reference. |
missing_required_permission | 403 | The signed-in member's current role does not grant the permission required for this operation. |
missing_required_scope | 403 | The credential is valid but does not grant one or more operation scopes. |
not_found | 404 | No Hyperscale route matched the requested path and method. |
product_access_suspended | 403 | The Product is disabled or closed, so its credentials are suspended in every environment. |
product_activation_required | 403 | The live Product or required live capability is not active yet. |
rate_limited | 429 | The credential sent more than its limit in the current 60-second window: 600 requests per API key or session, 1,200 per IP address. Every response carries `x-ratelimit-limit`, `x-ratelimit-remaining` and `x-ratelimit-reset` (Unix seconds). |
resource_not_found | 404 | The requested resource does not exist in the credential's visible scope. |
resource_reader_unavailable | 503 | A generated read model could not serve the request at this moment. |
state_conflict | 409 | The operation conflicts with the current durable state of the resource. |
tenant_mismatch | 403 | The request mixed tenant-owned identifiers across tenant boundaries. |
tenant_not_found | 404 | The credential resolved to a tenant Hyperscale cannot find. |
unauthorized | 403 | The request did not include a valid Hyperscale bearer credential for this environment. |
agent_token_expired | 401 | The agent token is real, but its grant ended. A grant lasts 30 days, or 7 days unused. `details.expiresAt` holds the date in ISO 8601 and `details.agentName` names the agent. |
agent_token_replaced | 401 | The founder ran `hyperscale agent setup` again for this agent, which replaced this token with a newer one. `details.agentName` names the agent and `details.replacedAt` holds the date. |
device_login_expired | 401 | The bearer is the founder's own device login from `hyperscale auth login`, not an agent token. Its access token lasts an hour and the CLI refreshes it; the login itself ends after 30 days, or 7 days unused. `details.expiresAt` holds when it ended in ISO 8601. |
invalid_credentials | 401 | Hyperscale could not accept the account or credential request. Signup, login, and bearer authentication use one 401 for every case they reject, so the response exposes no credential-specific reason or registered-email verdict. The single exception is a key that is real but homed in the other environment: because the presented secret already matched a stored key, the message names the mismatch instead of leaving a working credential looking unknown. A bearer that matched nothing gets text that fits its prefix (an agent token, a refresh token, a personal access token, a session or no Hyperscale token at all), which says only what the caller sent, never whether a credential like it exists. |
reporting_artifact_refused | 422 | The capture could not be complete: an operation in the company is still unresolved, or the result passes the row limit. |
session_expired | 401 | The session behind this request has ended. A console session ends 30 days after sign-in, or after 12 hours with no request. An admin or customer session ends 24 hours after sign-in, or after 15 minutes with no request. A personal access token ends at the `expiresAt` set when it was created. |
session_required | 401 | This operation needs a person signed in through the browser or the `hyperscale` CLI. A Product API key cannot call it. The request carried no session, or its token matched no live session. |
session_revoked | 401 | The session or personal access token behind this request was ended before its expiry. Sign-out, `user.session.revoke`, a password reset, a role change, removal from the team, user suspension and `personal_access_token.revoke` all end sessions. |
statement_evidence_incomplete | 409 | One of this month's ledger movements has no complete receipt behind it: no finalized receipt claims that transfer, more than one does, or the receipt that claims it is missing the linkage a statement line is built from. A statement is only ever derived from receipts, so the month is refused whole rather than issued with a line no receipt can back. The error details name the ledger transfer and the receipt the check stopped on. |
tenant_status_forbidden | 409 | The company is suspended or closed, so every credential bound to it is refused, reads included. `details.tenantId` names the company. |