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 for contribution percentage changes and salary sacrifice opt-in. Partners may also request salary sacrifice opt-out via salary_sacrifice_enabled: false (not supported in the member app today). There is no separate read endpoint — poll GET .../employees/{employee_id} for current contribution percentages.

Path parameters

  • employer_id string Required
  • employee_id string Required
application/json

Body Required

  • employee_contributions_percent number

    Requested employee contribution percentage (0–100).

    Minimum value is 0, maximum value is 100.

  • salary_sacrifice_enabled boolean

    When true, request salary sacrifice opt-in; when false, request opt-out.

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 a percentage change was requested. null when no percentage change was requested (not the same as 0).

      Minimum value is 0, maximum value is 100.

    • employee_contributions_percent_to number | null

      Requested employee contribution percentage when a percentage change was requested. null when no percentage change was requested (not the same as 0).

      Minimum value is 0, maximum value is 100.

    • salary_sacrifice_enabled boolean | null

      Requested salary sacrifice state when a change was requested (true opt-in, false opt-out).

    • 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
}
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."
}