The goal is for the employee to have a percentage of their salary available, not 100% of it.
Along these lines, for a company that has adopted the Payflow platform to properly deliver the earned wage access service to its employees, it is necessary that it: 1.Keeps the required basic employee information updated on a daily basis: new hires, terminations and changes 2.Consumes the payment information (also daily) so the company can report it in its payroll system and process the payments.
/employees and /payments endpoints:1. Employee synchronization flow (POST /employees).This API endpoint works as a POST + PUT method even though you only do a POST: 1.Creates employees 2.Updates employees (data and status)
2. Payment synchronization flow (GET /payments).This API endpoint exposes the transactions made in Payflow by your company's employees.
For an employee to be able to use the Payflow platform, they must first be created — that is, they must be set up as a potential user by their company in their Payflow dashboard.
The goal of this flow is to guarantee that only the correct employees can use Payflow and that their data is up to date.
It is important to remember that Payflow is a platform provided by the employer and the employee cannot modify any data there. If they want to change something, they must go to their employer, who makes the change in the HR software; this integration will then synchronize the changes into Payflow. This prevents fraud and guarantees the correct delivery of the service.
| Field name in the Payflow API | Field group | Description | Field type / limitations | Mandatory? |
|---|---|---|---|---|
| payrollId | Identification data | Employee ID in your payroll software | String (max. 100 characters) | NO |
| personalId | Identification data | Valid identification document number | String (max. 100 characters) | YES |
| documentType | Identification data | Identification document type | String (max. 100 characters) | NO |
| firstName | Identification data | Full first name of the employee | String (max. 100 characters) | YES |
| lastName | Identification data | Full last name of the employee | String (max. 100 characters) | YES |
| Contact data | Valid email address of the employee | String (cannot be generic, must be unique) Invalid emails will be voided | YES [required if there is no phone number] | |
| phone | Contact data | Valid phone number of the employee | String (cannot be generic, must be unique) Invalid phone numbers will be voided - Can be sent without the country code | YES [required if there is no email] |
| address | Contact data | Employee address | String (max. 100 characters) | YES |
| iban | Salary and banking data | Valid IBAN of the employee. | String (max. 100 characters) | YES |
| bankAccountType | Salary and banking data | Employee's bank account type. | String (max. 100 characters) Possible values: savings, checking, maestra | NO |
| netSalary | Salary and banking data | Employee's net salary (after taxes) | Number (must be a positive integer) If grossSalary is provided, do not send netSalary | YES [required if there is no grossSalary] |
| grossSalary | Salary and banking data | Employee's salary before taxes | Number (must be a positive integer) If netSalary is provided, do not send grossSalary | YES [required if there is no netSalary] |
| startDate | Contract data | Employee's contract start date | String Must be in YYYY-MM-DD format | NO |
| contractEnd | Contract data | Contract end date | String Must be in YYYY-MM-DD format | NO |
| status | Contract data | Employee status. | String Possible values: active, inactive, on_leave | YES |
| subsidiary | Contract data | Tax ID (CIF) of the subsidiary the employee belongs to | String | YES |
| availableAmount | Salary and banking data | Amount available for withdrawal | Number (must be a positive integer) | NO [This is for special Payflow projects. In standard projects, using grossSalary or netSalary is recommended] |
status field)status field:active → Can use Payflow; is an active employee at the companyinactive → Cannot use Payflow; no longer works at the companyon_leave → Temporarily cannot use Payflow; temporary leave defined by business ruleson_leave statusstatus = "on_leave", and thus comply with the standard integration standards against the Payflow API, are:Operating standard: Send the updates for all employees in bulk using the POST method (ideally in batches of 500 max) and the /employeesendpoint.Our API can take one request per second from the same IP — no more than that, because our firewall may block you. Suggested frequency: 1–2 times a day (if you have >1000 employees) or every 4–8 hours (if you have <1000 employees). This is fully configurable.
Avoid common mistakes: Always send all mandatory data. Do not use salary = 0 to deactivate; always use the statusfield.Do not stop sending employees in order to deactivate them; always use the statusfield.Send full first and last names
Technical tips: Handle 503 errors with retries and backoff. Make sure your system can handle the volume: CPU, memory, timeouts. Document the key rules for your team: salaries and statuses.
0. Meet the prerequisites: Access to the Payflow dashboard — the team will give you access. The base URL and the endpoints: Testing environment: Base URL: https://api-public.payflow-dev.net Endpoint to use: https://api-public.payflow-dev.net/employees Production: Base URL: https://api-public.payflow.es Endpoint to use: https://api-public.payflow.es/employees The API key. You can generate it in the dashboard by following these steps: 1.Go to the "integrations" section → "integrations" 2.Select Payflow API 3.Click the "Generate API Key" button 4.Save the API Key somewhere safe so you can use it in the integration You can come back here to generate a new one whenever you want In Postman it would look like this:
1. Extract the required employee data from the HR software.
2. Format this data into the JSON accepted by the Payflow API (batches of 500 employees max per request). Example of the JSON to send (batch of 3 employees) [ { "payrollId": "Emp01", "firstName": "Test User", "lastName": "Prueba Uno", "personalId": "12345228G", "iban": "ES7915389586411761022929", "grossSalary": 2500, "startDate": "2025-06-01", "email": "test_user_espana1989@payflow.com", "phone": "+34620002400", "address": "Calle 1", "status": "active", "subsidiary": "A66213898" }, { "payrollId": "Emp02", "firstName": "Test User", "lastName": "Prueba Dos", "personalId": "12345672A", "iban": "ES7300351502021779400113", "grossSalary": 1500, "startDate": "2025-06-01", "email": "test_user_espana1988@payflow.com", "phone": "610304000", "address": "Calle 2", "status": "inactive", "subsidiary": "A66213898" }, { "payrollId": "Emp03", "firstName": "Test User", "lastName": "Prueba Tres", "personalId": "52345128X", "iban": "ES7400752841167757417475", "grossSalary": 5000, "startDate": "2022-08-15", "email": "test_user_espana4263@payflow.com", "phone": "+34620402401", "address": "Calle 3", "status": "active", "subsidiary": "A66213898" } ]In Postman it would look like this
3. Use the POST method pointing to the Payflow API /employeesendpoint with these batches of up to 500 employees.
To prepare employee payroll, the payments made on the Payflow platform must be correctly recorded in the payroll software so they can be deducted from that period's payroll.
The goal of this flow is to guarantee that the transactions made in Payflow are deducted from employee payroll.
Keep in mind that even though payroll is paid at the end of the month or fortnight, final settlements may be paid during the period to employees who are leaving. In those cases, the transactions made on the Payflow platform will need to be considered and deducted.
| Field name in the Payflow API | Description |
|---|---|
| id | Unique ID of each transaction |
| user | Identification document number of the employee who made the transaction |
| userPayrollId | Employee ID in your payroll software |
| amount | Amount of the transaction |
| fee | Transaction cost (always 0) |
| status | Transaction status |
| paid | Boolean confirming whether it was paid or not |
| requestedAt | Date and time of the request by the employee |
| paidAt | Date and time the transaction was received |
| message | N/A |
| informedToIntegration | Boolean confirming whether the transaction was reported to the payroll software or not |
status field)The API will only show you the processedandprocessingstatuses, but we are leaving the detail here so you know the rest.
| Status | Definition | Is it a final status? |
|---|---|---|
| pending | Pending: The payment has been requested by the employee but has not yet been sent to the bank for execution. | NO |
| processing | Processing: The payment has been sent to the bank; it has not been confirmed yet. | NO |
| processed | Processed: The bank has confirmed that the transaction was processed successfully. | YES |
| canceled | Cancelled: The transaction was cancelled and was not paid. | YES |
| delayed | Delayed: The transaction was sent to the bank but is delayed. | NO |
| error | The bank has reported that there is an error with this transaction and it cannot be processed; the transaction was not paid. | YES |
The API will show you all transactions with status=processedorprocessing, one by one, that have been made at your company, unless you use parameters in the headers to filter them.
paid Boolean to show only the transactions that have or have not been paid paid = true— returns the transactions paid so farpaid = false— returns the transactions not paid so farIn Postman it would look like this:
convoluted Boolean that shows the sum of the transactions along with the transaction id for each employee at the company. convoluted = true— returns the sum of transactions with their ids per employeeconvoluted = false— returns the transactions one by oneIn Postman it would look like this: And the JSON of the Payflow API response would look like this: { "data": [ { "ids": [ "luqmR001", "aaa4Fc2e28" ], "user": "1023765879", "userPayrollId": "abc39485", "amount": 130000, "fee": 0, "informedToIntegration": false, "paid": true, "firstTransactionRequestedAt": "2025-01-24T00:00:00.000Z", "lastTransactionRequestedAt": "2025-01-28T14:28:29.000Z", "TransactionPaidAt": "2025-01-24T00:00:00.000Z", "lastTransactionPaidAt": "2025-01-28T14:28:29.000Z" }, { "ids": [ "aaa4Fc2e23", "aaa4Fc2e29" ], "user": "1098764900", "userPayrollId": "abc39489", "amount": 10000, "fee": 0, "informedToIntegration": false, "paid": true, "firstTransactionRequestedAt": "2025-01-24T00:00:00.000Z", "lastTransactionRequestedAt": "2025-02-03T13:41:55.000Z", "TransactionPaidAt": "2025-01-24T00:00:00.000Z", "lastTransactionPaidAt": "2025-02-03T13:41:55.000Z" } ] }
start Date from which the search starts, in YYYY-MM-DDformatIf you combine it with endyou can get the transactions between specific days.In Postman it would look like this:
end Date up to which the search ends, in YYYY-MM-DDformatIf you combine it with startyou can get the transactions between specific days.In Postman it would look like this:
cycle Payment cycle date in YYYY-MMformatIn Postman it would look like this:
/payments/acknowledge endpointinformedToIntegration variable from false (default value) to true.informedToIntegration=true) from the ones you have not yet reported (informedToIntegration=false)Operating standard: Query employee transactions using the GET method and the /paymentsendpointUse each transaction's idto identify it in your system so transactions are not duplicated.All ProcessingandProcessedpayments must be retrieved and posted as a payroll item, sinceProcessingpayments are already in the hands of the receiving bank and will becomeProcessedshortly.If you decide to implement acknowledge payments, you must use the PUT method and the /payments/acknowledgeendpointSuggested frequency: 1–2 times a day (if you have >1000 employees) or every 4–8 hours (if you have <1000 employees). This is fully configurable.
Avoid common mistakes: Before building this flow, make sure a payroll concept exists at your company for the Payflow transactions to land in and be deducted.
Technical tips: Make sure your system can handle the volume: CPU, memory, timeouts.
0. Meet the prerequisites: A payroll concept created in the HR Software to post the Payflow transaction deductions; it is usually called "Anticipo Payflow" Access to the Payflow dashboard — the team will give you access. The base URL and the endpoints: Testing environment: Base URL: https://api-public.payflow-dev.net Endpoint to use: https://api-public.payflow-dev.net/payments Production: Base URL: https://api-public.payflow.es Endpoint to use: https://api-public.payflow.es/payments The API key is the same one you generated for the employee flow Decide whether you will use any parameter to filter the transactions from the Payflow API
1. Use the GET method to extract the transaction data from Payflow. Example of the JSON returned by the endpoint { "data": [ { "id": "aaa4Fc2e291", "user": "12345228G", "userPayrollId": "Emp01", "amount": 20, "fee": 0, "status": "processed", "paid": true, "requestedAt": "2025-10-27T10:39:00.000Z", "paidAt": "2025-10-27T10:39:00.000Z", "message": null, "informedToIntegration": false }, { "id": "aaa4Fc2e292", "user": "12345672A", "userPayrollId": "Emp02", "amount": 100, "fee": 0, "status": "processed", "paid": true, "requestedAt": "2025-10-27T08:10:00.000Z", "paidAt": "2025-10-27T08:10:00.000Z", "message": null, "informedToIntegration": false } ] }In Postman it would look like this
2. Take the data you need from the Payflow API response and post it into the HR Software, in the payroll concept reserved for Payflow transactions. The data you need will vary depending on the HR Software and its requirements for creating a payroll item, but usually you take at least: idto identify the transaction and avoid duplicatesuserand/oruserPayrollIdto identify the employee the deduction applies toamountto post the amount to be deducted in the concept
3. (Optional but recommended) Use the PUT method pointing to the Payflow API /payments/acknowledgeendpoint to mark the transactions reported to the HR Software.This endpoint allows you to change the value of the informedToIntegrationvariable fromfalse(default value) totrue.Testing environment: Base URL: https://api-public.payflow-dev.net Endpoint to use: https://api-public.payflow-dev.net/payments/acknowledge Production: Base URL: https://api-public.payflow.es Endpoint to use: https://api-public.payflow.es/payments/acknowledge Example of the JSON to send in the request body { "paymentsToMarkAsInformed": [ "aaa4Fc2e1", "aaa4Fc2e2", "aaa4Fc2e3" ] }Example of the JSON returned by the endpoint { "paymentsMarked": [ "aaa4Fc2e1", "aaa4Fc2e2", "aaa4Fc2e3" ] }Once all the reported transactions are marked, on your next call to the /paymentsendpoint you will seeinformedToIntegration=trueon the transactions you sent in this step.
Here we will support you at every step and will be happy to schedule working sessions with you and your team to resolve any questions! The steps to implement this integration are:
Check the total number of employees both in the HR Software and in the Payflow dashboard (the easiest way is to download them to Excel from "view employees" in the Payflow dashboard and run these checks in Excel). Check that number broken down by legal entity, in case we are working with more than 1 legal entity, and confirm that they match. Sort the 'Net salary' column from lowest to highest. Review both the lowest and the highest salaries to confirm that the information was sent correctly and that there is no odd data such as 0s, negatives, extremely high numbers, etc. Review 5 people at random to check that the information is correct: name, salary, complete banking details, status and the tax identification number of the legal entity they belong to.
It is always good practice to set up some kind of monitoring of what is happening in the integration.
Development API URL: https://api-public.payflow-dev.net/
Development Dashboard: https://dashboard.payflow-dev.net/auth/login
Production API URL: https://api-public.payflow.es/
Production Dashboard: https://admin.payflow.es/auth/login