How to use this API
1. Get credentials
Contact the APIM team (EXCHANGESYSTEMS.API@accor.com) to:
- Get an App created on the Developer Portal.
- Get the App's ApiKey (
x-api-keyheader). - Get credentials from the Loyalty team for the roles below.
| Endpoint | Required role (one of) |
|---|---|
POST /bulk-order |
ROLE_SUBSCRIPTION_PAYMENT, ROLE_PARTICIPANT |
PATCH /bulk-order |
ROLE_SUBSCRIPTION_PAYMENT, ROLE_PARTICIPANT |
GET /bulk-order/{bulkOrderId} |
ROLE_SUBSCRIPTION_GETINFO, ROLE_PARTICIPANT |
2. Base URLs (CI-v2)
| Environment | Base URL |
|---|---|
| DEV | https://dev-api.accor.com/loyalty/v1/bulk-orders |
| REC | https://rec-api.accorhotels.com/loyalty/v1/bulk-orders |
| PRE-PROD | https://pre-api.accor.com/loyalty/v1/bulk-orders |
| PROD | https://api.accor.com/loyalty/v1/bulk-orders |
3. Example — create a bulk order
curl -X POST "https://rec-api.accorhotels.com/loyalty/v1/bulk-orders/bulk-order" \
-H "x-api-key: <YOUR_API_KEY>" \
-H "Authorization: Bearer <YOUR_JWT>" \
-H "Content-Type: application/json" \
-d '{
"employeesPmids": ["111111111", "222222222"],
"administratorPmid": "999999999",
"companyId": "C-0001",
"companyName": "ACME Corp",
"scCode": "SC-42",
"productCode": "3086167",
"subscriptionPlanCriteria": {
"subscriptionCode": "ALL_ACCOR_BUSINESS",
"action": "NEW",
"plan": "standard"
},
"paymentChannel": "EMAIL"
}'
The response contains the functional bulkOrderId and a redirectPayment link:
{
"bulkOrderId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"redirectPayment": "https://payment.accor.com/pay/3fa85f64"
}
4. Example — confirm the payment of a bulk order
Call this once the payment provider knows the outcome. bulkOrderId is the
identifier returned by POST /bulk-order. paymentResult is one of PAID,
FAILED or EXPIRED.
curl -X PATCH "https://rec-api.accorhotels.com/loyalty/v1/bulk-orders/bulk-order" \
-H "x-api-key: <YOUR_API_KEY>" \
-H "Authorization: Bearer <YOUR_JWT>" \
-H "Content-Type: application/json" \
-d '{
"bulkOrderId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"paymentResult": "PAID"
}'
PAID answers with status PAYMENT_DONE and starts card crediting in the
background. FAILED and EXPIRED answer with status PAYMENT_FAILED and
credit no card. The response does not include per-member results:
{
"bulkOrderId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"status": "PAYMENT_DONE",
"paymentResult": "PAID"
}
5. Example — read a bulk order
curl -X GET \
"https://rec-api.accorhotels.com/loyalty/v1/bulk-orders/bulk-order/3fa85f64-5717-4562-b3fc-2c963f66afa6" \
-H "x-api-key: <YOUR_API_KEY>" \
-H "Authorization: Bearer <YOUR_JWT>"
6. Troubleshooting
| HTTP | Likely cause |
|---|---|
400 |
POST: missing productCode, missing/empty/duplicate employeesPmids, missing administratorPmid or subscriptionPlanCriteria. PATCH: missing bulkOrderId (BULK_ORDER_ID_REQUIRED) or paymentResult (PAYMENT_RESULT_REQUIRED) |
401 Unauthorized |
JWT missing, expired, or wrong signature |
403 Forbidden |
JWT valid but role insufficient, or source IP not whitelisted (preprod/prod) |
404 Not Found |
No bulk order matches the given bulkOrderId (GET or PATCH, application/problem+json) |
412 Precondition Failed |
POST: product not eligible to the bulk sale journey (PRODUCT_NOT_ALLOWED_FOR_BULK). PATCH: the sale is not waiting for payment (BULK_SALE_NOT_WAITING_PAYMENT). A PAID call is still accepted while the status is PAYMENT_DONE |