Download OpenAPI specification:Download
Payd lets employees access their earned wages before payday.
This is commonly referred to as Earned Wage Access (EWA)
and is a modern digital fuss-free version of a cash advance.
EWA helps employees meet unexpected expenses and saves them from:
EWA helps employers:
To enable EWA we need to know about your employees, how much they get paid, when they take leave and when they work.
This information is already stored in one or more tools as part of your workforce management system.
Once your company have signed up we provision a digital twin that keeps in sync with your workforce management system.
We use this digital twin to calculate accrued earnings and issue salary advances on your behalf when requested by employees all without impacting your systems.
There are five general ways to keep the Payd digital twin in sync:
(1) & (2) are intended for our payroll, scheduling, and attendance partners.
We prefer (1) as it reduces overheads for all parties but can do (2).
(3) is required where we're not able to gain access to a providers API.
(4) lets you export a file from your existing tools then upload in our web portal.
(5) lets you make changes directly via the web portal, it's perfect when you have a small number of employees.
All requests require an x-api-key
header. A key will be issued which provides
access to a specific company in a specific environment. This means a different key
is used in the dev
, pre-prod
, and prod
environments.
To maintain the integrity of the digital twin api service each key is assigned rate limits.
These will be calibrated during integration based on the sector and size of the organization.
If a 429 - Too Many Requests
response is received please us so we can investigate.
An asynchronous end point to notify of eligible employees and manage existing employees.
Each employee should have a unique employee_id
, in most cases this
will be their payroll number or employee code. However, if your WFM system reuses
payroll numbers such as on a per group or division basis a different
id will be required that can be guaranteed to be unique across the company.
Where a matching employee_id
is found their details will be updated
with those provided. To maintain data integrity requests
will be rejected that simultaneously alter:
given_name
and (work_phone
or personal_phone
)work_phone
or personal_phone
) and (personal_email
or work_email
)A collection of employee
objects
employee_id required | string Unique ID for this employee |
work_email | string <email> Work email on which to reach the employee |
personal_email | string <email> Personal email on which to reach the employee |
given_name | string The given name of the employee |
family_name | string The family name of the employee |
honorific | string The honorific to use for the employee |
work_phone | string <phone> The employees work issued phone number |
personal_phone | string <phone> The employees personal phone number |
custom_info | object Any additional information that is deemed necessary on a per company basis to support service operation To comply with PDPA and GDPR regulations requests that
send this without prior agreement of the data that is
to be shared will recieve a |
contract_id | string An contract id of the contract to assign or update. If not provided then |
contract_start_on | string <date> The date in YYYY-MM-DD format that the employee contract
defined by This field is ignored where no |
contract_stop_on | string <date> The date in YYYY-MM-DD format that the employee contract
defined by For convienence, where no |
[- {
- "employee_id": "string",
- "work_email": "user@example.com",
- "personal_email": "user@example.com",
- "given_name": "string",
- "family_name": "string",
- "honorific": "string",
- "work_phone": "+65-6225-5577",
- "personal_phone": "+65-6225-5577",
- "custom_info": { },
- "contract_id": "string",
- "contract_start_on": "2019-08-24",
- "contract_stop_on": "2019-08-24"
}
]
{- "job_id": "string",
- "target_entity": "pay-schedules",
- "count_received": 0,
- "count_pending": 0,
- "count_rejected": 0,
- "count_accepted": 0,
- "error_summary": [
- "string"
]
}
An asynchronous end point to notify of new or updated pay schedules.
A collection of pay_schedule
objects
employee_id required | string Unique ID for this employee |
work_email | string <email> Work email on which to reach the employee |
personal_email | string <email> Personal email on which to reach the employee |
given_name | string The given name of the employee |
family_name | string The family name of the employee |
honorific | string The honorific to use for the employee |
work_phone | string <phone> The employees work issued phone number |
personal_phone | string <phone> The employees personal phone number |
custom_info | object Any additional information that is deemed necessary on a per company basis to support service operation To comply with PDPA and GDPR regulations requests that
send this without prior agreement of the data that is
to be shared will recieve a |
contract_id | string An contract id of the contract to assign or update. If not provided then |
contract_start_on | string <date> The date in YYYY-MM-DD format that the employee contract
defined by This field is ignored where no |
contract_stop_on | string <date> The date in YYYY-MM-DD format that the employee contract
defined by For convienence, where no |
[- {
- "employee_id": "string",
- "work_email": "user@example.com",
- "personal_email": "user@example.com",
- "given_name": "string",
- "family_name": "string",
- "honorific": "string",
- "work_phone": "+65-6225-5577",
- "personal_phone": "+65-6225-5577",
- "custom_info": { },
- "contract_id": "string",
- "contract_start_on": "2019-08-24",
- "contract_stop_on": "2019-08-24"
}
]
{- "job_id": "string",
- "target_entity": "pay-schedules",
- "count_received": 0,
- "count_pending": 0,
- "count_rejected": 0,
- "count_accepted": 0,
- "error_summary": [
- "string"
]
}
An asynchronous end point to notify of new or updated contracts. A single contract may be applied to multiple employees based on team, division or grade. This ensures consistent rates, overtime rules, and approval workflows are applied.
A collection of contract
objects
contract_id required | string unique id for this contract |
pay_schedule_id required | string The id of the pay schedule to use when calculating earned wages on this contract. |
currency required | string The ISO 4217 currency code. |
wage_rate_period required | string Enum: "hourly" "daily" "weekly" "bi-weekly" "semi-monthly" "monthly" "annually" "adhoc" The periodicity of the pay amount For the avoidance of doubt on definitions:
|
wage_rate_amount required | number <integer> The amount of pay in minor currency units that this contract attracts |
custom_info | object Any additional information that is deemed necessary on a per company basis to support service operation. Holiday allowance, grade or position, and overtime rules are useful to define here. |
[- {
- "contract_id": "string",
- "pay_schedule_id": "string",
- "currency": "string",
- "wage_rate_period": "hourly",
- "wage_rate_amount": 0,
- "custom_info": { }
}
]
{- "job_id": "string",
- "target_entity": "pay-schedules",
- "count_received": 0,
- "count_pending": 0,
- "count_rejected": 0,
- "count_accepted": 0,
- "error_summary": [
- "string"
]
}
contract_id required | string id of the specific contract to retrieve |
{- "contract_id": "string",
- "pay_schedule_id": "string",
- "currency": "string",
- "wage_rate_period": "hourly",
- "wage_rate_amount": 0,
- "custom_info": { }
}
An asynchronous end point to notify of shifts are available or have been scheduled, worked or approved.
A collection of shift
objects
shift_id required | string Unique id of this shift. This id should remain constant through any changes to it's properties. This allows auditability of any changes such as status, assigned employee, contract, or start and end times. |
shift_status required | string Enum: "available" "scheduled" "declined" "voided" "no_show" "submitted" "provisionally_approved" "approved" The status of this shift in the planning and approval workflow. Not all of these status codes may be relevant for specific workflow.
|
employee_id | string Unique ID of the employee who is assigned to work or has worked this shift |
contract_id | string Unique ID of the contract that applies to this shift. The contract describes the wage rates, overtime logic etc. that will apply for this shift |
start_at required | string <date-time> The date and optionally time the shift begins Where only the date is known use 00:00:00 as the time component. |
stop_at required | string <date-time> The datetime the shift ends. Only provide if |
custom_info | object Any additional information that is deemed necessary on a per company basis to support service operation |
[- {
- "shift_id": "string",
- "shift_status": "available",
- "employee_id": "string",
- "contract_id": "string",
- "start_at": "2019-08-24T14:15:22Z",
- "stop_at": "2019-08-24T14:15:22Z",
- "custom_info": { }
}
]
{- "job_id": "string",
- "target_entity": "pay-schedules",
- "count_received": 0,
- "count_pending": 0,
- "count_rejected": 0,
- "count_accepted": 0,
- "error_summary": [
- "string"
]
}
An asynchronous end point to notify of new or updated additions.
A collection of addition
objects
payment_id required | string unique id for this payment |
employee_id required | string Unique id of the employee who is the beneficiary or remitter for this payment |
contract_id | string The optional id of the contract related to this payment |
currency | string The ISO 4217 currency code. Required if |
amount required | number <integer> The amount of this payment in minor currency units |
custom_info | object Any additional information that is deemed necessary on a per company basis to support service operation |
[- {
- "payment_id": "string",
- "employee_id": "string",
- "contract_id": "string",
- "currency": "string",
- "amount": 0,
- "custom_info": { }
}
]
{- "job_id": "string",
- "target_entity": "pay-schedules",
- "count_received": 0,
- "count_pending": 0,
- "count_rejected": 0,
- "count_accepted": 0,
- "error_summary": [
- "string"
]
}
An asynchronous end point to notify of new or updated deductions.
A collection of deduction
objects
payment_id required | string unique id for this payment |
employee_id required | string Unique id of the employee who is the beneficiary or remitter for this payment |
contract_id | string The optional id of the contract related to this payment |
currency | string The ISO 4217 currency code. Required if |
amount required | number <integer> The amount of this payment in minor currency units |
custom_info | object Any additional information that is deemed necessary on a per company basis to support service operation |
[- {
- "payment_id": "string",
- "employee_id": "string",
- "contract_id": "string",
- "currency": "string",
- "amount": 0,
- "custom_info": { }
}
]
{- "job_id": "string",
- "target_entity": "pay-schedules",
- "count_received": 0,
- "count_pending": 0,
- "count_rejected": 0,
- "count_accepted": 0,
- "error_summary": [
- "string"
]
}
job_id required | string A unique ID for this job. Use it to query the status |
target_entity required | string Enum: "pay-schedules" "contracts" "employees" "shifts" "deductions" "additions" The type of entity the job is working on |
count_received required | integer The number of records received |
count_pending required | integer The number of records waiting to be processed |
count_rejected required | integer The number of records that have been rejected |
count_accepted required | integer The number of records that have been accepted |
error_summary | Array of strings Optional summary of any errors encountered |
{- "job_id": "string",
- "target_entity": "pay-schedules",
- "count_received": 0,
- "count_pending": 0,
- "count_rejected": 0,
- "count_accepted": 0,
- "error_summary": [
- "string"
]
}
pay_schedule_id required | string Unique id for this pay schedule |
frequency required | string Enum: "hourly" "daily" "weekly" "bi-weekly" "semi-monthly" "monthly" "annually" "adhoc" The frequency of the pay cycle For the avoidance of doubt on definitions:
|
alignment | string Enum: "arrears" "aligned" "advance" How payday is aligned to the accrual period. |
Array of objects (pay_period) | |
custom_info | object Any additional information that is deemed necessary on a per company basis to support service operation |
{- "pay_schedule_id": "string",
- "frequency": "hourly",
- "alignment": "arrears",
- "periods": [
- {
- "pay_period_id": "string",
- "start_at": "2019-08-24T14:15:22Z",
- "stop_at": "2019-08-24T14:15:22Z",
- "pay_at": "2019-08-24T14:15:22Z"
}
], - "custom_info": { }
}
employee_id required | string Unique ID for this employee |
work_email | string <email> Work email on which to reach the employee |
personal_email | string <email> Personal email on which to reach the employee |
given_name | string The given name of the employee |
family_name | string The family name of the employee |
honorific | string The honorific to use for the employee |
work_phone | string <phone> The employees work issued phone number |
personal_phone | string <phone> The employees personal phone number |
custom_info | object Any additional information that is deemed necessary on a per company basis to support service operation To comply with PDPA and GDPR regulations requests that
send this without prior agreement of the data that is
to be shared will recieve a |
contract_id | string An contract id of the contract to assign or update. If not provided then |
contract_start_on | string <date> The date in YYYY-MM-DD format that the employee contract
defined by This field is ignored where no |
contract_stop_on | string <date> The date in YYYY-MM-DD format that the employee contract
defined by For convienence, where no |
{- "employee_id": "string",
- "work_email": "user@example.com",
- "personal_email": "user@example.com",
- "given_name": "string",
- "family_name": "string",
- "honorific": "string",
- "work_phone": "+65-6225-5577",
- "personal_phone": "+65-6225-5577",
- "custom_info": { },
- "contract_id": "string",
- "contract_start_on": "2019-08-24",
- "contract_stop_on": "2019-08-24"
}
contract_id required | string unique id for this contract |
pay_schedule_id required | string The id of the pay schedule to use when calculating earned wages on this contract. |
currency required | string The ISO 4217 currency code. |
wage_rate_period required | string Enum: "hourly" "daily" "weekly" "bi-weekly" "semi-monthly" "monthly" "annually" "adhoc" The periodicity of the pay amount For the avoidance of doubt on definitions:
|
wage_rate_amount required | number <integer> The amount of pay in minor currency units that this contract attracts |
custom_info | object Any additional information that is deemed necessary on a per company basis to support service operation. Holiday allowance, grade or position, and overtime rules are useful to define here. |
{- "contract_id": "string",
- "pay_schedule_id": "string",
- "currency": "string",
- "wage_rate_period": "hourly",
- "wage_rate_amount": 0,
- "custom_info": { }
}
shift_id required | string Unique id of this shift. This id should remain constant through any changes to it's properties. This allows auditability of any changes such as status, assigned employee, contract, or start and end times. |
shift_status required | string Enum: "available" "scheduled" "declined" "voided" "no_show" "submitted" "provisionally_approved" "approved" The status of this shift in the planning and approval workflow. Not all of these status codes may be relevant for specific workflow.
|
employee_id | string Unique ID of the employee who is assigned to work or has worked this shift |
contract_id | string Unique ID of the contract that applies to this shift. The contract describes the wage rates, overtime logic etc. that will apply for this shift |
start_at required | string <date-time> The date and optionally time the shift begins Where only the date is known use 00:00:00 as the time component. |
stop_at required | string <date-time> The datetime the shift ends. Only provide if |
custom_info | object Any additional information that is deemed necessary on a per company basis to support service operation |
{- "shift_id": "string",
- "shift_status": "available",
- "employee_id": "string",
- "contract_id": "string",
- "start_at": "2019-08-24T14:15:22Z",
- "stop_at": "2019-08-24T14:15:22Z",
- "custom_info": { }
}
payment_id required | string unique id for this payment |
employee_id required | string Unique id of the employee who is the beneficiary or remitter for this payment |
contract_id | string The optional id of the contract related to this payment |
currency | string The ISO 4217 currency code. Required if |
amount required | number <integer> The amount of this payment in minor currency units |
custom_info | object Any additional information that is deemed necessary on a per company basis to support service operation |
{- "payment_id": "string",
- "employee_id": "string",
- "contract_id": "string",
- "currency": "string",
- "amount": 0,
- "custom_info": { }
}