MoMo · AsyncAPI Specification

Momo Webhooks

Version

View Spec View on GitHub PaymentsMobile PaymentsFintechDigital WalletPayment GatewayQR PaymentsDisbursementBuy Now Pay LaterE-CommerceVietnamAsyncAPIWebhooksEvents

AsyncAPI Specification

Raw ↑
generated: '2026-08-26'
method: searched
source: >-
  https://developers.momo.vn/v3/docs/payment/api/result-handling/notification/,
  https://developers.momo.vn/v3/docs/business-page/user-activities/user-activities-list/,
  https://developers.momo.vn/v3/docs/business-page/user-activities/retry-mechanism/,
  https://developers.momo.vn/v3/docs/business-page/user-activities/implement-condition/
note: >-
  MoMo publishes NO AsyncAPI document, no event catalog in a machine-readable
  format, and no streaming surface — searched developers.momo.vn (212-URL
  sitemap), github.com/momo-wallet, and probed /asyncapi.json,
  /.well-known/* on every host. What it does publish is two real, documented
  server-to-server callback surfaces, captured here as a webhook catalog. This
  is a Webhooks artifact, not an AsyncAPI one, and it is typed that way in
  apis.yml on purpose.
surfaces:
- id: aio-ipn
  name: AIO v2 Instant Payment Notification (IPN)
  api: momo:aio-payment-gateway
  direction: MoMo -> merchant
  subscription: >-
    Per-request, not per-account: the merchant supplies an `ipnUrl` in the
    create/pay request body. There is no webhook registration console and no
    endpoint management API.
  transport: HTTPS POST
  content_type: application/json
  expected_response: HTTP 204 No Content, within 15 seconds
  signature:
    field: signature
    algorithm: HMAC-SHA256
    verification_required: true
    note: >-
      MoMo instructs merchants to validate the IPN signature AND to cross-check
      partnerCode, orderId and amount against their own database before acting.
  url_constraints: >-
    The ipnUrl must be a path only — no query parameters, no special characters,
    no unicode, no spaces.
  redirect_companion:
    method: GET
    field: redirectUrl
    note: >-
      A browser redirect with query parameters is delivered alongside IPN. It is
      a user-agent event, not a server event, and MoMo warns it can be lost when
      the user closes the browser — which is the stated reason IPN exists.
  payload_fields:
  - partnerCode
  - orderId
  - requestId
  - amount
  - orderInfo
  - orderType
  - transId
  - resultCode
  - message
  - payType
  - responseTime
  - extraData
  - signature
  event_semantics:
    resultCode_0: Transaction succeeded
    resultCode_9000: Transaction authorized successfully (awaiting capture or cancel)
    resultCode_other: Transaction failed — see errors/momo-error-codes.yml
  caveat: >-
    MoMo states explicitly that it will NOT use the merchant's IPN response to
    refund a transaction, for cash-flow and balance-reconciliation reasons. A
    non-2xx IPN response does not reverse anything.
  retry_policy: not-published
  docs: https://developers.momo.vn/v3/docs/payment/api/result-handling/notification/
- id: business-page-user-activities
  name: Business Page user-activity events
  api: momo:business-page-openapi
  direction: MoMo -> partner
  subscription: A partner-registered callback URL, registered with MoMo (not self-serve).
  transport: HTTPS
  event_count: 7
  events:
  - code: VIEW
    source: Business Page
    description: A user opened the page.
  - code: CLICK_ON_CTA
    source: Business Page
    description: A user tapped one of the page's main call-to-action buttons.
  - code: SUBSCRIBE
    source: Business Page
    description: A user followed the page.
  - code: UNSUBSCRIBE
    source: Business Page
    description: A user unfollowed the page.
  - code: REVIEW_POST
    source: Ratings & reviews
    description: A user posted a rating or review.
  - code: UPDATE_POST
    source: Posts
    description: A post's status changed.
  - code: COMMENT_POST
    source: Posts
    description: A user interacted with a post — like, comment, share, or reply to another user's comment.
  retry_policy:
    published: true
    schedule: [30 seconds, 5 minutes, 15 minutes]
    retry_counter: >-
      Redelivered events carry the same content plus a count of how many times
      the event has been retried.
    failure_terminal: >-
      If the partner's receiver is still not responding after the retry schedule
      is exhausted, MoMo stops sending events and marks the subscription
      inactive — the partner must reactivate it.
    docs: https://developers.momo.vn/v3/docs/business-page/user-activities/retry-mechanism/
not_published:
  asyncapi_spec: false
  event_schemas: >-
    No JSON Schema or machine-readable payload definition for either surface —
    payload fields are documented in HTML tables only.
  streaming: >-
    No WebSocket, SSE, Kafka, webhook-replay or event-history API on any MoMo
    surface.
  webhook_management_api: >-
    No API to create, list, rotate or delete callback endpoints. AIO endpoints
    are per-request; Business Page endpoints are registered with MoMo out of band.
  signing_key_rotation: >-
    The IPN signature reuses the merchant's secretKey; no separate webhook signing
    secret and no rotation procedure is documented.

Work with this as data

Every AsyncAPI spec here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for asyncapi

4 MCP tools reach this
  • find_asyncapisBrowse and filter every AsyncAPI spec in the catalog.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This AsyncAPI spec
curl "https://apis.io/api/v1/asyncapis/momo-webhooks"
All asyncapi
curl "https://apis.io/api/v1/asyncapis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no email required.

A second provider on the same verified email joins the account you already have.