Status Webhook
The MoneyGram Status Webhook 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
Transaction acknowledged; processing in progress.
Funds successfully credited to the beneficiary.
Transaction could not be fulfilled; marked as failure.
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 | Required | 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.
Pending Codes
| 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 |
Received
| Code | Scenario |
|---|---|
01504 | Received — confirmed deposited / delivered |
01505 | Received — assumed deposited by partner |
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 |
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 | Follow the steps outlined in the Retry guidance section. |
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,500, or timeout, queue the callback and retry at the following elapsed times after the initial attempt: 2 minutes, 10 minutes, 30 minutes, 60 minutes, 2 hours, 4 hours, 8 hours, 12 hours, 16 hours, 20 hours, and 24 hours. - Stop retrying once a successful response is received.
- Do not retry on
409(terminal state) — investigate instead. - If the issue persists after 24 hours, contact the MoneyGram Support team and include the
requestIdfrom the latest response, if available.
- 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 9 days ago
