Skip to content

One account's actual and projected daily balance with threshold facts

GET
/accounts/{id}/balance-projection
curl --request GET \
--url https://api.tovarifinancial.com/accounts/2489E9AD-2EE2-8E00-8EC9-32D5F69181C0/balance-projection \
--header 'Authorization: Bearer <token>'

READ-ONLY (KAN-3658): no idempotency key. One account, any type. The ACTUAL line is the reconstructed end-of-day working balance from windowStartIso to today; the PROJECTED line runs from today to today + 30 and IS the GET /bills/scheduled?includeMirrors=true ledger walk for this account — so its line includes the bills scheduled into it from another account: a card’s or loan’s payments (KAN-3670), a savings or checking account’s incoming transfers (KAN-3683) (skipped and pending-matched occurrences step by zero; ambiguous and payment-found ones still step), so it equals the Balance column at every occurrence date: an overdue, due-today or moved-into-the-past occurrence steps on today + 1, one moved past the horizon on the horizon. At most 400 points: every day from dailyFromIso (max(windowStartIso, today - 89)) to the horizon, and before it one END-OF-DAY point every sampleStrideDays days plus windowStartIso itself. Liabilities (credit card, loan) stay signed negative everywhere. projectionStatus: ok; snapshot_sourced (a Plaid-linked investment account valued by snapshots — every projectedCents and thresholds is null); account_closed (points [] and thresholds null). A missing or another org’s account is the identical 404.

id
required
string format: uuid

Account id

start

Calendar date, ‘YYYY-MM-DD’

string

Optional window start ‘YYYY-MM-DD’ (the View period start). Absent means the account’s existence start; an earlier date is clamped up to it (echoed as windowStartIso). Malformed or after today is a 400 on start with a fixed message that never echoes the value.

Balance projection

Media typeapplication/json
object
data
required
object
accountId
required
string format: uuid
accountType
required
string
Allowed values: checking savings investment credit_card loan
isLiability
required

True for credit_card and loan.

boolean
creditLimitCents
required

The credit limit, or null when none is set (NULL or 0).

integer format: int64
nullable
balanceSource
required
string
Allowed values: ledger investment-snapshot
projectionStatus
required
string
Allowed values: ok snapshot_sourced account_closed
todayIso
required

Calendar date, ‘YYYY-MM-DD’

string
windowStartIso
required

Calendar date, ‘YYYY-MM-DD’

string
windowEndIso
required

Today + 30 — fixed, not a request parameter.

string
dailyFromIso
required

Calendar date, ‘YYYY-MM-DD’

string
sampleStrideDays
required

Days between sampled points before dailyFromIso; null when fully daily.

integer
nullable
workingBalanceCents
required

The projection seed — equal to GET /bills/scheduled?accountId workingBalanceCents.

integer format: int64
points
required
Array<object>
<= 400 items
object
dateIso
required

Calendar date, ‘YYYY-MM-DD’

string
monthIso
required

The month of dateIso, ‘YYYY-MM’.

string
isCurrent
required

True on today’s point ONLY — the actual/projected boundary.

boolean
actualCents
required

The reconstructed END-OF-DAY working balance; non-null for every date <= today. It may differ from the register’s tiered posted Balance column on days with uncleared rows (KAN-584), and from today’s projected point when future-dated rows exist. Liabilities are signed negative.

integer format: int64
nullable
projectedCents
required

The Scheduled ledger walk; non-null for every date >= today when projectionStatus is ok, else null. Equals the Balance column of GET /bills/scheduled?accountId at every date carrying an occurrence.

integer format: int64
nullable
thresholds
required
One of:
object
kind
required
string
Allowed values: asset
lowest
required

The minimum; the EARLIEST day on a tie.

object
dateIso
required

Calendar date, ‘YYYY-MM-DD’

string
balanceCents
required

Integer minor units (cents)

integer format: int64
firstBelowZeroDateIso
required

The first day (today included) below zero, or null.

string
nullable
message
string
requestId
required
string
timestamp
required
string format: date-time
Example
{
"data": {
"accountType": "checking",
"balanceSource": "ledger",
"projectionStatus": "ok",
"thresholds": {
"kind": "asset"
}
}
}

Validation failed — see errorCode / fieldErrors

Media typeapplication/json
object
errorCode
required

Machine-readable error code (AUTH_ERROR_CODES).

string
Allowed values: INVALID_EMAIL_FORMAT USER_ALREADY_EXISTS INVALID_INVITE_CODE WRONG_PASSWORD USER_NOT_FOUND AUTHENTICATION_FAILED EXPIRED_CODE INVALID_CODE INVALID_PASSWORD VALIDATION_ERROR SIGNUP_FAILED DATABASE_ERROR SERVICE_UNAVAILABLE PLAID_ERROR IDEMPOTENCY_CONFLICT ACCOUNT_ALREADY_LINKED NOT_FOUND
message
required
string
fieldErrors

Optional field-level validation errors, keyed by field name.

object
key
additional properties
Array<string>
requestId
required
string
timestamp
required
string format: date-time
Example
{
"errorCode": "INVALID_EMAIL_FORMAT"
}

Missing, invalid, or expired bearer token

Media typeapplication/json
object
errorCode
required

Machine-readable error code (AUTH_ERROR_CODES).

string
Allowed values: INVALID_EMAIL_FORMAT USER_ALREADY_EXISTS INVALID_INVITE_CODE WRONG_PASSWORD USER_NOT_FOUND AUTHENTICATION_FAILED EXPIRED_CODE INVALID_CODE INVALID_PASSWORD VALIDATION_ERROR SIGNUP_FAILED DATABASE_ERROR SERVICE_UNAVAILABLE PLAID_ERROR IDEMPOTENCY_CONFLICT ACCOUNT_ALREADY_LINKED NOT_FOUND
message
required
string
fieldErrors

Optional field-level validation errors, keyed by field name.

object
key
additional properties
Array<string>
requestId
required
string
timestamp
required
string format: date-time
Example
{
"errorCode": "INVALID_EMAIL_FORMAT"
}

Authenticated, but the tenant gate refuses the request until the caller resolves a precondition. errorCode is one of EMAIL_NOT_VERIFIED, POLICY_ACCEPTANCE_REQUIRED, or SUBSCRIPTION_REQUIRED, evaluated in exactly that order (contract term CCR-1: email verification first, then policy acceptance, then subscription — so a subscriber who has merely not re-accepted the current policies always sees POLICY_ACCEPTANCE_REQUIRED). A POLICY_ACCEPTANCE_REQUIRED body additionally carries details.outstanding (the policy versions still to accept) and details.firstAcceptance. The SUBSCRIPTION_REQUIRED arm is INERT unless the server-side BILLING_ENABLED flag is exactly the string true; while it is off, only the first two codes are reachable. Not retryable as sent — resolve the named condition, then resend.

Media typeapplication/json
object
errorCode
required

Which precondition refused the request. Evaluated in this order (CCR-1); SUBSCRIPTION_REQUIRED is unreachable while BILLING_ENABLED is not exactly true.

string
Allowed values: EMAIL_NOT_VERIFIED POLICY_ACCEPTANCE_REQUIRED SUBSCRIPTION_REQUIRED
message
required
string
details
object
outstanding
required

Active policy versions the user has not yet accepted.

Array<object>
object
id
required
string format: uuid
policyType
required
string
version
required
integer
title
required
string
firstAcceptance
required

True when the user has accepted no policy before — the client renders the new-signup screen rather than the re-acceptance one.

boolean
requestId
required
string
timestamp
required
string format: date-time
Example
{
"errorCode": "EMAIL_NOT_VERIFIED"
}

Resource not found or not owned by the caller org

Media typeapplication/json
object
errorCode
required

Machine-readable error code (AUTH_ERROR_CODES).

string
Allowed values: INVALID_EMAIL_FORMAT USER_ALREADY_EXISTS INVALID_INVITE_CODE WRONG_PASSWORD USER_NOT_FOUND AUTHENTICATION_FAILED EXPIRED_CODE INVALID_CODE INVALID_PASSWORD VALIDATION_ERROR SIGNUP_FAILED DATABASE_ERROR SERVICE_UNAVAILABLE PLAID_ERROR IDEMPOTENCY_CONFLICT ACCOUNT_ALREADY_LINKED NOT_FOUND
message
required
string
fieldErrors

Optional field-level validation errors, keyed by field name.

object
key
additional properties
Array<string>
requestId
required
string
timestamp
required
string format: date-time
Example
{
"errorCode": "INVALID_EMAIL_FORMAT"
}

Internal error (no internal detail leaked)

Media typeapplication/json
object
errorCode
required

Machine-readable error code (AUTH_ERROR_CODES).

string
Allowed values: INVALID_EMAIL_FORMAT USER_ALREADY_EXISTS INVALID_INVITE_CODE WRONG_PASSWORD USER_NOT_FOUND AUTHENTICATION_FAILED EXPIRED_CODE INVALID_CODE INVALID_PASSWORD VALIDATION_ERROR SIGNUP_FAILED DATABASE_ERROR SERVICE_UNAVAILABLE PLAID_ERROR IDEMPOTENCY_CONFLICT ACCOUNT_ALREADY_LINKED NOT_FOUND
message
required
string
fieldErrors

Optional field-level validation errors, keyed by field name.

object
key
additional properties
Array<string>
requestId
required
string
timestamp
required
string format: date-time
Example
{
"errorCode": "INVALID_EMAIL_FORMAT"
}

Service temporarily unavailable — errorCode is SERVICE_UNAVAILABLE. A TRANSIENT, RETRYABLE condition rather than a defect in the request: a query that exceeded its time budget, a lost or refused database connection, a saturated connection pool, or an outage at an upstream provider the request depends on (the authentication provider, or the bank data provider on a bank-connection operation). The identical request may succeed on retry — back off briefly and, on a write, resend the same X-Idempotency-Key where the operation accepts one.

Media typeapplication/json
object
errorCode
required

Machine-readable error code (AUTH_ERROR_CODES).

string
Allowed values: INVALID_EMAIL_FORMAT USER_ALREADY_EXISTS INVALID_INVITE_CODE WRONG_PASSWORD USER_NOT_FOUND AUTHENTICATION_FAILED EXPIRED_CODE INVALID_CODE INVALID_PASSWORD VALIDATION_ERROR SIGNUP_FAILED DATABASE_ERROR SERVICE_UNAVAILABLE PLAID_ERROR IDEMPOTENCY_CONFLICT ACCOUNT_ALREADY_LINKED NOT_FOUND
message
required
string
fieldErrors

Optional field-level validation errors, keyed by field name.

object
key
additional properties
Array<string>
requestId
required
string
timestamp
required
string format: date-time
Example
{
"errorCode": "INVALID_EMAIL_FORMAT"
}