Skip to main content

Loyalty Bulk Orders

Bulk Orders v1 — APIM CI-v2 publication (AAB bulk sale journey)

Version
1.1.0
Status
Coming soon
Incident
No incident

How to use this API

1. Get credentials

Contact the APIM team (EXCHANGESYSTEMS.API@accor.com) to:

  1. Get an App created on the Developer Portal.
  2. Get the App's ApiKey (x-api-key header).
  3. 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

About us

We are far more than a worldwide leader. We are 300,000 hospitality experts placing people at the heart of what we do, and nurturing real passion for service and achievement beyond limits. We take care of millions of guests in our 5,000 addresses.