PolicyEngine Household API
Project description
PolicyEngine Household API
A version of the PolicyEngine API that runs the calculate endpoint over household object. To debug locally, run make debug.
Quick self-hosted run
If you want to try the API without requesting hosted credentials, run the published Docker image:
docker run --rm -p 8080:8080 ghcr.io/policyengine/policyengine-household-api:latest
The image can take a little time to initialize on first start and is best run on a machine with roughly 4 GB of RAM available.
Then inspect the service metadata:
curl http://localhost:8080/
and send calculations to:
http://localhost:8080/us/calculate
Hosted API docs live at https://www.policyengine.org/us/api.
Local development with Docker Compose
To run this app locally via Docker Compose:
% make docker-build
% make docker-run
and point your browser at http://localhost:8080 to access the API.
To develop the code locally, you will want to instead start only the Redis docker container and a one-off API container, with your local filesystem mounted into the running docker container.
% make services-start
% make docker-console
Then inside the container, start the Flask service:
policyapi@[your-docker-id]:/code$ make debug
and point your browser at http://localhost:8080 to access the API.
Running with other PolicyEngine services
If you're running this alongside other PolicyEngine services (e.g., the main API) and need containers to communicate across projects, use the external network mode:
% make docker-network-create # Create shared network (once)
% make docker-run-external # Run with external network
This connects the household API to a shared policyengine-api_default network that other
PolicyEngine docker-compose projects can also join.
For development with external networking:
% make docker-network-create
% make services-start-external
% make docker-console
Period-key conventions
Every input and output on /calculate is keyed by a period string. Two shapes
are supported:
- Year key —
"2026". Treated as the value for the entire year. - Month key —
"2026-01". Treated as the value for that single month.
Each PolicyEngine variable has a fixed definition_period (year or month).
Annual variables like employment_income and state_name are defined for
the year; monthly variables like snap_earned_income, snap_gross_income,
and rent are defined for the month.
Recommended pattern: stay consistent within a request
Pick one cadence per request and use it everywhere:
| You want | Send inputs as | Request outputs as |
|---|---|---|
| Annual totals | {"2026": V} |
{"2026": null} |
| A specific month | {"2026-01": V} |
{"2026-01": null} |
If you only think in yearly amounts, use year keys for everything — including
monthly variables. For numeric inputs, the API treats the year value as the
annual total and distributes it as V/12 across the 12 months before the
engine runs; the engine returns the annual sum on the way back. Booleans,
strings, and enums are broadcast unchanged across months.
If you need per-month variation, key both the input and the output to the same month.
Sending both annual and monthly inputs for the same variable
You can pin specific months while letting the year value cover the rest.
For numeric MONTH-defined variables, the year value is treated as the
annual total: explicit monthly values consume part of the budget, and
the remainder splits evenly across the unset months. This matches the
hosted v1 API and OpenFisca's set_input_divide_by_period.
// Annual $1200 with June pinned to $600. Remaining $600 splits across
// the other 11 months as raw float ≈ $54.55/mo.
"snap_earned_income": {"2026": 1200, "2026-06": 600}
For boolean / string / enum MONTH-defined variables, explicit monthly values override the year-broadcast for that month while the year value applies to the rest:
// "SUA all year except LUA in June".
"snap_utility_allowance_type": {"2026": "SUA", "2026-06": "LUA"}
The API only rejects with a 400 when every month of the year is
explicit AND those monthlies don't sum to the annual total — that's an
"Inconsistent input" the engine can't reconcile. Partial monthly
overrides (any number from 0 to 11 explicit months) are accepted; the
remainder is distributed across the unset months even when it's negative
(matching v1 / OpenFisca exactly). Output-request null slots don't
count as inputs, so {"2026": 1200, "2026-06": null} keeps both: the
year expands as usual and the engine returns June's value.
What goes wrong when you mix shapes
Sending a single-month input ({"2026-01": V}) on a monthly variable but
requesting an annual output ({"2026": null}) is the most common pitfall.
The other 11 months default to 0 in the engine, so the annual sum looks like
a year of benefits even though only January was actually specified. The API
returns a warnings array in the response when it detects this combination
so you can correct the request before relying on the number.
What the API echoes back
Output keys are echoed back exactly as you sent them. Input keys are preserved unchanged; the year-to-month split happens internally and never shows up in the response.
Development rules
- Every endpoint should return a JSON object with at least a "status" and "message" field.
Please note that we do not support branched operations at this time.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file policyengine_household_api-0.15.2.tar.gz.
File metadata
- Download URL: policyengine_household_api-0.15.2.tar.gz
- Upload date:
- Size: 294.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
658642de65ad99d4d5758cf0a2b4e94c170160e81056a451f85ba61779a3b291
|
|
| MD5 |
ac677ec2253e21ef518d756daf4f3b24
|
|
| BLAKE2b-256 |
520b2c12afcfeb9b15f23016ca518c79f9e1d4f75cdf856c7f11d608b87c2706
|
Provenance
The following attestation bundles were made for policyengine_household_api-0.15.2.tar.gz:
Publisher:
deploy-staged.yml on PolicyEngine/policyengine-household-api
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
policyengine_household_api-0.15.2.tar.gz -
Subject digest:
658642de65ad99d4d5758cf0a2b4e94c170160e81056a451f85ba61779a3b291 - Sigstore transparency entry: 1442892208
- Sigstore integration time:
-
Permalink:
PolicyEngine/policyengine-household-api@f5bccde3fc0806727ab2459a4dba43a37f082f58 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/PolicyEngine
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
deploy-staged.yml@f5bccde3fc0806727ab2459a4dba43a37f082f58 -
Trigger Event:
push
-
Statement type:
File details
Details for the file policyengine_household_api-0.15.2-py3-none-any.whl.
File metadata
- Download URL: policyengine_household_api-0.15.2-py3-none-any.whl
- Upload date:
- Size: 58.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
40031bbc27319f731018a34a6b6e3543fc2a321bee5fa08e6a2a588057d0cc0a
|
|
| MD5 |
737fff478f38fc728dca83a3c6d7df44
|
|
| BLAKE2b-256 |
b6fa958f7bcda65c9943bb01f8d4587cbe9e6ffa184a12a5e332a413d7e736d8
|
Provenance
The following attestation bundles were made for policyengine_household_api-0.15.2-py3-none-any.whl:
Publisher:
deploy-staged.yml on PolicyEngine/policyengine-household-api
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
policyengine_household_api-0.15.2-py3-none-any.whl -
Subject digest:
40031bbc27319f731018a34a6b6e3543fc2a321bee5fa08e6a2a588057d0cc0a - Sigstore transparency entry: 1442892333
- Sigstore integration time:
-
Permalink:
PolicyEngine/policyengine-household-api@f5bccde3fc0806727ab2459a4dba43a37f082f58 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/PolicyEngine
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
deploy-staged.yml@f5bccde3fc0806727ab2459a4dba43a37f082f58 -
Trigger Event:
push
-
Statement type: