{"openapi":"3.1.0","info":{"title":"Malaysia Payroll Contributions Calculator API","version":"0.1.0","description":"Malaysia Payroll Contributions Calculator applies the EPF (KWSP) mandatory contribution rules published for wages from October 2025 to a monthly wage. calc_epf gives employer, employee and total EPF for one employee by class (Malaysian citizen; permanent resident or non-citizen registered before 1 August 1998; non-citizen registered from 1 August 1998, who contribute 2 percent each) and age...\n\nEvery operation is read-only or compute-only. The same tools are available over MCP (streamable HTTP) at https://my-payroll-contrib.connectorbay.com/mcp.\n\nDisclaimer: General information only, not legal, tax, accounting or payment advice. Malaysia Payroll Contributions Calculator is an independent tool: it is not affiliated with, endorsed by or operated by any government body, central bank, standards body or scheme operator. Rates, thresholds and rules change; check the cited official source and confirm with a qualified professional before you rely on a result.","contact":{"name":"Unify Dynamics LLC","email":"agent@connectorbay.com","url":"https://connectorbay.com/my-payroll-contrib/docs"},"termsOfService":"https://connectorbay.com/my-payroll-contrib/terms"},"servers":[{"url":"https://my-payroll-contrib.connectorbay.com"}],"externalDocs":{"url":"https://connectorbay.com/my-payroll-contrib/docs"},"security":[{},{"bearer":[]}],"components":{"securitySchemes":{"bearer":{"type":"http","scheme":"bearer","description":"Optional. A Pro API key raises rate limits; no credentials are required."}},"schemas":{"Error":{"type":"object","properties":{"ok":{"const":false},"error":{"type":"object"}}}}},"paths":{"/v1/tools/calc_epf":{"post":{"operationId":"calc_epf","summary":"Employer, employee and total EPF for one employee for a wage month, by class, age and wage, using the Third Schedule wag","description":"Employer, employee and total EPF for one employee for a wage month, by class, age and wage, using the Third Schedule wage-band method up to RM20,000. Use for \"How much EPF do I pay for a 34-year-old Malaysian earning RM 2,450 a month?\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"monthly_wage":{"description":"Monthly wages in ringgit as a plain decimal string with at most 2 decimals, for example 2450.00","title":"Monthly Wage","type":"string"},"employee_class":{"description":"malaysian_citizen, pr_or_non_citizen_before_1998 (permanent resident, or non-citizen who elected to contribute before 1 August 1998) or non_citizen_from_1998 (non-citizen registered from 1 August 1998)","title":"Employee Class","type":"string"},"age":{"description":"Employee age in completed years during the wage month; 60 and above uses the older-employee rates","title":"Age","type":"integer"},"wage_month":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Wage month as YYYY-MM (default: the current month, UTC). The stored rules apply from 2025-10","title":"Wage Month"}},"required":["monthly_wage","employee_class","age"],"title":"calc_epfArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/calc_payroll_batch":{"post":{"operationId":"calc_payroll_batch","summary":"EPF for a list of employees for one wage month: per-employee employer, employee and total EPF plus the totals to remit. ","description":"EPF for a list of employees for one wage month: per-employee employer, employee and total EPF plus the totals to remit. Use for \"Run EPF for my three staff for September 2026 and total what I remit.\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"employees":{"description":"Employees for the month (1 to 100). Each item is an object with label (any text you choose), monthly_wage (decimal string), employee_class and age","items":{"additionalProperties":true,"type":"object"},"title":"Employees","type":"array"},"wage_month":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Wage month as YYYY-MM (default: the current month, UTC). The stored rules apply from 2025-10","title":"Wage Month"}},"required":["employees"],"title":"calc_payroll_batchArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/epf_rate_table":{"post":{"operationId":"epf_rate_table","summary":"EPF rates by employee class, age and wage threshold (RM5,000 and RM20,000), with the rounding rule, the due date rule an","description":"EPF rates by employee class, age and wage threshold (RM5,000 and RM20,000), with the rounding rule, the due date rule and the effective date. Use for \"What are the EPF rates for each type of employee?\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"on_date":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Date the table should apply to, ISO YYYY-MM-DD (default today, UTC). Dates before 2025-10-01 are refused","title":"On Date"}},"title":"epf_rate_tableArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/epf_due_date":{"post":{"operationId":"epf_due_date","summary":"EPF payment date for a wage month: the 15th of the following month, moved to the next weekday when it falls on a weekend","description":"EPF payment date for a wage month: the 15th of the following month, moved to the next weekday when it falls on a weekend; lists the next months too. Use for \"When must I pay EPF for September wages?\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"wage_month":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Wage month as YYYY-MM (default: the current month, UTC). The stored rules apply from 2025-10","title":"Wage Month"},"months":{"default":1,"description":"How many consecutive wage months to list from wage_month (1 to 12)","title":"Months","type":"integer"}},"title":"epf_due_dateArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/staff_cost_estimate":{"post":{"operationId":"staff_cost_estimate","summary":"Monthly cost of an employee to the employer: gross wage plus employer EPF plus any other cost you supply (SOCSO and EIS ","description":"Monthly cost of an employee to the employer: gross wage plus employer EPF plus any other cost you supply (SOCSO and EIS are not calculated). Use for \"What does a 45-year-old Malaysian on RM 5,800 a month cost me including EPF?\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"monthly_wage":{"description":"Monthly wages in ringgit as a plain decimal string with at most 2 decimals, for example 2450.00","title":"Monthly Wage","type":"string"},"employee_class":{"description":"malaysian_citizen, pr_or_non_citizen_before_1998 (permanent resident, or non-citizen who elected to contribute before 1 August 1998) or non_citizen_from_1998 (non-citizen registered from 1 August 1998)","title":"Employee Class","type":"string"},"age":{"description":"Employee age in completed years during the wage month; 60 and above uses the older-employee rates","title":"Age","type":"integer"},"wage_month":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Wage month as YYYY-MM (default: the current month, UTC). The stored rules apply from 2025-10","title":"Wage Month"},"other_employer_costs":{"default":"0","description":"Any other monthly employer cost to include (SOCSO, EIS, levies, insurance) as a decimal string; default 0. Added as given, not calculated","title":"Other Employer Costs","type":"string"}},"required":["monthly_wage","employee_class","age"],"title":"staff_cost_estimateArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/socso_eis_status":{"post":{"operationId":"socso_eis_status","summary":"What is and is not verified about SOCSO and EIS (PERKESO) contributions: the RM6,000 wage ceiling from 1 October 2024 on","description":"What is and is not verified about SOCSO and EIS (PERKESO) contributions: the RM6,000 wage ceiling from 1 October 2024 only; no rates are calculated. Use for \"What is the SOCSO and EIS wage ceiling and can this tool calculate them?\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"socso_eis_statusArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}}}}