Skip to content

Dashboard balance projection + upcoming bills

GET
/bills/projection
curl --request GET \
--url 'https://api.tovarifinancial.com/bills/projection?accountScope=all' \
--header 'Authorization: Bearer <token>'
accountScope
string
Allowed values: all checking savings investment safe_to_spend

Narrows the SERIES ONLY (net-worth base, day-net history, account openings, and the bill occurrences that step the projected line). Absent or empty => ‘all’, which is byte-identical to the unscoped response. ‘checking’ / ‘savings’ / ‘investment’ narrow by account type; ‘safe_to_spend’ narrows to the Safe-to-Spend POOL — the accounts matching is_active = TRUE AND include_in_safe_to_spend = TRUE, the same universe the Safe to Spend headline and the Cash Flow report default to (migration 014’s CHECK keeps investment / credit_card / loan accounts out of it). A pool with no members is a normal 200 carrying includedAccountCount 0, currentNetWorthCents 0 and lowestProjected null — never an error. An unknown value is rejected with 400 and is never coerced to ‘all’. remainingDueThisMonthCents, overdueDueCents and upcomingBills are deliberately NOT scoped under ANY value — they belong to the adjacent Upcoming Bills card, which shares this response.

Projection

Media typeapplication/json
object
data
required
object
currentNetWorthCents

Integer minor units (cents)

integer format: int64
projectedEndCents

Integer minor units (cents)

integer format: int64
remainingDueThisMonthCents

Integer minor units (cents)

integer format: int64
overdueDueCents

Integer minor units (cents)

integer format: int64
points
Array<object>
object
label
string
dateIso

Calendar date, ‘YYYY-MM-DD’

string
monthIso
string
isMonthStart
boolean
isCurrent
boolean
actualCents

Integer minor units (cents)

integer format: int64
nullable
projectedCents

Integer minor units (cents)

integer format: int64
nullable
upcomingBills
Array<object>
object
billId
string
name
string
accountId
string
budgetCategoryId
string
nullable
categoryColorId
string
nullable
amountCents

Integer minor units (cents)

integer format: int64
direction
string
Allowed values: expense income
frequency
string
Allowed values: once monthly weekly biweekly twice-monthly annually
dueDate

Calendar date, ‘YYYY-MM-DD’

string
scheduledMark
object
scheduledPaymentDate
required

Calendar date, ‘YYYY-MM-DD’

string
amountCents
required

Integer minor units (cents)

integer format: int64
effectiveDueDate

ScheduledMark ? its scheduledPaymentDate : this row’s own dueDate.

string
effectiveAmountCents

SIGNED (income +, expense −), server-computed. Equals the schedule’s own signed amount when unmarked. Never re-derive a sign on the client.

integer format: int64
accountScope

The EFFECTIVE scope, echoed on every path so a param-dropping proxy is detectable client-side.

string
Allowed values: all checking savings investment safe_to_spend
includedAccountCount

How many accounts the scope matched. Emitted on EVERY path including the default one, and 0 is a legitimate value (an accountScope that matched nothing — e.g. an empty Safe-to-Spend pool) that clients key their empty state on.

integer
lowestProjected

The lowest point of the PROJECTED series (ties resolve to the earliest date) — the projection footer figure, computed server-side. NULL when the scope matched no accounts or no point carries a projected value; never a fabricated $0.

object
cents
required

Integer minor units (cents)

integer format: int64
dateIso
required

Calendar date, ‘YYYY-MM-DD’

string
message
string
requestId
required
string
timestamp
required
string format: date-time
Example
{
"data": {
"upcomingBills": [
{
"direction": "expense",
"frequency": "once"
}
],
"accountScope": "all"
}
}

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 ORG_NAME_TAKEN 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 ORG_NAME_TAKEN 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"
}

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 ORG_NAME_TAKEN 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 ORG_NAME_TAKEN 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"
}