UK Benefits Calculator API
Version 1.0.0
Base URL: https://missingbenefit.com/api/v1
OpenAPI spec: /api/v1/openapi.json
Licence: Creative Commons Attribution-NonCommercial 4.0 International (CC BY-NC 4.0)
Authentication
Authentication is optional but recommended. Unauthenticated requests are allowed but subject to a strict IP-based rate limit of 5 requests per minute.
To get higher rate limits, register for an API key by creating an account and visiting the API Keys page. Pass your API key in the Authorization header as a Bearer token:
``
Authorization: Bearer bfk_your_api_key_here
`
Alternatively, you can use the X-API-Key header:
`
X-API-Key: bfk_your_api_key_here
`
Rate Limiting
| Tier | Rate Limit | |
|---|---|---|
| Unauthenticated | 5 requests per minute | |
| Authenticated (default) | 100 requests per hour |
| Status | Description | Schema |
|---|---|---|
200 |
API metadata | ApiRoot |
GET /api/v1/health
Health check
Returns the health status of the API. Use this to monitor availability.
Example curl request
curl https://missingbenefit.com/api/v1/health \ -H "Authorization: Bearer bfk_your_api_key_here"
Responses
| Status | Description | Schema |
|---|---|---|
200 |
Service is healthy | HealthResponse |
Calculations
POST /api/v1/calculations
Create a benefit calculation
Submit questionnaire answers and receive a full benefit eligibility calculation. The request is stateless — no data is stored. All monetary values are in GBP per month unless stated otherwise. Dates should be provided as objects with day, month, and year string properties (e.g. {"day":"15","month":"5","year":"1990"}).
Request body: CalculationRequest (application/json)
Example: Working-age single person
{
"data": {
"type": "calculation",
"attributes": {
"answers": {
"dateOfBirth": {
"day": "15",
"month": "5",
"year": "1990"
},
"postcode": "SW1A 2AA",
"relationshipStatus": "single",
"hasChildren": "no",
"housingStatus": "renting-private",
"weeklyRent": "120",
"employmentStatus": "unemployed",
"monthlyEarnings": "0",
"hasOtherIncome": "no",
"savingsAmount": "under-6000",
"hasHealthCondition": "no",
"isCarer": "no"
}
}
}
}
Example: Pensioner on Pension Credit
{
"data": {
"type": "calculation",
"attributes": {
"answers": {
"dateOfBirth": {
"day": "10",
"month": "3",
"year": "1955"
},
"postcode": "LS1 4AP",
"relationshipStatus": "single",
"receivingStatePension": "yes",
"niQualifyingYears": "30-34",
"privatePensionIncome": "50",
"receivingPensionCredit": "yes",
"hasChildren": "no",
"housingStatus": "renting-social",
"weeklyRent": "100",
"councilTaxExempt": "no",
"councilTaxBand": "B",
"employmentStatus": "retired",
"hasOtherIncome": "no",
"savingsAmount": "under-6000",
"hasHealthCondition": "yes",
"dailyLivingDifficulty": "moderate",
"nightTimeCareNeeds": "no",
"terminallyIll": "no",
"mobilityDifficulty": "mild",
"isCarer": "no",
"livingArrangement": "alone",
"heatingType": "gas"
}
}
}
}
Responses
| Status | Description | Schema |
|---|---|---|
201 |
Calculation created successfully | CalculationResponse |
400 |
Invalid request body | ErrorResponse |
401 |
Unauthorized — missing or invalid API key | ErrorResponse |
429 |
Rate limit exceeded | ErrorResponse |
500 |
Internal server error | ErrorResponse |
Example 401 response
{
"errors": [
{
"status": "401",
"title": "Unauthorized",
"detail": "Invalid API key. Check your key or generate a new one at /api-keys."
}
]
}
Example 429 response
{
"errors": [
{
"status": "429",
"title": "Too Many Requests",
"detail": "You have exceeded the rate limit of 100 requests per hour. Please wait before making more requests."
}
]
}
Rates
GET /api/v1/rates
List benefit rates
Returns the current 2025/26 benefit rates used in all calculations. Rates are updated annually. All monetary values are in GBP.
Example curl request
curl https://missingbenefit.com/api/v1/rates \ -H "Authorization: Bearer bfk_your_api_key_here"
Responses
| Status | Description | Schema |
|---|---|---|
200 |
Benefit rates for the current tax year | RatesResponse |
401 |
Unauthorized — missing or invalid API key | ErrorResponse |
429 |
Rate limit exceeded | ErrorResponse |
Questions
GET /api/v1/questions
List questionnaire sections
Returns all questionnaire sections and their questions. Use this to understand which answer keys the /calculations endpoint expects, or to build your own front end.
Example curl request
curl https://missingbenefit.com/api/v1/questions \ -H "Authorization: Bearer bfk_your_api_key_here"
Responses
| Status | Description | Schema |
|---|---|---|
200 |
All questionnaire sections | QuestionsResponse |
401 |
Unauthorized — missing or invalid API key | ErrorResponse |
429 |
Rate limit exceeded | ErrorResponse |
POST /api/v1/questions/applicable
Get applicable questions for given answers
Returns only the sections and questions that apply based on the answers provided so far. Some sections are conditional — for example, the partner section only appears when the relationship status is 'couple'. Use this to build a progressive questionnaire.
Request body: ApplicableQuestionsRequest (application/json)
Example request body
{
"data": {
"type": "question-filter",
"attributes": {
"answers": {
"relationshipStatus": "couple",
"hasChildren": "yes"
}
}
}
}
Responses
| Status | Description | Schema |
|---|---|---|
200 |
Applicable questionnaire sections | QuestionsResponse |
400 |
Invalid request body | ErrorResponse |
401 |
Unauthorized — missing or invalid API key | ErrorResponse |
429 |
Rate limit exceeded | ErrorResponse |
Data schemas
ApiRoot
| Field | Type | Description |
|---|---|---|
| data | object |
|
| type | string |
e.g. api |
| id | string |
e.g. uk-benefits-calculator |
| attributes | object |
|
| name | string |
e.g. UK Benefits Calculator API |
| version | string |
e.g. 1.0.0 |
| description | string |
|
| links | object |
|
| self | string |
e.g. /api/v1 |
| documentation | string |
e.g. /api-docs |
| openapi | string |
e.g. /api/v1/openapi.json |
| calculations | string |
e.g. /api/v1/calculations |
| rates | string |
e.g. /api/v1/rates |
| questions | string |
e.g. /api/v1/questions |
| health | string |
e.g. /api/v1/health |
| meta | object |
|
| taxYear | string |
e.g. 2025/26 |
| standards | string |
e.g. https://www.gov.uk/guidance/gds-api-technical-and-data-standards |
HealthResponse
| Field | Type | Description |
|---|---|---|
| data | object |
|
| type | string |
e.g. health |
| id | string |
e.g. api-health |
| attributes | object |
|
| status | "ok" | "degraded" | "critical" |
e.g. ok |
| uptime | number |
Uptime in seconds |
| meta | object |
|
| timestamp | string (date-time) |
CalculationRequest
| Field | Type | Description |
|---|---|---|
| data required | object |
|
| type required | "calculation" |
|
| attributes required | object |
|
| answers required | object |
Key-value pairs of questionnaire answers. Use /questions to see all valid keys. |
CalculationResponse
| Field | Type | Description |
|---|---|---|
| data | object |
|
| type | string |
e.g. calculation |
| id | string (uuid) |
|
| attributes | object |
|
| totalMonthly | number |
Total monthly benefit amount in GBP (excludes annual-only benefits) |
| totalAnnual | number |
Total annual benefit amount in GBP (from monthly benefits, i.e. totalMonthly × 12) |
| totalAnnualBenefits | number |
Total of annual-only benefits in GBP (e.g. Winter Fuel Payment). Add to totalAnnual for the complete yearly figure. |
| benefits | array of BenefitResult |
|
| incomeSummary | object |
A breakdown of all income sources identified from the user's answers, used in means-tested benefit calculations. |
| lines | array of object |
|
| totalMonthlyIncome | number |
Total monthly income in GBP across all sources |
| isCouple | boolean |
Whether the calculation is for a couple |
| meta | object |
|
| calculatedAt | string (date-time) |
|
| taxYear | string |
e.g. 2025/26 |
| disclaimer | string |
|
| warnings | array of object |
Present only if the request contained unrecognised answer fields. |
BenefitResult
| Field | Type | Description |
|---|---|---|
| id | string |
e.g. universal-credit |
| name | string |
e.g. Universal Credit |
| eligible | boolean |
|
| monthlyAmount | number |
Monthly amount in GBP (0 for annual-only benefits) |
| annualAmount | number |
Annual amount in GBP |
| description | string |
|
| breakdown | array of object |
Line-by-line breakdown of how the amount was calculated. Present only for eligible benefits with detailed calculations. |
| applyUrl | string (uri) |
GOV.UK URL where the user can apply for this benefit |
| notes | array of string |
Explanatory notes about eligibility or calculation assumptions |
| councilName | string |
Name of the local council. Present only for council-specific benefits such as Council Tax Reduction. |
| paymentFrequency | "monthly" | "annual" |
How often this benefit is paid. Defaults to monthly if not specified. Annual benefits (e.g. Winter Fuel Payment) are excluded from totalMonthly. |
| eligibilityLabel | string |
A short label describing the eligibility status, e.g. 'Currently receiving'. Present only for certain benefits like State Pension. |
IncomeSummary
A breakdown of all income sources identified from the user's answers, used in means-tested benefit calculations.
| Field | Type | Description |
|---|---|---|
| lines | array of object |
|
| totalMonthlyIncome | number |
Total monthly income in GBP across all sources |
| isCouple | boolean |
Whether the calculation is for a couple |
RatesResponse
| Field | Type | Description |
|---|---|---|
| data | object |
|
| type | string |
e.g. rates |
| id | string |
e.g. 2025-26 |
| attributes | object |
Benefit rate categories and their values in GBP |
| meta | object |
|
| taxYear | string |
e.g. 2025/26 |
QuestionsResponse
| Field | Type | Description |
|---|---|---|
| data | array of QuestionSection |
|
| meta | object |
|
| totalSections | integer |
QuestionSection
| Field | Type | Description |
|---|---|---|
| type | string |
e.g. question-section |
| id | string |
e.g. about-you |
| attributes | object |
|
| title | string |
|
| description | string |
|
| questions | array of Question |
Question
| Field | Type | Description |
|---|---|---|
| id | string |
|
| type | "radio" | "text" | "number" | "date" | "select" | "currency" | "children-editor" | "children-sex-editor" | "children-disability-editor" |
|
| label | string |
|
| hint | string |
|
| options | array of object |
|
| required | boolean |
ApplicableQuestionsRequest
| Field | Type | Description |
|---|---|---|
| data required | object |
|
| type required | "question-filter" |
|
| attributes required | object |
|
| answers required | object |
Current answers to filter questions by |
ErrorResponse
| Field | Type | Description |
|---|---|---|
| errors | array of object |
Also available: MCP Server documentation for AI assistant integration.