Submit a pending employee contribution change request

Add MCP server to your AI tool

Allow AI tools and LLMs to interact with the API documentation portal through MCP.

MCP server URL

https://docs.getpenfold.dev/mcp

Standard setup for AI tools providing an mcp.json file

mcp.json
{
  "Penfold Partner API MCP server": {
    "url": "https://docs.getpenfold.dev/mcp"
  }
}

Close
POST /employers/{employer_id}/employees/{employee_id}/contribution_change_requests

Submit a pending employee contribution change request (mirrors the Penfold member app flow). There is no separate read endpoint — poll GET .../employees/{employee_id} for current contribution percentages. Emits a ContributionChangeRequest webhook with action Created on success.

Path parameters

  • employer_id string Required
  • employee_id string Required
application/json

Body object Required

Any of:

Responses

  • 201 application/json

    Contribution change request created.

    Hide response attributes Show response attributes object
    • id string Required

      Unique identifier for the contribution change request.

    • employee_contributions_percent_from number | null

      Previous employee contribution percentage, when the percentage changes.

      Minimum value is 0, maximum value is 100.

    • employee_contributions_percent_to number | null

      Requested employee contribution percentage, when the percentage changes.

      Minimum value is 0, maximum value is 100.

    • salary_sacrifice_enabled boolean | null

      true when salary sacrifice opt-in was requested.

    • created_at string(date-time) Required

      When the request was created (ISO 8601 UTC).

    • updated_at string(date-time) Required

      When the request was last updated (ISO 8601 UTC).

  • 400 application/json

    Bad request, the request is malformed or contains invalid data.

    Hide response attributes Show response attributes object
    • error string

      A descriptive error message.

    • validation_errors array[object]
      Hide validation_errors attributes Show validation_errors attributes object
      • field string Required

        The name of the field that failed validation.

      • message string Required

        A descriptive error message.

  • 401 application/json

    Unauthorized.

    Hide response attribute Show response attribute object
    • error string

      A descriptive error message.

  • 404 application/json

    Employee or employer not found.

    Hide response attribute Show response attribute object
    • error string

      A descriptive error message.

POST /employers/{employer_id}/employees/{employee_id}/contribution_change_requests
curl \
 --request POST 'https://payroll-api.getpenfold.dev/v4/employers/{employer_id}/employees/{employee_id}/contribution_change_requests' \
 --header "Authorization: Bearer $ACCESS_TOKEN" \
 --header "Content-Type: application/json" \
 --data '{"employee_contributions_percent":42.0,"salary_sacrifice_enabled":true}'
Request examples
{
  "employee_contributions_percent": 42.0,
  "salary_sacrifice_enabled": true
}
{
  "employee_contributions_percent": 42.0,
  "salary_sacrifice_enabled": true
}
Response examples (201)
{
  "id": "string",
  "employee_contributions_percent_from": 42.0,
  "employee_contributions_percent_to": 42.0,
  "salary_sacrifice_enabled": true,
  "created_at": "2026-05-04T09:42:00Z",
  "updated_at": "2026-05-04T09:42:00Z"
}
Response examples (400)
{
  "error": "Bad request: invalid data provided.",
  "validation_errors": [
    {
      "field": "email",
      "message": "Email address is invalid."
    }
  ]
}
Response examples (401)
{
  "error": "Bad request: invalid data provided."
}
Response examples (404)
{
  "error": "Bad request: invalid data provided."
}