API reference · Savings & everyday money
Budget Category budgets, auto-categorisation and spending goals. About budgets & goals Live
POST Create a budget POST /budget
Created paused, in DRAFT - it counts nothing until you activate it, so you can set the categories up first. A monthly budget runs on your cycle start day, so set that to 25 in your budget settings and your month runs payday to payday.
Headers Name Notes AuthorizationBearer token X-TenantYour tenant X-Environmenttest or live Content-Typeapplication/json
Query parameters Name Default ownerTypeOptional ownerReferenceOptional
Example Request body: BudgetRequest · Response: BudgetResponse
curl Request Response
Copy curl -X POST "https://api.bridgemoni.com/budget?ownerType=value&ownerReference=value" \
-H "Authorization: Bearer $BRIDGEMONI_TOKEN" \
-H "X-Tenant: $BRIDGEMONI_TENANT" \
-H "X-Environment: $BRIDGEMONI_ENV" \
-H "Content-Type: application/json" \
-d '{
"name": "Ada Obi",
"description": "March payroll",
"currencyCode": "NGN",
"periodType": "DAILY",
"startDate": "2027-03-14",
"endDate": "2027-03-14",
"limitAmount": 250000.0,
"rolloverMode": "NONE",
"alertThresholds": [
1
],
"categories": [
{
"categoryReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"allocationAmount": 250000.0
}
],
"includeInternalTransfers": true,
"enforcementMode": "text",
"enforcedAccountReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"categoryReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"allocationAmount": 250000.0
}' Copy {
"name": "Ada Obi",
"description": "March payroll",
"currencyCode": "NGN",
"periodType": "DAILY",
"startDate": "2027-03-14",
"endDate": "2027-03-14",
"limitAmount": 250000.0,
"rolloverMode": "NONE",
"alertThresholds": [
1
],
"categories": [
{
"categoryReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"allocationAmount": 250000.0
}
],
"includeInternalTransfers": true,
"enforcementMode": "text",
"enforcedAccountReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"categoryReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"allocationAmount": 250000.0
} Copy {
"data": {
"reference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"name": "text",
"description": "text",
"currencyCode": "text",
"periodType": "DAILY",
"startDate": "2027-03-14",
"endDate": "2027-03-14",
"limitAmount": 250000.0,
"rolloverMode": "NONE",
"alertThresholds": [
1
],
"enforcementMode": "text",
"enforcedAccountReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"status": "DRAFT",
"includeInternalTransfers": true,
"categoryScoped": true,
"categories": [
{
"categoryReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"categoryCode": "text",
"categoryName": "text",
"allocationAmount": 250000.0
}
],
"currentPeriod": {
"reference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"periodKey": "text",
"periodStart": "2027-03-14T14:30:01",
"periodEnd": "2027-03-14T14:30:01",
"limitAmount": 250000.0,
"carriedInAmount": 250000.0,
"spentAmount": 250000.0,
"remainingAmount": 250000.0,
"utilisationPercent": 250000.0,
"projectedSpendAmount": 250000.0,
"transactionCount": 1,
"status": "text",
"highestThresholdNotified": 1,
"closedAt": "2027-03-14T14:30:01",
"restatedAt": "2027-03-14T14:30:01",
"categories": [
{
"...": "nested"
}
],
"categoryReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"categoryCode": "text",
"categoryName": "text",
"allocationAmount": 250000.0
},
"categoryReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"categoryCode": "text",
"categoryName": "text",
"allocationAmount": 250000.0
},
"description": "Create a budget"
} Responses Status When 200Budget created 400A limit of zero, or a bad window 409You already have a budget by that name
GET Money in against money out GET /budget/analytics/cashflow
Month by month, oldest first. Months with no activity appear as zero rather than being left out, so a chart does not show a gap where a quiet month was.
Headers Name Notes AuthorizationBearer token X-TenantYour tenant X-Environmenttest or live
Query parameters Name Default ownerTypeOptional ownerReferenceOptional currencyCodeOptional periods6
Example Response: CashflowResponse
curl Response
Copy curl -X GET "https://api.bridgemoni.com/budget/analytics/cashflow?ownerType=value&ownerReference=value¤cyCode=value&periods=6" \
-H "Authorization: Bearer $BRIDGEMONI_TOKEN" \
-H "X-Tenant: $BRIDGEMONI_TENANT" \
-H "X-Environment: $BRIDGEMONI_ENV" Copy {
"data": {
"currencyCode": "text",
"points": [
{
"periodKey": "text",
"expense": 250000.0,
"income": 250000.0,
"net": 250000.0
}
],
"averageExpense": 250000.0,
"averageIncome": 250000.0,
"periodKey": "text",
"expense": 250000.0,
"income": 250000.0,
"net": 250000.0
},
"description": "Money in against money out"
} Responses Status When 200Cashflow retrieved successfully 400Owner could not be determined 403You cannot act for that owner
GET Where a budget is heading GET /budget/analytics/forecast
If you carry on spending at the rate you have so far. A run rate, not a prediction - it is withheld entirely in the first few percent of a cycle, when one payment would project to something absurd, and the volatility figure says how much to trust it after that.
Headers Name Notes AuthorizationBearer token X-TenantYour tenant X-Environmenttest or live
Query parameters Name Default ownerTypeOptional ownerReferenceOptional budgetReferenceOptional
Example Response: BudgetForecastResponse
curl Response
Copy curl -X GET "https://api.bridgemoni.com/budget/analytics/forecast?ownerType=value&ownerReference=value&budgetReference=value" \
-H "Authorization: Bearer $BRIDGEMONI_TOKEN" \
-H "X-Tenant: $BRIDGEMONI_TENANT" \
-H "X-Environment: $BRIDGEMONI_ENV" Copy {
"data": {
"budgetReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"budgetName": "text",
"periodKey": "text",
"currencyCode": "text",
"periodStart": "2027-03-14T14:30:01",
"periodEnd": "2027-03-14T14:30:01",
"limitAmount": 250000.0,
"spentAmount": 250000.0,
"elapsedPercent": 250000.0,
"projectedSpendAmount": 250000.0,
"projectedVarianceAmount": 250000.0,
"projectedToBreach": true,
"projectedBreachDate": "2027-03-14",
"historicalVolatility": 250000.0,
"historicalPeriodsUsed": 1
},
"description": "Where a budget is heading"
} Responses Status When 200Forecast returned 404No such budget, or it has no cycle running
GET Where a month's money went GET /budget/analytics/spend-by-category
Each category set against the same category last month, so you can see what moved rather than only what things cost.
Headers Name Notes AuthorizationBearer token X-TenantYour tenant X-Environmenttest or live
Query parameters Name Default ownerTypeOptional ownerReferenceOptional currencyCodeOptional periodKeyOptional
Example Response: SpendByCategoryResponse
curl Response
Copy curl -X GET "https://api.bridgemoni.com/budget/analytics/spend-by-category?ownerType=value&ownerReference=value¤cyCode=value&periodKey=value" \
-H "Authorization: Bearer $BRIDGEMONI_TOKEN" \
-H "X-Tenant: $BRIDGEMONI_TENANT" \
-H "X-Environment: $BRIDGEMONI_ENV" Copy {
"data": {
"periodKey": "text",
"previousPeriodKey": "text",
"currencyCode": "text",
"totalExpense": 250000.0,
"totalIncome": 250000.0,
"netCashflow": 250000.0,
"categories": [
{
"categoryReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"categoryCode": "text",
"categoryName": "text",
"colourHex": "text",
"amount": 250000.0,
"share": 250000.0,
"transactionCount": 1,
"previousPeriodAmount": 250000.0,
"changePercent": 250000.0
}
]
},
"description": "Where a month's money went"
} Responses Status When 200Spend by category retrieved successfully 400Owner could not be determined 403You cannot act for that owner
GET The dashboard call GET /budget/analytics/summary
Totals for the window, your largest categories, and how each running budget is doing. Defaults to this month so far.
Headers Name Notes AuthorizationBearer token X-TenantYour tenant X-Environmenttest or live
Query parameters Name Default ownerTypeOptional ownerReferenceOptional currencyCodeOptional fromOptional toOptional
Example Response: SpendSummaryResponse
curl Response
Copy curl -X GET "https://api.bridgemoni.com/budget/analytics/summary?ownerType=value&ownerReference=value¤cyCode=value&from=value&to=value" \
-H "Authorization: Bearer $BRIDGEMONI_TOKEN" \
-H "X-Tenant: $BRIDGEMONI_TENANT" \
-H "X-Environment: $BRIDGEMONI_ENV" Copy {
"data": {
"from": "2027-03-14T14:30:01",
"to": "2027-03-14T14:30:01",
"currencyCode": "text",
"totalExpense": 250000.0,
"totalIncome": 250000.0,
"netCashflow": 250000.0,
"expenseCount": 1,
"incomeCount": 1,
"uncategorisedExpense": 250000.0,
"topCategories": [
{
"categoryReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"categoryCode": "text",
"categoryName": "text",
"colourHex": "text",
"amount": 250000.0,
"share": 250000.0,
"transactionCount": 1,
"previousPeriodAmount": 250000.0,
"changePercent": 250000.0
}
],
"budgets": [
{
"budgetName": "text",
"periodKey": "text",
"limitAmount": 250000.0,
"spentAmount": 250000.0,
"remainingAmount": 250000.0,
"utilisationPercent": 250000.0,
"overspent": true
}
],
"budgetName": "text",
"periodKey": "text",
"limitAmount": 250000.0,
"spentAmount": 250000.0,
"remainingAmount": 250000.0,
"utilisationPercent": 250000.0,
"overspent": true
},
"description": "The dashboard call"
} Responses Status When 200Spending summary retrieved successfully 400Owner could not be determined 403You cannot act for that owner
GET Who you paid most GET /budget/analytics/top-counterparties
Grouped by who was paid rather than by the exact narrative, so the same shop counts once however many receipts it produced. That grouping is approximate: two unrelated payees can occasionally share a label.
Headers Name Notes AuthorizationBearer token X-TenantYour tenant X-Environmenttest or live
Query parameters Name Default ownerTypeOptional ownerReferenceOptional currencyCodeOptional fromOptional toOptional limit10
Example Response: TopCounterpartiesResponse
curl Response
Copy curl -X GET "https://api.bridgemoni.com/budget/analytics/top-counterparties?ownerType=value&ownerReference=value¤cyCode=value&from=value&to=value&limit=10" \
-H "Authorization: Bearer $BRIDGEMONI_TOKEN" \
-H "X-Tenant: $BRIDGEMONI_TENANT" \
-H "X-Environment: $BRIDGEMONI_ENV" Copy {
"data": {
"from": "2027-03-14T14:30:01",
"to": "2027-03-14T14:30:01",
"currencyCode": "text",
"counterparties": [
{
"label": "text",
"amount": 250000.0,
"transactionCount": 1,
"share": 250000.0
}
],
"label": "text",
"amount": 250000.0,
"transactionCount": 1,
"share": 250000.0
},
"description": "Who you paid most"
} Responses Status When 200Top counterparties retrieved successfully 400Owner could not be determined 403You cannot act for that owner
GET One category over time GET /budget/analytics/trend
With how much it varies month to month. A large variation next to the average means the average is not something to plan against.
Headers Name Notes AuthorizationBearer token X-TenantYour tenant X-Environmenttest or live
Query parameters Name Default ownerTypeOptional ownerReferenceOptional currencyCodeOptional categoryReferenceOptional periods12
Example Response: CategoryTrendResponse
curl Response
Copy curl -X GET "https://api.bridgemoni.com/budget/analytics/trend?ownerType=value&ownerReference=value¤cyCode=value&categoryReference=value&periods=12" \
-H "Authorization: Bearer $BRIDGEMONI_TOKEN" \
-H "X-Tenant: $BRIDGEMONI_TENANT" \
-H "X-Environment: $BRIDGEMONI_ENV" Copy {
"data": {
"categoryReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"categoryCode": "text",
"categoryName": "text",
"currencyCode": "text",
"points": [
{
"periodKey": "text",
"amount": 250000.0,
"transactionCount": 1
}
],
"averageAmount": 250000.0,
"standardDeviation": 250000.0,
"periodKey": "text",
"amount": 250000.0,
"transactionCount": 1
},
"description": "One category over time"
} Responses Status When 200Trend returned 404No such category
GET List categories GET /budget/categories
Everything this owner can file against: the catalogue seeded with the tenant, plus their own. Sorted by display order.
Headers Name Notes AuthorizationBearer token X-TenantYour tenant X-Environmenttest or live
Query parameters Name Default ownerTypeOptional ownerReferenceOptional kindOptional activeOnlytrue
Example Response: List<BudgetCategoryResponse>
curl Response
Copy curl -X GET "https://api.bridgemoni.com/budget/categories?ownerType=value&ownerReference=value&kind=value&activeOnly=true" \
-H "Authorization: Bearer $BRIDGEMONI_TOKEN" \
-H "X-Tenant: $BRIDGEMONI_TENANT" \
-H "X-Environment: $BRIDGEMONI_ENV" Copy {
"data": [
{
"reference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"code": "text",
"name": "text",
"description": "text",
"kind": "EXPENSE",
"parentCategoryReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"systemProvided": true,
"iconUrl": "text",
"colourHex": "text",
"displayOrder": 1,
"active": true
}
],
"description": "List categories"
} POST Create a category POST /budget/category
Adds a category of your own. The code must not collide with one of yours or with a seeded one, because rules address categories by code and a collision would make every rule naming it ambiguous.
Headers Name Notes AuthorizationBearer token X-TenantYour tenant X-Environmenttest or live Content-Typeapplication/json
Query parameters Name Default ownerTypeOptional ownerReferenceOptional
Example Request body: BudgetCategoryRequest · Response: BudgetCategoryResponse
curl Request Response
Copy curl -X POST "https://api.bridgemoni.com/budget/category?ownerType=value&ownerReference=value" \
-H "Authorization: Bearer $BRIDGEMONI_TOKEN" \
-H "X-Tenant: $BRIDGEMONI_TENANT" \
-H "X-Environment: $BRIDGEMONI_ENV" \
-H "Content-Type: application/json" \
-d '{
"code": "text",
"name": "Ada Obi",
"description": "March payroll",
"kind": "EXPENSE",
"parentCategoryReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"iconUrl": "text",
"colourHex": "text",
"displayOrder": 1
}' Copy {
"code": "text",
"name": "Ada Obi",
"description": "March payroll",
"kind": "EXPENSE",
"parentCategoryReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"iconUrl": "text",
"colourHex": "text",
"displayOrder": 1
} Copy {
"data": {
"reference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"code": "text",
"name": "text",
"description": "text",
"kind": "EXPENSE",
"parentCategoryReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"systemProvided": true,
"iconUrl": "text",
"colourHex": "text",
"displayOrder": 1,
"active": true
},
"description": "Create a category"
} Responses Status When 200Category created 409That code is already in use 400A parent of the wrong kind, or itself a child
DELETE Retire a category DELETE /budget/category/{reference}
Stops offering the category without removing it. The spending already filed under it keeps saying where it went, which is the whole reason nothing here is deleted.
Headers Name Notes AuthorizationBearer token X-TenantYour tenant X-Environmenttest or live
Path parameters Query parameters Name Default ownerTypeOptional ownerReferenceOptional
Example Response: Void
curl Response
Copy curl -X DELETE "https://api.bridgemoni.com/budget/category/b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e?ownerType=value&ownerReference=value" \
-H "Authorization: Bearer $BRIDGEMONI_TOKEN" \
-H "X-Tenant: $BRIDGEMONI_TENANT" \
-H "X-Environment: $BRIDGEMONI_ENV" Copy {
"description": "Retire a category"
} Responses Status When 200Category retired 409It still has children 403A seeded category cannot be retired
GET Read one category GET /budget/category/{reference}
Headers Name Notes AuthorizationBearer token X-TenantYour tenant X-Environmenttest or live
Path parameters Query parameters Name Default ownerTypeOptional ownerReferenceOptional
Example Response: BudgetCategoryResponse
curl Response
Copy curl -X GET "https://api.bridgemoni.com/budget/category/b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e?ownerType=value&ownerReference=value" \
-H "Authorization: Bearer $BRIDGEMONI_TOKEN" \
-H "X-Tenant: $BRIDGEMONI_TENANT" \
-H "X-Environment: $BRIDGEMONI_ENV" Copy {
"data": {
"reference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"code": "text",
"name": "text",
"description": "text",
"kind": "EXPENSE",
"parentCategoryReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"systemProvided": true,
"iconUrl": "text",
"colourHex": "text",
"displayOrder": 1,
"active": true
},
"description": "Read one category"
} Responses Status When 200Category returned 404No such category - also returned for one belonging to somebody else, deliberately
PUT Edit a category PUT /budget/category/{reference}
Only your own. Seeded categories are shared by the whole tenant and are fixed.
Headers Name Notes AuthorizationBearer token X-TenantYour tenant X-Environmenttest or live Content-Typeapplication/json
Path parameters Query parameters Name Default ownerTypeOptional ownerReferenceOptional
Example Request body: BudgetCategoryRequest · Response: BudgetCategoryResponse
curl Request Response
Copy curl -X PUT "https://api.bridgemoni.com/budget/category/b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e?ownerType=value&ownerReference=value" \
-H "Authorization: Bearer $BRIDGEMONI_TOKEN" \
-H "X-Tenant: $BRIDGEMONI_TENANT" \
-H "X-Environment: $BRIDGEMONI_ENV" \
-H "Content-Type: application/json" \
-d '{
"code": "text",
"name": "Ada Obi",
"description": "March payroll",
"kind": "EXPENSE",
"parentCategoryReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"iconUrl": "text",
"colourHex": "text",
"displayOrder": 1
}' Copy {
"code": "text",
"name": "Ada Obi",
"description": "March payroll",
"kind": "EXPENSE",
"parentCategoryReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"iconUrl": "text",
"colourHex": "text",
"displayOrder": 1
} Copy {
"data": {
"reference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"code": "text",
"name": "text",
"description": "text",
"kind": "EXPENSE",
"parentCategoryReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"systemProvided": true,
"iconUrl": "text",
"colourHex": "text",
"displayOrder": 1,
"active": true
},
"description": "Edit a category"
} Responses Status When 200Category updated 403A seeded category cannot be edited
POST Record a cash expense POST /budget/expense
For money spent outside the platform. Everything else is recorded for you. A budget that silently ignores cash is not one you can trust.
Headers Name Notes AuthorizationBearer token X-TenantYour tenant X-Environmenttest or live Content-Typeapplication/json
Query parameters Name Default ownerTypeOptional ownerReferenceOptional
Example Request body: ManualExpenseRequest · Response: ExpenseResponse
curl Request Response
Copy curl -X POST "https://api.bridgemoni.com/budget/expense?ownerType=value&ownerReference=value" \
-H "Authorization: Bearer $BRIDGEMONI_TOKEN" \
-H "X-Tenant: $BRIDGEMONI_TENANT" \
-H "X-Environment: $BRIDGEMONI_ENV" \
-H "Content-Type: application/json" \
-d '{
"amount": 250000.0,
"currencyCode": "NGN",
"categoryReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"narrative": "text",
"postingDateTime": "2027-03-14T14:30:01",
"notes": "text",
"receiptDocumentReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e"
}' Copy {
"amount": 250000.0,
"currencyCode": "NGN",
"categoryReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"narrative": "text",
"postingDateTime": "2027-03-14T14:30:01",
"notes": "text",
"receiptDocumentReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e"
} Copy {
"data": {
"reference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"transactionReference": "text",
"parentTransactionReference": "text",
"amount": 250000.0,
"currencyCode": "text",
"transactionType": "text",
"narrative": "text",
"merchantLabel": "text",
"postingDateTime": "2027-03-14T14:30:01",
"categoryReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"categoryCode": "text",
"categoryName": "text",
"categorySource": "RULE",
"appliedRuleReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"internalTransfer": true,
"excludedFromBudget": true,
"manualEntry": true,
"notes": "text",
"receiptDocumentReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"reversedAt": "2027-03-14T14:30:01"
},
"description": "Record a cash expense"
} Responses Status When 200Expense recorded 400A future date, or a non-positive amount 404No such category
DELETE Delete a cash expense DELETE /budget/expense/{reference}
Only one you entered by hand. A recorded payment cannot be deleted - exclude it instead, so your budget and your statement keep saying the same thing.
Headers Name Notes AuthorizationBearer token X-TenantYour tenant X-Environmenttest or live
Path parameters Query parameters Name Default ownerTypeOptional ownerReferenceOptional
Example Response: Void
curl Response
Copy curl -X DELETE "https://api.bridgemoni.com/budget/expense/b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e?ownerType=value&ownerReference=value" \
-H "Authorization: Bearer $BRIDGEMONI_TOKEN" \
-H "X-Tenant: $BRIDGEMONI_TENANT" \
-H "X-Environment: $BRIDGEMONI_ENV" Copy {
"description": "Delete a cash expense"
} Responses Status When 200Expense deleted 409A recorded payment cannot be deleted
GET Read one expense GET /budget/expense/{reference}
Headers Name Notes AuthorizationBearer token X-TenantYour tenant X-Environmenttest or live
Path parameters Query parameters Name Default ownerTypeOptional ownerReferenceOptional
Example Response: ExpenseResponse
curl Response
Copy curl -X GET "https://api.bridgemoni.com/budget/expense/b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e?ownerType=value&ownerReference=value" \
-H "Authorization: Bearer $BRIDGEMONI_TOKEN" \
-H "X-Tenant: $BRIDGEMONI_TENANT" \
-H "X-Environment: $BRIDGEMONI_ENV" Copy {
"data": {
"reference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"transactionReference": "text",
"parentTransactionReference": "text",
"amount": 250000.0,
"currencyCode": "text",
"transactionType": "text",
"narrative": "text",
"merchantLabel": "text",
"postingDateTime": "2027-03-14T14:30:01",
"categoryReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"categoryCode": "text",
"categoryName": "text",
"categorySource": "RULE",
"appliedRuleReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"internalTransfer": true,
"excludedFromBudget": true,
"manualEntry": true,
"notes": "text",
"receiptDocumentReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"reversedAt": "2027-03-14T14:30:01"
},
"description": "Read one expense"
} Responses Status When 200Expense retrieved successfully 400Owner could not be determined 403You cannot act for that owner 404Expense not found
PUT Annotate or exclude an expense PUT /budget/expense/{reference}
Notes, a receipt, and whether it counts towards your budgets. The amount, date and narrative are not editable on a recorded payment - they are what the ledger says happened, and an editable copy would let your budget disagree with your statement.
Headers Name Notes AuthorizationBearer token X-TenantYour tenant X-Environmenttest or live Content-Typeapplication/json
Path parameters Query parameters Name Default ownerTypeOptional ownerReferenceOptional
Example Request body: UpdateExpenseRequest · Response: ExpenseResponse
curl Request Response
Copy curl -X PUT "https://api.bridgemoni.com/budget/expense/b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e?ownerType=value&ownerReference=value" \
-H "Authorization: Bearer $BRIDGEMONI_TOKEN" \
-H "X-Tenant: $BRIDGEMONI_TENANT" \
-H "X-Environment: $BRIDGEMONI_ENV" \
-H "Content-Type: application/json" \
-d '{
"notes": "text",
"receiptDocumentReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"excludedFromBudget": true
}' Copy {
"notes": "text",
"receiptDocumentReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"excludedFromBudget": true
} Copy {
"data": {
"reference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"transactionReference": "text",
"parentTransactionReference": "text",
"amount": 250000.0,
"currencyCode": "text",
"transactionType": "text",
"narrative": "text",
"merchantLabel": "text",
"postingDateTime": "2027-03-14T14:30:01",
"categoryReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"categoryCode": "text",
"categoryName": "text",
"categorySource": "RULE",
"appliedRuleReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"internalTransfer": true,
"excludedFromBudget": true,
"manualEntry": true,
"notes": "text",
"receiptDocumentReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"reversedAt": "2027-03-14T14:30:01"
},
"description": "Annotate or exclude an expense"
} Responses Status When 200Expense updated successfully 400Owner could not be determined 403You cannot act for that owner 404Expense not found
POST File an expense somewhere else POST /budget/expense/{reference}/categorise
Your choice always wins, and nothing the system learns later will overrule it. Ask for a rule and payments to the same place go there automatically from now on; ask for a backfill as well and your recent ones are re-filed too - but only the ones you have not already categorised yourself, and only a bounded number of them. The response says exactly how many moved.
Headers Name Notes AuthorizationBearer token X-TenantYour tenant X-Environmenttest or live Content-Typeapplication/json
Path parameters Query parameters Name Default ownerTypeOptional ownerReferenceOptional
Example Request body: RecategoriseExpenseRequest · Response: RecategoriseExpenseResponse
curl Request Response
Copy curl -X POST "https://api.bridgemoni.com/budget/expense/b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e/categorise?ownerType=value&ownerReference=value" \
-H "Authorization: Bearer $BRIDGEMONI_TOKEN" \
-H "X-Tenant: $BRIDGEMONI_TENANT" \
-H "X-Environment: $BRIDGEMONI_ENV" \
-H "Content-Type: application/json" \
-d '{
"categoryReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"createRule": true,
"backfill": true
}' Copy {
"categoryReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"createRule": true,
"backfill": true
} Copy {
"data": {
"expense": {
"reference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"transactionReference": "text",
"parentTransactionReference": "text",
"amount": 250000.0,
"currencyCode": "text",
"transactionType": "text",
"narrative": "text",
"merchantLabel": "text",
"postingDateTime": "2027-03-14T14:30:01",
"categoryReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"categoryCode": "text",
"categoryName": "text",
"categorySource": "RULE",
"appliedRuleReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"internalTransfer": true,
"excludedFromBudget": true,
"manualEntry": true,
"notes": "text",
"receiptDocumentReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"reversedAt": "2027-03-14T14:30:01"
},
"learnedRuleReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"backfilledCount": 1,
"backfillTruncated": true
},
"description": "File an expense somewhere else"
} Responses Status When 200Expense re-filed 400The category is not an expense category 404No such expense or category
GET List spending GET /budget/expenses
Newest first. Includes internal transfers and anything you have excluded - they are marked rather than hidden, so the list still reconciles against your statement.
Headers Name Notes AuthorizationBearer token X-TenantYour tenant X-Environmenttest or live
Query parameters Name Default ownerTypeOptional ownerReferenceOptional categoryOptional fromOptional toOptional page0 size20
Example Response: PageResponse<ExpenseResponse>
curl Response
Copy curl -X GET "https://api.bridgemoni.com/budget/expenses?ownerType=value&ownerReference=value&category=value&from=value&to=value&page=0&size=20" \
-H "Authorization: Bearer $BRIDGEMONI_TOKEN" \
-H "X-Tenant: $BRIDGEMONI_TENANT" \
-H "X-Environment: $BRIDGEMONI_ENV" Copy {
"data": {
"contents": [
{
"...": "the resource"
}
],
"page": 1,
"size": 1,
"total": 1,
"pages": 1
},
"description": "List spending"
} Responses Status When 200Expenses retrieved successfully 400Owner could not be determined 403You cannot act for that owner
POST Create a savings goal POST /budget/goal
No money moves yet, and no savings account is opened until your first contribution - a goal nobody funds should not leave an empty account behind.
Headers Name Notes AuthorizationBearer token X-TenantYour tenant X-Environmenttest or live Content-Typeapplication/json
Query parameters Name Default ownerTypeOptional ownerReferenceOptional
Example Request body: GoalRequest · Response: GoalResponse
curl Request Response
Copy curl -X POST "https://api.bridgemoni.com/budget/goal?ownerType=value&ownerReference=value" \
-H "Authorization: Bearer $BRIDGEMONI_TOKEN" \
-H "X-Tenant: $BRIDGEMONI_TENANT" \
-H "X-Environment: $BRIDGEMONI_ENV" \
-H "Content-Type: application/json" \
-d '{
"name": "Ada Obi",
"description": "March payroll",
"currencyCode": "NGN",
"targetAmount": 250000.0,
"targetDate": "2027-03-14",
"categoryReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"imageUrl": "text",
"autoContributeAmount": 250000.0,
"autoContributeFrequency": "text",
"priority": 1
}' Copy {
"name": "Ada Obi",
"description": "March payroll",
"currencyCode": "NGN",
"targetAmount": 250000.0,
"targetDate": "2027-03-14",
"categoryReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"imageUrl": "text",
"autoContributeAmount": 250000.0,
"autoContributeFrequency": "text",
"priority": 1
} Copy {
"data": {
"reference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"name": "text",
"description": "text",
"currencyCode": "text",
"targetAmount": 250000.0,
"savedAmount": 250000.0,
"progressPercent": 250000.0,
"remainingAmount": 250000.0,
"targetDate": "2027-03-14",
"requiredMonthlyContribution": 250000.0,
"categoryReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"imageUrl": "text",
"status": "ACTIVE",
"potAccountNumber": "text",
"autoContributeAmount": 250000.0,
"autoContributeFrequency": "text",
"nextContributionDate": "2027-03-14",
"priority": 1,
"achievedAt": "2027-03-14T14:30:01",
"closedAt": "2027-03-14T14:30:01"
},
"description": "Create a savings goal"
} Responses Status When 200Goal created 400A target of zero, or a date in the past 409You already have a goal by that name
GET Read a goal GET /budget/goal/{reference}
With how far along it is and, if you set a target date, what you would need to put aside each month to arrive on time.
Headers Name Notes AuthorizationBearer token X-TenantYour tenant X-Environmenttest or live
Path parameters Query parameters Name Default ownerTypeOptional ownerReferenceOptional
Example Response: GoalResponse
curl Response
Copy curl -X GET "https://api.bridgemoni.com/budget/goal/b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e?ownerType=value&ownerReference=value" \
-H "Authorization: Bearer $BRIDGEMONI_TOKEN" \
-H "X-Tenant: $BRIDGEMONI_TENANT" \
-H "X-Environment: $BRIDGEMONI_ENV" Copy {
"data": {
"reference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"name": "text",
"description": "text",
"currencyCode": "text",
"targetAmount": 250000.0,
"savedAmount": 250000.0,
"progressPercent": 250000.0,
"remainingAmount": 250000.0,
"targetDate": "2027-03-14",
"requiredMonthlyContribution": 250000.0,
"categoryReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"imageUrl": "text",
"status": "ACTIVE",
"potAccountNumber": "text",
"autoContributeAmount": 250000.0,
"autoContributeFrequency": "text",
"nextContributionDate": "2027-03-14",
"priority": 1,
"achievedAt": "2027-03-14T14:30:01",
"closedAt": "2027-03-14T14:30:01"
},
"description": "Read a goal"
} Responses Status When 200Savings goal retrieved successfully 400Owner could not be determined 403You cannot act for that owner 404Savings goal not found
PUT Edit a goal PUT /budget/goal/{reference}
Raising the target on a goal you had already met puts it back in progress - a goal that reports as done while short of its own target would be lying.
Headers Name Notes AuthorizationBearer token X-TenantYour tenant X-Environmenttest or live Content-Typeapplication/json
Path parameters Query parameters Name Default ownerTypeOptional ownerReferenceOptional
Example Request body: GoalRequest · Response: GoalResponse
curl Request Response
Copy curl -X PUT "https://api.bridgemoni.com/budget/goal/b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e?ownerType=value&ownerReference=value" \
-H "Authorization: Bearer $BRIDGEMONI_TOKEN" \
-H "X-Tenant: $BRIDGEMONI_TENANT" \
-H "X-Environment: $BRIDGEMONI_ENV" \
-H "Content-Type: application/json" \
-d '{
"name": "Ada Obi",
"description": "March payroll",
"currencyCode": "NGN",
"targetAmount": 250000.0,
"targetDate": "2027-03-14",
"categoryReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"imageUrl": "text",
"autoContributeAmount": 250000.0,
"autoContributeFrequency": "text",
"priority": 1
}' Copy {
"name": "Ada Obi",
"description": "March payroll",
"currencyCode": "NGN",
"targetAmount": 250000.0,
"targetDate": "2027-03-14",
"categoryReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"imageUrl": "text",
"autoContributeAmount": 250000.0,
"autoContributeFrequency": "text",
"priority": 1
} Copy {
"data": {
"reference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"name": "text",
"description": "text",
"currencyCode": "text",
"targetAmount": 250000.0,
"savedAmount": 250000.0,
"progressPercent": 250000.0,
"remainingAmount": 250000.0,
"targetDate": "2027-03-14",
"requiredMonthlyContribution": 250000.0,
"categoryReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"imageUrl": "text",
"status": "ACTIVE",
"potAccountNumber": "text",
"autoContributeAmount": 250000.0,
"autoContributeFrequency": "text",
"nextContributionDate": "2027-03-14",
"priority": 1,
"achievedAt": "2027-03-14T14:30:01",
"closedAt": "2027-03-14T14:30:01"
},
"description": "Edit a goal"
} Responses Status When 200Savings goal updated successfully 400Owner could not be determined; Goal target is invalid 403You cannot act for that owner 404Savings goal not found 409A goal with that name already exists; Goal cannot move to that state
POST Abandon a goal POST /budget/goal/{reference}/cancel
Everything it holds goes back to your main account first. Terminal - the goal never runs again.
Headers Name Notes AuthorizationBearer token X-TenantYour tenant X-Environmenttest or live
Path parameters Query parameters Name Default ownerTypeOptional ownerReferenceOptional
Example Response: GoalResponse
curl Response
Copy curl -X POST "https://api.bridgemoni.com/budget/goal/b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e/cancel?ownerType=value&ownerReference=value" \
-H "Authorization: Bearer $BRIDGEMONI_TOKEN" \
-H "X-Tenant: $BRIDGEMONI_TENANT" \
-H "X-Environment: $BRIDGEMONI_ENV" Copy {
"data": {
"reference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"name": "text",
"description": "text",
"currencyCode": "text",
"targetAmount": 250000.0,
"savedAmount": 250000.0,
"progressPercent": 250000.0,
"remainingAmount": 250000.0,
"targetDate": "2027-03-14",
"requiredMonthlyContribution": 250000.0,
"categoryReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"imageUrl": "text",
"status": "ACTIVE",
"potAccountNumber": "text",
"autoContributeAmount": 250000.0,
"autoContributeFrequency": "text",
"nextContributionDate": "2027-03-14",
"priority": 1,
"achievedAt": "2027-03-14T14:30:01",
"closedAt": "2027-03-14T14:30:01"
},
"description": "Abandon a goal"
} Responses Status When 200Goal abandoned and its money returned 409It is already closed
POST Put money into a goal POST /budget/goal/{reference}/contribute
Moves money out of your main account. Send an Idempotency-Key header: this posts a real transfer, and a retry without one moves the money twice. Your savings account is opened on the first contribution.
Headers Name Notes AuthorizationBearer token X-TenantYour tenant X-Environmenttest or live Idempotency-KeyReuse the same value on every retry of this request Content-Typeapplication/json
Path parameters Query parameters Name Default ownerTypeOptional ownerReferenceOptional
Example Request body: GoalContributionRequest · Response: GoalResponse
curl Request Response
Copy curl -X POST "https://api.bridgemoni.com/budget/goal/b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e/contribute?ownerType=value&ownerReference=value" \
-H "Authorization: Bearer $BRIDGEMONI_TOKEN" \
-H "X-Tenant: $BRIDGEMONI_TENANT" \
-H "X-Environment: $BRIDGEMONI_ENV" \
-H "Idempotency-Key: a-unique-key-per-intent" \
-H "Content-Type: application/json" \
-d '{
"amount": 250000.0,
"currencyCode": "NGN",
"note": "text"
}' Copy {
"amount": 250000.0,
"currencyCode": "NGN",
"note": "text"
} Copy {
"data": {
"reference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"name": "text",
"description": "text",
"currencyCode": "text",
"targetAmount": 250000.0,
"savedAmount": 250000.0,
"progressPercent": 250000.0,
"remainingAmount": 250000.0,
"targetDate": "2027-03-14",
"requiredMonthlyContribution": 250000.0,
"categoryReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"imageUrl": "text",
"status": "ACTIVE",
"potAccountNumber": "text",
"autoContributeAmount": 250000.0,
"autoContributeFrequency": "text",
"nextContributionDate": "2027-03-14",
"priority": 1,
"achievedAt": "2027-03-14T14:30:01",
"closedAt": "2027-03-14T14:30:01"
},
"description": "Put money into a goal"
} Responses Status When 200Money moved 400A non-positive amount, or the wrong currency 404You have no main account in that currency 409The goal is paused, cancelled or withdrawn
GET List a goal's movements GET /budget/goal/{reference}/contributions
Newest first, each naming the transfer it rode on.
Headers Name Notes AuthorizationBearer token X-TenantYour tenant X-Environmenttest or live
Path parameters Query parameters Name Default ownerTypeOptional ownerReferenceOptional page0 size20
Example Response: PageResponse<GoalContributionResponse>
curl Response
Copy curl -X GET "https://api.bridgemoni.com/budget/goal/b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e/contributions?ownerType=value&ownerReference=value&page=0&size=20" \
-H "Authorization: Bearer $BRIDGEMONI_TOKEN" \
-H "X-Tenant: $BRIDGEMONI_TENANT" \
-H "X-Environment: $BRIDGEMONI_ENV" Copy {
"data": {
"contents": [
{
"...": "the resource"
}
],
"page": 1,
"size": 1,
"total": 1,
"pages": 1
},
"description": "List a goal's movements"
} Responses Status When 200Goal contributions retrieved successfully 400Owner could not be determined 403You cannot act for that owner 404Savings goal not found
POST Pause a goal POST /budget/goal/{reference}/pause
Stops any scheduled contributions. The money stays where it is - pausing does not empty the goal.
Headers Name Notes AuthorizationBearer token X-TenantYour tenant X-Environmenttest or live
Path parameters Query parameters Name Default ownerTypeOptional ownerReferenceOptional
Example Response: GoalResponse
curl Response
Copy curl -X POST "https://api.bridgemoni.com/budget/goal/b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e/pause?ownerType=value&ownerReference=value" \
-H "Authorization: Bearer $BRIDGEMONI_TOKEN" \
-H "X-Tenant: $BRIDGEMONI_TENANT" \
-H "X-Environment: $BRIDGEMONI_ENV" Copy {
"data": {
"reference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"name": "text",
"description": "text",
"currencyCode": "text",
"targetAmount": 250000.0,
"savedAmount": 250000.0,
"progressPercent": 250000.0,
"remainingAmount": 250000.0,
"targetDate": "2027-03-14",
"requiredMonthlyContribution": 250000.0,
"categoryReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"imageUrl": "text",
"status": "ACTIVE",
"potAccountNumber": "text",
"autoContributeAmount": 250000.0,
"autoContributeFrequency": "text",
"nextContributionDate": "2027-03-14",
"priority": 1,
"achievedAt": "2027-03-14T14:30:01",
"closedAt": "2027-03-14T14:30:01"
},
"description": "Pause a goal"
} Responses Status When 200Savings goal paused successfully 400Owner could not be determined 403You cannot act for that owner 404Savings goal not found 409Goal cannot move to that state
POST Resume a paused goal POST /budget/goal/{reference}/resume
Headers Name Notes AuthorizationBearer token X-TenantYour tenant X-Environmenttest or live
Path parameters Query parameters Name Default ownerTypeOptional ownerReferenceOptional
Example Response: GoalResponse
curl Response
Copy curl -X POST "https://api.bridgemoni.com/budget/goal/b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e/resume?ownerType=value&ownerReference=value" \
-H "Authorization: Bearer $BRIDGEMONI_TOKEN" \
-H "X-Tenant: $BRIDGEMONI_TENANT" \
-H "X-Environment: $BRIDGEMONI_ENV" Copy {
"data": {
"reference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"name": "text",
"description": "text",
"currencyCode": "text",
"targetAmount": 250000.0,
"savedAmount": 250000.0,
"progressPercent": 250000.0,
"remainingAmount": 250000.0,
"targetDate": "2027-03-14",
"requiredMonthlyContribution": 250000.0,
"categoryReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"imageUrl": "text",
"status": "ACTIVE",
"potAccountNumber": "text",
"autoContributeAmount": 250000.0,
"autoContributeFrequency": "text",
"nextContributionDate": "2027-03-14",
"priority": 1,
"achievedAt": "2027-03-14T14:30:01",
"closedAt": "2027-03-14T14:30:01"
},
"description": "Resume a paused goal"
} Responses Status When 200Savings goal resumed successfully 400Owner could not be determined 403You cannot act for that owner 404Savings goal not found 409Goal cannot move to that state
POST Take money back out of a goal POST /budget/goal/{reference}/withdraw
Refused for more than this goal holds, even when your savings account has more in it - the rest belongs to your other goals.
Headers Name Notes AuthorizationBearer token X-TenantYour tenant X-Environmenttest or live Idempotency-KeyReuse the same value on every retry of this request Content-Typeapplication/json
Path parameters Query parameters Name Default ownerTypeOptional ownerReferenceOptional
Example Request body: GoalContributionRequest · Response: GoalResponse
curl Request Response
Copy curl -X POST "https://api.bridgemoni.com/budget/goal/b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e/withdraw?ownerType=value&ownerReference=value" \
-H "Authorization: Bearer $BRIDGEMONI_TOKEN" \
-H "X-Tenant: $BRIDGEMONI_TENANT" \
-H "X-Environment: $BRIDGEMONI_ENV" \
-H "Idempotency-Key: a-unique-key-per-intent" \
-H "Content-Type: application/json" \
-d '{
"amount": 250000.0,
"currencyCode": "NGN",
"note": "text"
}' Copy {
"amount": 250000.0,
"currencyCode": "NGN",
"note": "text"
} Copy {
"data": {
"reference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"name": "text",
"description": "text",
"currencyCode": "text",
"targetAmount": 250000.0,
"savedAmount": 250000.0,
"progressPercent": 250000.0,
"remainingAmount": 250000.0,
"targetDate": "2027-03-14",
"requiredMonthlyContribution": 250000.0,
"categoryReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"imageUrl": "text",
"status": "ACTIVE",
"potAccountNumber": "text",
"autoContributeAmount": 250000.0,
"autoContributeFrequency": "text",
"nextContributionDate": "2027-03-14",
"priority": 1,
"achievedAt": "2027-03-14T14:30:01",
"closedAt": "2027-03-14T14:30:01"
},
"description": "Take money back out of a goal"
} Responses Status When 200Money moved back 409This goal does not hold that much
GET List savings goals GET /budget/goals
In your chosen order.
Headers Name Notes AuthorizationBearer token X-TenantYour tenant X-Environmenttest or live
Query parameters Name Default ownerTypeOptional ownerReferenceOptional statusOptional page0 size20
Example Response: PageResponse<GoalResponse>
curl Response
Copy curl -X GET "https://api.bridgemoni.com/budget/goals?ownerType=value&ownerReference=value&status=value&page=0&size=20" \
-H "Authorization: Bearer $BRIDGEMONI_TOKEN" \
-H "X-Tenant: $BRIDGEMONI_TENANT" \
-H "X-Environment: $BRIDGEMONI_ENV" Copy {
"data": {
"contents": [
{
"...": "the resource"
}
],
"page": 1,
"size": 1,
"total": 1,
"pages": 1
},
"description": "List savings goals"
} POST Record income received outside the platform POST /budget/income
Cash, or money paid to an account this platform does not see.
Headers Name Notes AuthorizationBearer token X-TenantYour tenant X-Environmenttest or live Content-Typeapplication/json
Query parameters Name Default ownerTypeOptional ownerReferenceOptional
Example Request body: ManualIncomeRequest · Response: IncomeResponse
curl Request Response
Copy curl -X POST "https://api.bridgemoni.com/budget/income?ownerType=value&ownerReference=value" \
-H "Authorization: Bearer $BRIDGEMONI_TOKEN" \
-H "X-Tenant: $BRIDGEMONI_TENANT" \
-H "X-Environment: $BRIDGEMONI_ENV" \
-H "Content-Type: application/json" \
-d '{
"amount": 250000.0,
"currencyCode": "NGN",
"categoryReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"narrative": "text",
"postingDateTime": "2027-03-14T14:30:01",
"incomeSource": "text",
"notes": "text"
}' Copy {
"amount": 250000.0,
"currencyCode": "NGN",
"categoryReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"narrative": "text",
"postingDateTime": "2027-03-14T14:30:01",
"incomeSource": "text",
"notes": "text"
} Copy {
"data": {
"reference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"transactionReference": "text",
"amount": 250000.0,
"currencyCode": "text",
"transactionType": "text",
"narrative": "text",
"merchantLabel": "text",
"postingDateTime": "2027-03-14T14:30:01",
"categoryReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"categoryCode": "text",
"categoryName": "text",
"categorySource": "RULE",
"incomeSource": "text",
"recurring": true,
"expectedDayOfMonth": 1,
"internalTransfer": true,
"excludedFromBudget": true,
"manualEntry": true,
"notes": "text",
"reversedAt": "2027-03-14T14:30:01"
},
"description": "Record income received outside the platform"
} Responses Status When 200Income recorded 400A future date, or a non-positive amount 404No such category
DELETE Delete a manually recorded income entry DELETE /budget/income/{reference}
Only one you entered by hand. A recorded credit cannot be deleted.
Headers Name Notes AuthorizationBearer token X-TenantYour tenant X-Environmenttest or live
Path parameters Query parameters Name Default ownerTypeOptional ownerReferenceOptional
Example Response: Void
curl Response
Copy curl -X DELETE "https://api.bridgemoni.com/budget/income/b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e?ownerType=value&ownerReference=value" \
-H "Authorization: Bearer $BRIDGEMONI_TOKEN" \
-H "X-Tenant: $BRIDGEMONI_TENANT" \
-H "X-Environment: $BRIDGEMONI_ENV" Copy {
"description": "Delete a manually recorded income entry"
} Responses Status When 200Income deleted 409A recorded credit cannot be deleted
GET Read one income record GET /budget/income/{reference}
Headers Name Notes AuthorizationBearer token X-TenantYour tenant X-Environmenttest or live
Path parameters Query parameters Name Default ownerTypeOptional ownerReferenceOptional
Example Response: IncomeResponse
curl Response
Copy curl -X GET "https://api.bridgemoni.com/budget/income/b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e?ownerType=value&ownerReference=value" \
-H "Authorization: Bearer $BRIDGEMONI_TOKEN" \
-H "X-Tenant: $BRIDGEMONI_TENANT" \
-H "X-Environment: $BRIDGEMONI_ENV" Copy {
"data": {
"reference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"transactionReference": "text",
"amount": 250000.0,
"currencyCode": "text",
"transactionType": "text",
"narrative": "text",
"merchantLabel": "text",
"postingDateTime": "2027-03-14T14:30:01",
"categoryReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"categoryCode": "text",
"categoryName": "text",
"categorySource": "RULE",
"incomeSource": "text",
"recurring": true,
"expectedDayOfMonth": 1,
"internalTransfer": true,
"excludedFromBudget": true,
"manualEntry": true,
"notes": "text",
"reversedAt": "2027-03-14T14:30:01"
},
"description": "Read one income record"
} Responses Status When 200Income retrieved successfully 400Owner could not be determined 403You cannot act for that owner 404Income entry not found
PUT Edit an income record PUT /budget/income/{reference}
Its category, what kind of income it is, notes, and whether it counts towards your cashflow. The amount and date of a recorded credit are not editable.
Headers Name Notes AuthorizationBearer token X-TenantYour tenant X-Environmenttest or live Content-Typeapplication/json
Path parameters Query parameters Name Default ownerTypeOptional ownerReferenceOptional
Example Request body: UpdateIncomeRequest · Response: IncomeResponse
curl Request Response
Copy curl -X PUT "https://api.bridgemoni.com/budget/income/b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e?ownerType=value&ownerReference=value" \
-H "Authorization: Bearer $BRIDGEMONI_TOKEN" \
-H "X-Tenant: $BRIDGEMONI_TENANT" \
-H "X-Environment: $BRIDGEMONI_ENV" \
-H "Content-Type: application/json" \
-d '{
"categoryReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"incomeSource": "text",
"notes": "text",
"excludedFromBudget": true
}' Copy {
"categoryReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"incomeSource": "text",
"notes": "text",
"excludedFromBudget": true
} Copy {
"data": {
"reference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"transactionReference": "text",
"amount": 250000.0,
"currencyCode": "text",
"transactionType": "text",
"narrative": "text",
"merchantLabel": "text",
"postingDateTime": "2027-03-14T14:30:01",
"categoryReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"categoryCode": "text",
"categoryName": "text",
"categorySource": "RULE",
"incomeSource": "text",
"recurring": true,
"expectedDayOfMonth": 1,
"internalTransfer": true,
"excludedFromBudget": true,
"manualEntry": true,
"notes": "text",
"reversedAt": "2027-03-14T14:30:01"
},
"description": "Edit an income record"
} Responses Status When 200Income updated successfully 400Owner could not be determined; Category is the wrong kind 403You cannot act for that owner 404Category not found; Income entry not found
GET List income GET /budget/incomes
Newest first.
Headers Name Notes AuthorizationBearer token X-TenantYour tenant X-Environmenttest or live
Query parameters Name Default ownerTypeOptional ownerReferenceOptional fromOptional toOptional page0 size20
Example Response: PageResponse<IncomeResponse>
curl Response
Copy curl -X GET "https://api.bridgemoni.com/budget/incomes?ownerType=value&ownerReference=value&from=value&to=value&page=0&size=20" \
-H "Authorization: Bearer $BRIDGEMONI_TOKEN" \
-H "X-Tenant: $BRIDGEMONI_TENANT" \
-H "X-Environment: $BRIDGEMONI_ENV" Copy {
"data": {
"contents": [
{
"...": "the resource"
}
],
"page": 1,
"size": 1,
"total": 1,
"pages": 1
},
"description": "List income"
} Responses Status When 200Income retrieved successfully 400Owner could not be determined 403You cannot act for that owner
GET Read budget settings GET /budget/profile
Returns the owner's budget settings, creating them with their defaults if this is the first time anyone has asked. Never 404s for a person who has simply never used the module.
Headers Name Notes AuthorizationBearer token X-TenantYour tenant X-Environmenttest or live
Query parameters Name Default ownerTypeOptional ownerReferenceOptional
Example Response: BudgetProfileResponse
curl Response
Copy curl -X GET "https://api.bridgemoni.com/budget/profile?ownerType=value&ownerReference=value" \
-H "Authorization: Bearer $BRIDGEMONI_TOKEN" \
-H "X-Tenant: $BRIDGEMONI_TENANT" \
-H "X-Environment: $BRIDGEMONI_ENV" Copy {
"data": {
"reference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"ownerType": "USER",
"ownerReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"baseCurrencyCode": "text",
"cycleStartDay": 1,
"weekStartsOn": 1,
"autoCategorisationEnabled": true,
"countSavingsAsExpense": true,
"includeInternalTransfers": true
},
"description": "Read budget settings"
} Responses Status When 200Settings returned 403The caller may not act for that owner
PUT Change budget settings PUT /budget/profile
Every field is optional. An omitted field is left as it is rather than reset, so a client that knows about one setting cannot silently clear the others.
Headers Name Notes AuthorizationBearer token X-TenantYour tenant X-Environmenttest or live Content-Typeapplication/json
Query parameters Name Default ownerTypeOptional ownerReferenceOptional
Example Request body: BudgetProfileRequest · Response: BudgetProfileResponse
curl Request Response
Copy curl -X PUT "https://api.bridgemoni.com/budget/profile?ownerType=value&ownerReference=value" \
-H "Authorization: Bearer $BRIDGEMONI_TOKEN" \
-H "X-Tenant: $BRIDGEMONI_TENANT" \
-H "X-Environment: $BRIDGEMONI_ENV" \
-H "Content-Type: application/json" \
-d '{
"baseCurrencyCode": "NGN",
"cycleStartDay": 1,
"weekStartsOn": 1,
"autoCategorisationEnabled": true,
"countSavingsAsExpense": true,
"includeInternalTransfers": true
}' Copy {
"baseCurrencyCode": "NGN",
"cycleStartDay": 1,
"weekStartsOn": 1,
"autoCategorisationEnabled": true,
"countSavingsAsExpense": true,
"includeInternalTransfers": true
} Copy {
"data": {
"reference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"ownerType": "USER",
"ownerReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"baseCurrencyCode": "text",
"cycleStartDay": 1,
"weekStartsOn": 1,
"autoCategorisationEnabled": true,
"countSavingsAsExpense": true,
"includeInternalTransfers": true
},
"description": "Change budget settings"
} Responses Status When 200Settings updated 400A cycle day or week start outside its range 403The caller may not act for that owner
POST Create a rule POST /budget/rule
The match value has to fit the match type: a known transaction type, an account reference, a keyword of at least three characters, a merchant label, or "min:max" for an amount window. A value that could never match is refused rather than accepted and silently ignored.
Headers Name Notes AuthorizationBearer token X-TenantYour tenant X-Environmenttest or live Content-Typeapplication/json
Query parameters Name Default ownerTypeOptional ownerReferenceOptional
Example Request body: CategorisationRuleRequest · Response: CategorisationRuleResponse
curl Request Response
Copy curl -X POST "https://api.bridgemoni.com/budget/rule?ownerType=value&ownerReference=value" \
-H "Authorization: Bearer $BRIDGEMONI_TOKEN" \
-H "X-Tenant: $BRIDGEMONI_TENANT" \
-H "X-Environment: $BRIDGEMONI_ENV" \
-H "Content-Type: application/json" \
-d '{
"matchType": "VALUE",
"matchValue": "text",
"categoryReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"priority": 1,
"active": true
}' Copy {
"matchType": "VALUE",
"matchValue": "text",
"categoryReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"priority": 1,
"active": true
} Copy {
"data": {
"reference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"matchType": "VALUE",
"matchValue": "text",
"categoryReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"categoryCode": "text",
"categoryName": "text",
"priority": 1,
"source": "SYSTEM",
"active": true,
"hitCount": 1,
"lastMatchedAt": "2027-03-14T14:30:01",
"learnedFromExpenseReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e"
},
"description": "Create a rule"
} Responses Status When 200Rule created 400The match value does not fit the match type 409You already have a rule matching that
POST Try a rule before saving it POST /budget/rule/preview
Runs the rule against your recent spending and reports what it would have claimed, without writing anything. Worth doing: the failure mode of a rule is silence - one that is too broad quietly swallows half the month, and one that never matches looks exactly like the feature being broken. Compare matchCount against examinedCount to tell the two apart.
Headers Name Notes AuthorizationBearer token X-TenantYour tenant X-Environmenttest or live Content-Typeapplication/json
Query parameters Name Default ownerTypeOptional ownerReferenceOptional
Example Request body: CategorisationRuleRequest · Response: RulePreviewResponse
curl Request Response
Copy curl -X POST "https://api.bridgemoni.com/budget/rule/preview?ownerType=value&ownerReference=value" \
-H "Authorization: Bearer $BRIDGEMONI_TOKEN" \
-H "X-Tenant: $BRIDGEMONI_TENANT" \
-H "X-Environment: $BRIDGEMONI_ENV" \
-H "Content-Type: application/json" \
-d '{
"matchType": "VALUE",
"matchValue": "text",
"categoryReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"priority": 1,
"active": true
}' Copy {
"matchType": "VALUE",
"matchValue": "text",
"categoryReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"priority": 1,
"active": true
} Copy {
"data": {
"matchCount": 1,
"examinedCount": 1,
"alreadyCategorisedByHandCount": 1,
"matches": [
{
"expenseReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"narrative": "text",
"merchantLabel": "text",
"amount": 250000.0,
"postingDateTime": "2027-03-14T14:30:01",
"currentCategoryCode": "text",
"wouldChange": true
}
],
"expenseReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"narrative": "text",
"merchantLabel": "text",
"amount": 250000.0,
"postingDateTime": "2027-03-14T14:30:01",
"currentCategoryCode": "text",
"wouldChange": true
},
"description": "Try a rule before saving it"
} Responses Status When 200Preview computed; nothing was saved 400The match value does not fit the match type
DELETE Delete a rule DELETE /budget/rule/{reference}
Really deleted, unlike a category. Nothing depends on a rule - the spending it classified already stores its category - so removing it changes nothing already filed.
Headers Name Notes AuthorizationBearer token X-TenantYour tenant X-Environmenttest or live
Path parameters Query parameters Name Default ownerTypeOptional ownerReferenceOptional
Example Response: Void
curl Response
Copy curl -X DELETE "https://api.bridgemoni.com/budget/rule/b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e?ownerType=value&ownerReference=value" \
-H "Authorization: Bearer $BRIDGEMONI_TOKEN" \
-H "X-Tenant: $BRIDGEMONI_TENANT" \
-H "X-Environment: $BRIDGEMONI_ENV" Copy {
"description": "Delete a rule"
} Responses Status When 200Categorisation rule deleted successfully 400Owner could not be determined 403You cannot act for that owner; System rules cannot be changed 404Categorisation rule not found
GET Read one rule GET /budget/rule/{reference}
Headers Name Notes AuthorizationBearer token X-TenantYour tenant X-Environmenttest or live
Path parameters Query parameters Name Default ownerTypeOptional ownerReferenceOptional
Example Response: CategorisationRuleResponse
curl Response
Copy curl -X GET "https://api.bridgemoni.com/budget/rule/b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e?ownerType=value&ownerReference=value" \
-H "Authorization: Bearer $BRIDGEMONI_TOKEN" \
-H "X-Tenant: $BRIDGEMONI_TENANT" \
-H "X-Environment: $BRIDGEMONI_ENV" Copy {
"data": {
"reference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"matchType": "VALUE",
"matchValue": "text",
"categoryReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"categoryCode": "text",
"categoryName": "text",
"priority": 1,
"source": "SYSTEM",
"active": true,
"hitCount": 1,
"lastMatchedAt": "2027-03-14T14:30:01",
"learnedFromExpenseReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e"
},
"description": "Read one rule"
} Responses Status When 200Categorisation rule retrieved successfully 400Owner could not be determined 403You cannot act for that owner 404Categorisation rule not found
PUT Edit a rule PUT /budget/rule/{reference}
Headers Name Notes AuthorizationBearer token X-TenantYour tenant X-Environmenttest or live Content-Typeapplication/json
Path parameters Query parameters Name Default ownerTypeOptional ownerReferenceOptional
Example Request body: CategorisationRuleRequest · Response: CategorisationRuleResponse
curl Request Response
Copy curl -X PUT "https://api.bridgemoni.com/budget/rule/b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e?ownerType=value&ownerReference=value" \
-H "Authorization: Bearer $BRIDGEMONI_TOKEN" \
-H "X-Tenant: $BRIDGEMONI_TENANT" \
-H "X-Environment: $BRIDGEMONI_ENV" \
-H "Content-Type: application/json" \
-d '{
"matchType": "VALUE",
"matchValue": "text",
"categoryReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"priority": 1,
"active": true
}' Copy {
"matchType": "VALUE",
"matchValue": "text",
"categoryReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"priority": 1,
"active": true
} Copy {
"data": {
"reference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"matchType": "VALUE",
"matchValue": "text",
"categoryReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"categoryCode": "text",
"categoryName": "text",
"priority": 1,
"source": "SYSTEM",
"active": true,
"hitCount": 1,
"lastMatchedAt": "2027-03-14T14:30:01",
"learnedFromExpenseReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e"
},
"description": "Edit a rule"
} Responses Status When 200Rule updated 403A seeded rule cannot be edited
GET List your rules GET /budget/rules
In evaluation order. Includes rules learned from your own corrections, marked LEARNED, with the expense that taught each one. The tenant's seeded chain is not listed - it is not yours.
Headers Name Notes AuthorizationBearer token X-TenantYour tenant X-Environmenttest or live
Query parameters Name Default ownerTypeOptional ownerReferenceOptional
Example Response: List<CategorisationRuleResponse>
curl Response
Copy curl -X GET "https://api.bridgemoni.com/budget/rules?ownerType=value&ownerReference=value" \
-H "Authorization: Bearer $BRIDGEMONI_TOKEN" \
-H "X-Tenant: $BRIDGEMONI_TENANT" \
-H "X-Environment: $BRIDGEMONI_ENV" Copy {
"data": [
{
"reference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"matchType": "VALUE",
"matchValue": "text",
"categoryReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"categoryCode": "text",
"categoryName": "text",
"priority": 1,
"source": "SYSTEM",
"active": true,
"hitCount": 1,
"lastMatchedAt": "2027-03-14T14:30:01",
"learnedFromExpenseReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e"
}
],
"description": "List your rules"
} Responses Status When 200Categorisation rules retrieved successfully 400Owner could not be determined 403You cannot act for that owner
GET Read a budget GET /budget/{reference}
With the cycle in progress: what you have spent, what is left, and what the cycle is on course to total if you carry on at this rate.
Headers Name Notes AuthorizationBearer token X-TenantYour tenant X-Environmenttest or live
Path parameters Query parameters Name Default ownerTypeOptional ownerReferenceOptional
Example Response: BudgetResponse
curl Response
Copy curl -X GET "https://api.bridgemoni.com/budget/b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e?ownerType=value&ownerReference=value" \
-H "Authorization: Bearer $BRIDGEMONI_TOKEN" \
-H "X-Tenant: $BRIDGEMONI_TENANT" \
-H "X-Environment: $BRIDGEMONI_ENV" Copy {
"data": {
"reference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"name": "text",
"description": "text",
"currencyCode": "text",
"periodType": "DAILY",
"startDate": "2027-03-14",
"endDate": "2027-03-14",
"limitAmount": 250000.0,
"rolloverMode": "NONE",
"alertThresholds": [
1
],
"enforcementMode": "text",
"enforcedAccountReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"status": "DRAFT",
"includeInternalTransfers": true,
"categoryScoped": true,
"categories": [
{
"categoryReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"categoryCode": "text",
"categoryName": "text",
"allocationAmount": 250000.0
}
],
"currentPeriod": {
"reference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"periodKey": "text",
"periodStart": "2027-03-14T14:30:01",
"periodEnd": "2027-03-14T14:30:01",
"limitAmount": 250000.0,
"carriedInAmount": 250000.0,
"spentAmount": 250000.0,
"remainingAmount": 250000.0,
"utilisationPercent": 250000.0,
"projectedSpendAmount": 250000.0,
"transactionCount": 1,
"status": "text",
"highestThresholdNotified": 1,
"closedAt": "2027-03-14T14:30:01",
"restatedAt": "2027-03-14T14:30:01",
"categories": [
{
"...": "nested"
}
],
"categoryReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"categoryCode": "text",
"categoryName": "text",
"allocationAmount": 250000.0
},
"categoryReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"categoryCode": "text",
"categoryName": "text",
"allocationAmount": 250000.0
},
"description": "Read a budget"
} Responses Status When 200Budget retrieved successfully 400Owner could not be determined 403You cannot act for that owner 404Budget not found
PUT Edit a budget PUT /budget/{reference}
A changed limit applies from the next cycle, not the one you are in. The cycle in progress fixed its cap when it opened, and moving it now would make a warning you have already had look wrong.
Headers Name Notes AuthorizationBearer token X-TenantYour tenant X-Environmenttest or live Content-Typeapplication/json
Path parameters Query parameters Name Default ownerTypeOptional ownerReferenceOptional
Example Request body: BudgetRequest · Response: BudgetResponse
curl Request Response
Copy curl -X PUT "https://api.bridgemoni.com/budget/b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e?ownerType=value&ownerReference=value" \
-H "Authorization: Bearer $BRIDGEMONI_TOKEN" \
-H "X-Tenant: $BRIDGEMONI_TENANT" \
-H "X-Environment: $BRIDGEMONI_ENV" \
-H "Content-Type: application/json" \
-d '{
"name": "Ada Obi",
"description": "March payroll",
"currencyCode": "NGN",
"periodType": "DAILY",
"startDate": "2027-03-14",
"endDate": "2027-03-14",
"limitAmount": 250000.0,
"rolloverMode": "NONE",
"alertThresholds": [
1
],
"categories": [
{
"categoryReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"allocationAmount": 250000.0
}
],
"includeInternalTransfers": true,
"enforcementMode": "text",
"enforcedAccountReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"categoryReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"allocationAmount": 250000.0
}' Copy {
"name": "Ada Obi",
"description": "March payroll",
"currencyCode": "NGN",
"periodType": "DAILY",
"startDate": "2027-03-14",
"endDate": "2027-03-14",
"limitAmount": 250000.0,
"rolloverMode": "NONE",
"alertThresholds": [
1
],
"categories": [
{
"categoryReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"allocationAmount": 250000.0
}
],
"includeInternalTransfers": true,
"enforcementMode": "text",
"enforcedAccountReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"categoryReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"allocationAmount": 250000.0
} Copy {
"data": {
"reference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"name": "text",
"description": "text",
"currencyCode": "text",
"periodType": "DAILY",
"startDate": "2027-03-14",
"endDate": "2027-03-14",
"limitAmount": 250000.0,
"rolloverMode": "NONE",
"alertThresholds": [
1
],
"enforcementMode": "text",
"enforcedAccountReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"status": "DRAFT",
"includeInternalTransfers": true,
"categoryScoped": true,
"categories": [
{
"categoryReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"categoryCode": "text",
"categoryName": "text",
"allocationAmount": 250000.0
}
],
"currentPeriod": {
"reference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"periodKey": "text",
"periodStart": "2027-03-14T14:30:01",
"periodEnd": "2027-03-14T14:30:01",
"limitAmount": 250000.0,
"carriedInAmount": 250000.0,
"spentAmount": 250000.0,
"remainingAmount": 250000.0,
"utilisationPercent": 250000.0,
"projectedSpendAmount": 250000.0,
"transactionCount": 1,
"status": "text",
"highestThresholdNotified": 1,
"closedAt": "2027-03-14T14:30:01",
"restatedAt": "2027-03-14T14:30:01",
"categories": [
{
"...": "nested"
}
],
"categoryReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"categoryCode": "text",
"categoryName": "text",
"allocationAmount": 250000.0
},
"categoryReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"categoryCode": "text",
"categoryName": "text",
"allocationAmount": 250000.0
},
"description": "Edit a budget"
} Responses Status When 200Budget updated successfully 400An account is required to enforce this budget; Budget limit is invalid; Owner could not be determined; Category is the wrong kind 403You cannot act for that owner 404Budget not found; Category not found; Limit rule not found 409A budget with that name already exists; This budget cannot be enforced; Budget cannot move to that state
POST Start a budget counting POST /budget/{reference}/activate
Opens the cycle covering today, so it starts tracking immediately.
Headers Name Notes AuthorizationBearer token X-TenantYour tenant X-Environmenttest or live
Path parameters Query parameters Name Default ownerTypeOptional ownerReferenceOptional
Example Response: BudgetResponse
curl Response
Copy curl -X POST "https://api.bridgemoni.com/budget/b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e/activate?ownerType=value&ownerReference=value" \
-H "Authorization: Bearer $BRIDGEMONI_TOKEN" \
-H "X-Tenant: $BRIDGEMONI_TENANT" \
-H "X-Environment: $BRIDGEMONI_ENV" Copy {
"data": {
"reference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"name": "text",
"description": "text",
"currencyCode": "text",
"periodType": "DAILY",
"startDate": "2027-03-14",
"endDate": "2027-03-14",
"limitAmount": 250000.0,
"rolloverMode": "NONE",
"alertThresholds": [
1
],
"enforcementMode": "text",
"enforcedAccountReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"status": "DRAFT",
"includeInternalTransfers": true,
"categoryScoped": true,
"categories": [
{
"categoryReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"categoryCode": "text",
"categoryName": "text",
"allocationAmount": 250000.0
}
],
"currentPeriod": {
"reference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"periodKey": "text",
"periodStart": "2027-03-14T14:30:01",
"periodEnd": "2027-03-14T14:30:01",
"limitAmount": 250000.0,
"carriedInAmount": 250000.0,
"spentAmount": 250000.0,
"remainingAmount": 250000.0,
"utilisationPercent": 250000.0,
"projectedSpendAmount": 250000.0,
"transactionCount": 1,
"status": "text",
"highestThresholdNotified": 1,
"closedAt": "2027-03-14T14:30:01",
"restatedAt": "2027-03-14T14:30:01",
"categories": [
{
"...": "nested"
}
],
"categoryReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"categoryCode": "text",
"categoryName": "text",
"allocationAmount": 250000.0
},
"categoryReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"categoryCode": "text",
"categoryName": "text",
"allocationAmount": 250000.0
},
"description": "Start a budget counting"
} Responses Status When 200Budget activated 409It is archived, or already running
POST Retire a budget POST /budget/{reference}/archive
Terminal. Its history stays readable, but it never runs again.
Headers Name Notes AuthorizationBearer token X-TenantYour tenant X-Environmenttest or live
Path parameters Query parameters Name Default ownerTypeOptional ownerReferenceOptional
Example Response: BudgetResponse
curl Response
Copy curl -X POST "https://api.bridgemoni.com/budget/b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e/archive?ownerType=value&ownerReference=value" \
-H "Authorization: Bearer $BRIDGEMONI_TOKEN" \
-H "X-Tenant: $BRIDGEMONI_TENANT" \
-H "X-Environment: $BRIDGEMONI_ENV" Copy {
"data": {
"reference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"name": "text",
"description": "text",
"currencyCode": "text",
"periodType": "DAILY",
"startDate": "2027-03-14",
"endDate": "2027-03-14",
"limitAmount": 250000.0,
"rolloverMode": "NONE",
"alertThresholds": [
1
],
"enforcementMode": "text",
"enforcedAccountReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"status": "DRAFT",
"includeInternalTransfers": true,
"categoryScoped": true,
"categories": [
{
"categoryReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"categoryCode": "text",
"categoryName": "text",
"allocationAmount": 250000.0
}
],
"currentPeriod": {
"reference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"periodKey": "text",
"periodStart": "2027-03-14T14:30:01",
"periodEnd": "2027-03-14T14:30:01",
"limitAmount": 250000.0,
"carriedInAmount": 250000.0,
"spentAmount": 250000.0,
"remainingAmount": 250000.0,
"utilisationPercent": 250000.0,
"projectedSpendAmount": 250000.0,
"transactionCount": 1,
"status": "text",
"highestThresholdNotified": 1,
"closedAt": "2027-03-14T14:30:01",
"restatedAt": "2027-03-14T14:30:01",
"categories": [
{
"...": "nested"
}
],
"categoryReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"categoryCode": "text",
"categoryName": "text",
"allocationAmount": 250000.0
},
"categoryReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"categoryCode": "text",
"categoryName": "text",
"allocationAmount": 250000.0
},
"description": "Retire a budget"
} Responses Status When 200Budget archived successfully 400Owner could not be determined 403You cannot act for that owner 404Budget not found; Limit rule not found 409Budget cannot move to that state
POST Stop a budget counting POST /budget/{reference}/pause
The cycle in progress keeps its figures and stays readable.
Headers Name Notes AuthorizationBearer token X-TenantYour tenant X-Environmenttest or live
Path parameters Query parameters Name Default ownerTypeOptional ownerReferenceOptional
Example Response: BudgetResponse
curl Response
Copy curl -X POST "https://api.bridgemoni.com/budget/b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e/pause?ownerType=value&ownerReference=value" \
-H "Authorization: Bearer $BRIDGEMONI_TOKEN" \
-H "X-Tenant: $BRIDGEMONI_TENANT" \
-H "X-Environment: $BRIDGEMONI_ENV" Copy {
"data": {
"reference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"name": "text",
"description": "text",
"currencyCode": "text",
"periodType": "DAILY",
"startDate": "2027-03-14",
"endDate": "2027-03-14",
"limitAmount": 250000.0,
"rolloverMode": "NONE",
"alertThresholds": [
1
],
"enforcementMode": "text",
"enforcedAccountReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"status": "DRAFT",
"includeInternalTransfers": true,
"categoryScoped": true,
"categories": [
{
"categoryReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"categoryCode": "text",
"categoryName": "text",
"allocationAmount": 250000.0
}
],
"currentPeriod": {
"reference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"periodKey": "text",
"periodStart": "2027-03-14T14:30:01",
"periodEnd": "2027-03-14T14:30:01",
"limitAmount": 250000.0,
"carriedInAmount": 250000.0,
"spentAmount": 250000.0,
"remainingAmount": 250000.0,
"utilisationPercent": 250000.0,
"projectedSpendAmount": 250000.0,
"transactionCount": 1,
"status": "text",
"highestThresholdNotified": 1,
"closedAt": "2027-03-14T14:30:01",
"restatedAt": "2027-03-14T14:30:01",
"categories": [
{
"...": "nested"
}
],
"categoryReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"categoryCode": "text",
"categoryName": "text",
"allocationAmount": 250000.0
},
"categoryReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"categoryCode": "text",
"categoryName": "text",
"allocationAmount": 250000.0
},
"description": "Stop a budget counting"
} Responses Status When 200Budget paused successfully 400Owner could not be determined 403You cannot act for that owner 404Budget not found; Limit rule not found 409Budget cannot move to that state
GET Read one cycle GET /budget/{reference}/period
The cycle in progress by default, or a past one by its key.
Headers Name Notes AuthorizationBearer token X-TenantYour tenant X-Environmenttest or live
Path parameters Query parameters Name Default ownerTypeOptional ownerReferenceOptional periodKeyOptional
Example Response: BudgetPeriodResponse
curl Response
Copy curl -X GET "https://api.bridgemoni.com/budget/b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e/period?ownerType=value&ownerReference=value&periodKey=value" \
-H "Authorization: Bearer $BRIDGEMONI_TOKEN" \
-H "X-Tenant: $BRIDGEMONI_TENANT" \
-H "X-Environment: $BRIDGEMONI_ENV" Copy {
"data": {
"reference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"periodKey": "text",
"periodStart": "2027-03-14T14:30:01",
"periodEnd": "2027-03-14T14:30:01",
"limitAmount": 250000.0,
"carriedInAmount": 250000.0,
"spentAmount": 250000.0,
"remainingAmount": 250000.0,
"utilisationPercent": 250000.0,
"projectedSpendAmount": 250000.0,
"transactionCount": 1,
"status": "text",
"highestThresholdNotified": 1,
"closedAt": "2027-03-14T14:30:01",
"restatedAt": "2027-03-14T14:30:01",
"categories": [
{
"categoryReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"categoryCode": "text",
"categoryName": "text",
"allocationAmount": 250000.0,
"spentAmount": 250000.0,
"transactionCount": 1,
"highestThresholdNotified": 1
}
],
"categoryReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"categoryCode": "text",
"categoryName": "text",
"allocationAmount": 250000.0
},
"description": "Read one cycle"
} Responses Status When 200Cycle returned 404That budget has no cycle for that key
GET List a budget's cycles GET /budget/{reference}/periods
Newest first.
Headers Name Notes AuthorizationBearer token X-TenantYour tenant X-Environmenttest or live
Path parameters Query parameters Name Default ownerTypeOptional ownerReferenceOptional page0 size20
Example Response: PageResponse<BudgetPeriodResponse>
curl Response
Copy curl -X GET "https://api.bridgemoni.com/budget/b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e/periods?ownerType=value&ownerReference=value&page=0&size=20" \
-H "Authorization: Bearer $BRIDGEMONI_TOKEN" \
-H "X-Tenant: $BRIDGEMONI_TENANT" \
-H "X-Environment: $BRIDGEMONI_ENV" Copy {
"data": {
"contents": [
{
"...": "the resource"
}
],
"page": 1,
"size": 1,
"total": 1,
"pages": 1
},
"description": "List a budget's cycles"
} Responses Status When 200Budget periods retrieved successfully 400Owner could not be determined 403You cannot act for that owner 404Budget not found
GET List budgets GET /budgets
Without the current cycle on each row - that is one query per budget, and a list of twenty would issue twenty. Read a single budget to get its figures.
Headers Name Notes AuthorizationBearer token X-TenantYour tenant X-Environmenttest or live
Query parameters Name Default ownerTypeOptional ownerReferenceOptional statusOptional page0 size20
Example Response: PageResponse<BudgetResponse>
curl Response
Copy curl -X GET "https://api.bridgemoni.com/budgets?ownerType=value&ownerReference=value&status=value&page=0&size=20" \
-H "Authorization: Bearer $BRIDGEMONI_TOKEN" \
-H "X-Tenant: $BRIDGEMONI_TENANT" \
-H "X-Environment: $BRIDGEMONI_ENV" Copy {
"data": {
"contents": [
{
"...": "the resource"
}
],
"page": 1,
"size": 1,
"total": 1,
"pages": 1
},
"description": "List budgets"
}