Upload Beneficiaries Bulk Issuance
Uploads one or more files (CSV / Excel) containing beneficiary data for a previously created bulk issuance. This is the recommended approach for large batches (100+ records) instead of embedding all beneficiaries in the JSON body of the create call.
Typical Flow for Large Batches
1. POST /v1/corporate-issuances/ → issuanceType: Bulk, beneficiaries: []
Response: applicationNumber + CREATED status
2. POST /file/upload/beneficiary/bulk-upload/{applicationNumber}
→ Upload CSV file with beneficiary rows
Response: list of uploaded file references
3. POST /state-transition → APPROVED
4. GET /fetch-by-status/SUCCESS → poll for completion
CSV Format
The file should have one beneficiary per row with columns matching the
CorporateBeneficiary schema fields (mobile, firstName, lastName, email, etc.).
Contact M2P support for the exact template.
Server
Use the corporate server URLs for this endpoint.
Authorization
bearerAuth tenantId JWT Bearer token from the Authentication API
In: header
Your unique tenant identifier assigned during onboarding
In: header
Path Parameters
Application number created by the initial POST /v1/corporate-issuances/ call
Header Parameters
Your unique tenant identifier
Request Body
multipart/form-data
One or more CSV/Excel files with beneficiary data
Response Body
application/json
application/json
application/json
curl -X POST "https://sandbox-api.m2pprepaid.com/prepaid/middleware/v1/corporate-issuances/file/upload/beneficiary/bulk-upload/BULK-APP-2026-001" \ -H "X-TENANT-ID: ACME_CORP"{
"result": [
{
"fileId": "file-001",
"fileName": "beneficiaries-batch1.csv",
"status": "UPLOADED",
"recordCount": 150
}
],
"pagination": null
}{
"type": "https://www.m2pfintech.com/problem/problem-with-message",
"title": "Bad Request",
"status": 400,
"detail": "Unable to convert http message",
"message": "error.http.400"
}{
"type": "https://www.m2pfintech.com/problem/problem-with-message",
"title": "string",
"status": 0,
"detail": "string",
"message": "error.http.400",
"businessCode": "string",
"fieldErrors": [
{
"field": "string",
"message": "string"
}
],
"cause": {},
"errorCode": "string",
"errors": [
"string"
],
"languageCode": "string",
"localizedMessage": "string",
"suppressed": [
{}
]
}Fetch FX Rates POST
Fetches the exchange rate between a source currency and destination currency. Use this to display rates to the customer before loading the forex card. ### Rate Types | Type | Description | |------|-------------| | `IBR` | Interbank Rate | | `CARD` | Card rate (product-configured) | | `MID` | Mid-market rate | ### Response Returns `buyRate` (rate at which platform buys foreign currency) and `sellRate` (rate at which platform sells to customer).
Approve/Reject Prepaid Issuance POST
Approves or rejects a pending corporate card issuance as part of the maker-checker compliance workflow. Required for both **Single** and **Bulk** issuances before cards are provisioned. ### Transitions | From Status | To Status | Description | |-------------|-----------|-------------| | `CREATED` | `APPROVED` | Checker approves | | `CREATED` | `REJECTED` | Checker rejects | | `PENDING_APPROVAL` | `APPROVED` | Checker approves | | `PENDING_APPROVAL` | `REJECTED` | Checker rejects | ### Bulk Issuance Note For bulk issuances, approving via this endpoint approvesall beneficiaries that have not been explicitly rejected via `reject-beneficiaries`. Use `reject-beneficiaries` **before** calling this endpoint to exclude specific individuals from the batch. ### Server Use the **corporate** server URLs for this endpoint.
