Set the worker's elected fund allocation. Partners choose a target from
GET /fund_allocations; this endpoint applies it immediately and returns the
new state. Lifetime fund strategies are not supported — only concrete catalogue
allocations.
Idempotent: requesting the worker's current fund_allocation_id returns 200
with the current allocation and does not re-apply fund-change side effects.
When the allocation actually changes, emits a FundAllocation webhook with
action Changed. Idempotent no-ops do not emit a webhook.
Responses
-
Fund allocation updated successfully (or unchanged when idempotent).
-
Request body validation failed (e.g. missing
fund_allocation_id). -
Unauthorized.
-
Employee or employer not found, or fund allocation is not available for the employee.
-
Method not allowed
-
fund_allocation_idis unknown or not in the workplace catalogue (GET /fund_allocations).
curl \
--request PUT 'https://payroll-api.getpenfold.dev/v4/employers/{employer_id}/employees/{employee_id}/fund_allocation' \
--header "Authorization: Bearer $ACCESS_TOKEN" \
--header "Content-Type: application/json" \
--data '{"fund_allocation_id":"string"}'
{
"fund_allocation_id": "string"
}
{
"id": "string",
"name": "string",
"description": "string",
"provider": "string",
"risk_level": 42,
"effective_annual_fee_percent": 42.0,
"asset_allocation": [
{
"asset_class": "string",
"percent": 42.0
}
],
"asset_allocation_as_of_date": "2026-05-04"
}
{
"error": "Bad request: invalid data provided.",
"validation_errors": [
{
"field": "email",
"message": "Email address is invalid."
}
]
}
{
"error": "Bad request: invalid data provided."
}
{
"error": "Bad request: invalid data provided."
}
{
"error": "Bad request: invalid data provided."
}
{
"error": "Bad request: invalid data provided.",
"validation_errors": [
{
"field": "email",
"message": "Email address is invalid."
}
]
}