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

PEN

Pending

Transaction acknowledged; processing in progress.

REC

Received

Funds successfully credited to the beneficiary.

REJ

Rejected

Transaction could not be fulfilled; marked as failure.

RTY

Retry

Transaction can be resent by MoneyGram.

Update flow

1 Initiate status update Partner sends PUT request with Basic Auth credentials.
2 Validate credentials PLS authenticates the request against the MGI backend. Failure → 401; partner contacts MGI.
3 updateStatus operation Backend applies the status. System exception → re-initiate later. Business exception → contact MGI.
4 Success response 200 OK returned; no further polling required.

Endpoint hosts

EnvironmentBase URL
UAThttps://extadpartner.moneygram.com/partnerconnect/v1
Productionhttps://adpartner.moneygram.com/partnerconnect/v1 (confirmed during onboarding)
PUT /transactions/{mgiTransactionId}/status

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 Authorization header 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

HeaderRequiredValue
Content-TypeRequiredapplication/json
AuthorizationRequiredBasic base64(username:password)
X-MG-ClientRequestIdRecommendedUUID (max 64 chars). Must be unique within a single session for unique requests.
HostRequiredAs per environment noted above.

Path parameters

ParameterRequiredTypeDescription
mgiTransactionIdRequiredString (8–20 digits)MoneyGram transaction tracking ID passed in the transaction load API. Pattern: ^\d{8,20}$.

Request fields

FieldRequiredTypeDescription
partnerTransactionIdRequiredString (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.
reasonCodeRequiredString (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.
partnerReasonMessageOptionalString (max 500)Partner's free-text reason message or description, for audit and logging.

Example request

PUT /transactions/{mgiTransactionId}/status application/json
{
  "partnerTransactionId": "PTX-2026-001234",
  "reasonCode": "01504",
  "partnerReasonMessage": "Transaction completed successfully"
}
cURL shell
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

CodeScenario
01200Acknowledged — delivery in process
01204Verify customer information
01205Other pending
01213Acknowledged — pending wallet setup
01214Acknowledged — pending receiver confirmation
01215Communication error with partner
01216Pending KYC process

REC — Received

CodeScenario
01504Received — confirmed deposited / delivered
01505Received — assumed deposited by partner

REJ — Rejected

Rejection codes mark the transaction as a failure.

CodeScenario
01401Account closed
01402Account unavailable for deposit — unspecified reason
01404Invalid account number
01406Account no longer active
01410Invalid transaction amount
01424Invalid phone number
01425Invalid email address
01426Account ineligible — blocked account
01427Account ineligible — business account
01428Account ineligible — minor account
01429Account ineligible — joint account
01430Account ineligible — restricted account
01431Mobile wallet not set up
01432Invalid / insufficient ID
01433Transaction declined by receiver
01434Transaction expired
01436Limit exceeded
01437Regulatory reason
01438Commercial account
01439Account name mismatch
01440Account exceeds monthly accumulated amount
01441Account exceeds weekly accumulated amount
01442Account exceeds daily accumulated amount
01443Transaction amount over the limit
01444Invalid receiver ID
01445Transaction payment reversed
01446Invalid account currency
01447Technical reject by receiving payment processor
01448Technical reject by receive country payment switch

RTY — Retry

CodeScenario
01601Submit retry
01608Retry technical reject
01609Retry 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).

200 OK StatusUpdateResponse
Transaction status updated successfully application/json
{
  "status": "SUCCESS",
  "message": "Transaction status updated successfully",
  "mgiTransactionId": "12345678901234",
  "requestId": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
  "timestamp": "2026-04-23T10:30:00Z"
}

Response fields

FieldRequiredTypeDescription
statusOptionalStringStatus of the update operation, e.g. SUCCESS.
messageRequiredStringHuman-readable success message.
mgiTransactionIdRequiredStringMoneyGram Transaction ID that was updated.
requestIdRequiredString (UUID)Server-generated correlation ID. Quote this when contacting support.
timestampRequiredString (date-time)UTC timestamp (ISO 8601) when the update was processed.
400 Bad Request — invalid input data
ErrorResponse application/json
{
  "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"
}
401 Unauthorized — invalid or missing credentials
ErrorResponse application/json
{
  "errorCode": 9002,
  "errorMessage": "Authentication required. Authorization header is missing.",
  "timestamp": "2026-04-23T10:30:00Z",
  "offendingField": "Authorization",
  "requestId": "f47ac10b-58cc-4372-a567-0e02b2c3d479"
}
403 Forbidden — authenticated but not authorized for this transaction
ErrorResponse application/json
{
  "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"
}
404 Not Found — transaction does not exist
ErrorResponse application/json
{
  "errorCode": 9100,
  "errorMessage": "Transaction does not exist.",
  "timestamp": "2026-04-23T10:30:00Z",
  "mgiTransactionId": "12345678901234",
  "requestId": "f47ac10b-58cc-4372-a567-0e02b2c3d479"
}
405 Method Not Allowed — only PUT is supported
ErrorResponse application/json
{
  "errorCode": 9001,
  "errorMessage": "Method not allowed. Use PUT.",
  "timestamp": "2026-04-23T10:30:00Z",
  "requestId": "f47ac10b-58cc-4372-a567-0e02b2c3d479"
}
409 Conflict — invalid state transition
ErrorResponse application/json
{
  "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"
}
429 Too Many Requests — rate limit exceeded
ErrorResponse · headers: Retry-After, X-RateLimit-Limit, X-RateLimit-Remaining application/json
{
  "errorCode": 9600,
  "errorMessage": "Rate limit exceeded. Retry after 30 seconds.",
  "timestamp": "2026-04-23T10:30:00Z",
  "requestId": "f47ac10b-58cc-4372-a567-0e02b2c3d479"
}
500 Internal Server Error — backend system error
ErrorResponse application/json
{
  "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

FieldRequiredTypeDescription
errorCodeRequiredIntegerError code identifying the type of error. See Error codes.
errorMessageRequiredStringHuman-readable error message.
timestampRequiredString (date-time)UTC timestamp (ISO 8601) when the error occurred.
mgiTransactionIdOptionalStringMoneyGram Transaction ID passed in the request URL, when known.
offendingFieldOptionalStringName of the field that caused the failure, when applicable.
requestIdRequiredString (UUID)Server-generated correlation ID. Quote this when contacting support.

Error codes

HTTPCodeMessageExpected partner handling
4009003Invalid request. mgiTransactionId cannot be empty.Correct the request and resend.
4009004Invalid request. reasonCode cannot be empty.Correct the request and resend.
4009005Invalid request. partnerTransactionId cannot be empty.Correct the request and resend.
4009300Reason code is not valid.Retry with the correct reason code.
4019002Authentication required / Authentication failed.Push callback to error queue; contact MGI Support; retry only after updated credentials are confirmed.
4039200Agent is not authorized to update this transaction.Verify credentials and contact MGI Support if needed.
4049100Transaction does not exist.Contact MGI Support.
4059001Method not allowed. Use PUT.Correct the HTTP method and resend.
4099500Invalid status update. Transaction is already in terminal state.Raise alert and investigate immediately. Do not retry.
4299600Too Many Requests — rate limit exceeded.Honour the Retry-After header before resending.
5009000Transaction status not updated. Internal system error.Retry the identical payload until successful.

Idempotency

i
The Transaction Status operation is idempotent. 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, and reasonCode).
  • On 429, honour the Retry-After response header before resending.
  • On 500 or 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 requestId from the latest response.
!
Retry rules
  • Retry only with the identical payload.
  • A 409 on 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

CapabilityExpectation
AuthenticationUse MoneyGram-issued credentials over TLS 1.2+ with HTTP Basic Authentication; source IPs whitelisted by MoneyGram.
IdempotencySafe retry of identical callback payloads, keyed on mgiTransactionId.
Status mappingSend only valid 5-digit reason codes from the published catalog.
Transaction linkingmgiTransactionId in the URL must match the transaction tracking ID from the transaction load API.
Retry supportQueue and retry failed callbacks per the retry guidance above.
MonitoringQueue and monitor failed callbacks; log requestId values for support correlation.
Manual operationsSupport manual and bulk callback replay on request.


Did this page help you?