Status Webhook
The MoneyGram Status Webhook allows receiving institution to asynchronously notify MoneyGram of transaction status changes. All updates are submitted by authorised receiving institutions via the SOAP updateStatus operation. The interface is idempotent, enabling receiving institutions to safely retry the same payload until MoneyGram confirms receipt.
The MoneyGram Partner Listener Service (PLS) enables Account Deposit partners to asynchronously notify MoneyGram of transaction status changes over a JSON REST interface. All status updates are initiated by authorised partners using the PUT Transaction Status operation. The interface is idempotent — partners may safely retry the same payload until MoneyGram acknowledges receipt.
Supported status updates
Pending
Transaction acknowledged; processing in progress.
Received
Funds successfully credited to the beneficiary.
Rejected
Transaction could not be fulfilled; marked as failure.
Retry
Transaction can be resent by MoneyGram.
Update flow
PUT request with Basic Auth credentials.
401; partner contacts MGI.
200 OK returned; no further polling required.
Endpoint hosts
| Environment | Base URL |
|---|---|
| UAT | https://extadpartner.moneygram.com/partnerconnect/v1 |
| Production | https://adpartner.moneygram.com/partnerconnect/v1 (confirmed during onboarding) |
Security configuration
- IP whitelisting — at the firewall level, MoneyGram whitelists partner IPs and allows SSL connections (TLS 1.2+) only from approved addresses.
- HTTP Basic Authentication — MoneyGram IT Security assigns a unique username and password per partner and per environment (UAT vs Production). The partner presents these credentials in the
Authorizationheader on every request; the Partner Listener Service authenticates them. - Credential management — credentials are issued during partner onboarding, must be stored securely, and must never be hardcoded.
HTTP headers
| Header | Required | Value |
|---|---|---|
Content-Type | Required | application/json |
Authorization | Required | Basic base64(username:password) |
X-MG-ClientRequestId | Recommended | UUID (max 64 chars). Must be unique within a single session for unique requests. |
Host | Required | As per environment noted above. |
Path parameters
| Parameter | Required | Type | Description |
|---|---|---|---|
mgiTransactionId | Required | String (8–20 digits) | MoneyGram transaction tracking ID passed in the transaction load API. Pattern: ^\d{8,20}$. |
Request fields
| Field | Required | Type | Description |
|---|---|---|---|
partnerTransactionId | Required | String (1–50) | Partner's unique transaction identifier. If the partner uses the MoneyGram transaction ID, pass the same value here. Pattern: ^[A-Za-z0-9_\-]{1,50}$. Also serves as the idempotency key. |
reasonCode | Required | String (5 digits) | Reason code for the transaction status. Must be a valid 5-digit code from the published catalog — see Partner reason codes. Invalid codes return 400 with errorCode 9300. |
partnerReasonMessage | Optional | String (max 500) | Partner's free-text reason message or description, for audit and logging. |
Example request
{
"partnerTransactionId": "PTX-2026-001234",
"reasonCode": "01504",
"partnerReasonMessage": "Transaction completed successfully"
}
curl -X 'PUT' \ 'https://extadpartner.moneygram.com/partnerconnect/v1/transactions/12345678901234/status' \ -H 'accept: application/json' \ -H 'Authorization: Basic dGVzdDp0ZXN0' \ -H 'Content-Type: application/json' \ -H 'X-MG-ClientRequestId: 8f14e45f-ceea-467a-a3a6-4e6b4d3a9c2f' \ -d '{ "partnerTransactionId": "PTX-2026-001234", "reasonCode": "01504", "partnerReasonMessage": "Transaction completed successfully" }'
Partner reason codes
Reason codes are grouped by category: 012xx pending, 014xx rejected, 015xx received, 016xx retry. Treat the catalog as authoritative — additional codes may be added over time, and partners should handle unknown codes gracefully.
PEN — Pending
| Code | Scenario |
|---|---|
01200 | Acknowledged — delivery in process |
01204 | Verify customer information |
01205 | Other pending |
01213 | Acknowledged — pending wallet setup |
01214 | Acknowledged — pending receiver confirmation |
01215 | Communication error with partner |
01216 | Pending KYC process |
REC — Received
| Code | Scenario |
|---|---|
01504 | Received — confirmed deposited / delivered |
01505 | Received — assumed deposited by partner |
REJ — Rejected
Rejection codes mark the transaction as a failure.
| Code | Scenario |
|---|---|
01401 | Account closed |
01402 | Account unavailable for deposit — unspecified reason |
01404 | Invalid account number |
01406 | Account no longer active |
01410 | Invalid transaction amount |
01424 | Invalid phone number |
01425 | Invalid email address |
01426 | Account ineligible — blocked account |
01427 | Account ineligible — business account |
01428 | Account ineligible — minor account |
01429 | Account ineligible — joint account |
01430 | Account ineligible — restricted account |
01431 | Mobile wallet not set up |
01432 | Invalid / insufficient ID |
01433 | Transaction declined by receiver |
01434 | Transaction expired |
01436 | Limit exceeded |
01437 | Regulatory reason |
01438 | Commercial account |
01439 | Account name mismatch |
01440 | Account exceeds monthly accumulated amount |
01441 | Account exceeds weekly accumulated amount |
01442 | Account exceeds daily accumulated amount |
01443 | Transaction amount over the limit |
01444 | Invalid receiver ID |
01445 | Transaction payment reversed |
01446 | Invalid account currency |
01447 | Technical reject by receiving payment processor |
01448 | Technical reject by receive country payment switch |
RTY — Retry
| Code | Scenario |
|---|---|
01601 | Submit retry |
01608 | Retry technical reject |
01609 | Retry prefund reject |
Responses
Every response — success or error — includes a server-generated requestId correlation ID. Quote this value when contacting support. All timestamps are UTC (ISO 8601 with Z suffix).
{
"status": "SUCCESS",
"message": "Transaction status updated successfully",
"mgiTransactionId": "12345678901234",
"requestId": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"timestamp": "2026-04-23T10:30:00Z"
}
Response fields
| Field | Required | Type | Description |
|---|---|---|---|
status | Optional | String | Status of the update operation, e.g. SUCCESS. |
message | Required | String | Human-readable success message. |
mgiTransactionId | Required | String | MoneyGram Transaction ID that was updated. |
requestId | Required | String (UUID) | Server-generated correlation ID. Quote this when contacting support. |
timestamp | Required | String (date-time) | UTC timestamp (ISO 8601) when the update was processed. |
{
"errorCode": 9300,
"errorMessage": "Reason code is not valid: 9999",
"timestamp": "2026-04-23T10:30:00Z",
"mgiTransactionId": "12345678901234",
"offendingField": "reasonCode",
"requestId": "f47ac10b-58cc-4372-a567-0e02b2c3d479"
}
{
"errorCode": 9002,
"errorMessage": "Authentication required. Authorization header is missing.",
"timestamp": "2026-04-23T10:30:00Z",
"offendingField": "Authorization",
"requestId": "f47ac10b-58cc-4372-a567-0e02b2c3d479"
}
{
"errorCode": 9200,
"errorMessage": "Agent is not authorized to update this transaction.",
"timestamp": "2026-04-23T10:30:00Z",
"mgiTransactionId": "12345678901234",
"requestId": "f47ac10b-58cc-4372-a567-0e02b2c3d479"
}
{
"errorCode": 9100,
"errorMessage": "Transaction does not exist.",
"timestamp": "2026-04-23T10:30:00Z",
"mgiTransactionId": "12345678901234",
"requestId": "f47ac10b-58cc-4372-a567-0e02b2c3d479"
}
{
"errorCode": 9001,
"errorMessage": "Method not allowed. Use PUT.",
"timestamp": "2026-04-23T10:30:00Z",
"requestId": "f47ac10b-58cc-4372-a567-0e02b2c3d479"
}
{
"errorCode": 9500,
"errorMessage": "Invalid status update. Transaction is already in terminal state.",
"timestamp": "2026-04-23T10:30:00Z",
"mgiTransactionId": "12345678901234",
"offendingField": "reasonCode",
"requestId": "f47ac10b-58cc-4372-a567-0e02b2c3d479"
}
{
"errorCode": 9600,
"errorMessage": "Rate limit exceeded. Retry after 30 seconds.",
"timestamp": "2026-04-23T10:30:00Z",
"requestId": "f47ac10b-58cc-4372-a567-0e02b2c3d479"
}
{
"errorCode": 9000,
"errorMessage": "Transaction status not updated. Internal system error.",
"timestamp": "2026-04-23T10:30:00Z",
"mgiTransactionId": "12345678901234",
"requestId": "f47ac10b-58cc-4372-a567-0e02b2c3d479"
}
ErrorResponse fields
| Field | Required | Type | Description |
|---|---|---|---|
errorCode | Required | Integer | Error code identifying the type of error. See Error codes. |
errorMessage | Required | String | Human-readable error message. |
timestamp | Required | String (date-time) | UTC timestamp (ISO 8601) when the error occurred. |
mgiTransactionId | Optional | String | MoneyGram Transaction ID passed in the request URL, when known. |
offendingField | Optional | String | Name of the field that caused the failure, when applicable. |
requestId | Required | String (UUID) | Server-generated correlation ID. Quote this when contacting support. |
Error codes
| HTTP | Code | Message | Expected partner handling |
|---|---|---|---|
400 | 9003 | Invalid request. mgiTransactionId cannot be empty. | Correct the request and resend. |
400 | 9004 | Invalid request. reasonCode cannot be empty. | Correct the request and resend. |
400 | 9005 | Invalid request. partnerTransactionId cannot be empty. | Correct the request and resend. |
400 | 9300 | Reason code is not valid. | Retry with the correct reason code. |
401 | 9002 | Authentication required / Authentication failed. | Push callback to error queue; contact MGI Support; retry only after updated credentials are confirmed. |
403 | 9200 | Agent is not authorized to update this transaction. | Verify credentials and contact MGI Support if needed. |
404 | 9100 | Transaction does not exist. | Contact MGI Support. |
405 | 9001 | Method not allowed. Use PUT. | Correct the HTTP method and resend. |
409 | 9500 | Invalid status update. Transaction is already in terminal state. | Raise alert and investigate immediately. Do not retry. |
429 | 9600 | Too Many Requests — rate limit exceeded. | Honour the Retry-After header before resending. |
500 | 9000 | Transaction status not updated. Internal system error. | Retry the identical payload until successful. |
Idempotency
mgiTransactionId is used as the idempotency key. Partners may safely resend the same payload when the request times out, the response is not received, a communication failure occurs, or a temporary server issue occurs. Retries must use identical transaction identifiers and the same status payload. It is also recommended to pass a unique X-MG-ClientRequestId UUID per request for end-to-end traceability.
Retry guidance
- Retry only with the identical payload (same
mgiTransactionId,partnerTransactionId, andreasonCode). - On
429, honour theRetry-Afterresponse header before resending. - On
500or timeout, queue the callback and retry with backoff until a successful response is received. - Do not retry on
409(terminal state) — investigate instead. - If callbacks continue to fail, contact MGI Support quoting the
requestIdfrom the latest response.
- Retry only with the identical payload.
- A
409on a transaction already in the requested terminal state indicates the original update was applied — treat as resolved, do not loop. - Manual callback support — including bulk replay — must be available on request from MoneyGram Operations.
Implementation expectations
| Capability | Expectation |
|---|---|
| Authentication | Use MoneyGram-issued credentials over TLS 1.2+ with HTTP Basic Authentication; source IPs whitelisted by MoneyGram. |
| Idempotency | Safe retry of identical callback payloads, keyed on mgiTransactionId. |
| Status mapping | Send only valid 5-digit reason codes from the published catalog. |
| Transaction linking | mgiTransactionId in the URL must match the transaction tracking ID from the transaction load API. |
| Retry support | Queue and retry failed callbacks per the retry guidance above. |
| Monitoring | Queue and monitor failed callbacks; log requestId values for support correlation. |
| Manual operations | Support manual and bulk callback replay on request. |
Updated about 1 month ago
