mom-factura-webhooks

Implement webhook-based payment confirmation for Mom Factura API. Webhooks work for both Bank Reference and E-kwanza, sending two sequential events (payment.confirmed + invoice.created). Use when building payment confirmation flows, receiving webhook notifications, or handling order state transitions from OPEN to PAID. Status polling endpoints available as fallback.

Safety Notice

This listing is imported from skills.sh public index metadata. Review upstream SKILL.md and repository scripts before running.

Copy this and send it to your AI assistant to learn

Install skill "mom-factura-webhooks" with this command: npx skills add ithustle/momenu-skills/ithustle-momenu-skills-mom-factura-webhooks

Mom Factura Webhooks & Status

Receive payment confirmations for deferred payments (Bank Reference and E-kwanza) via webhook with two sequential events. Status polling endpoints available as fallback.

Base URL: https://api.momenu.online Auth: x-api-key header required on all requests.

How It Works

  1. Login at momenu.toquemedia.net
  2. Go to the Desenvolvedores menu
  3. Add your webhook URL
  4. Save the configuration

When a payment is confirmed, the API sends two sequential webhook events to your URL:

  1. payment.confirmed — Sent immediately after the order status is updated to PAID (before invoice generation). Use this to update the order state in your system.
  2. invoice.created — Sent after the invoice PDF is generated and uploaded. Includes the invoiceUrl field with the download link.

Non-paid events (cancelled, failed, error) are sent as a single event without the event field, maintaining backward compatibility.

Webhook Payloads

Event 1: payment.confirmed

{
  "event": "payment.confirmed",
  "merchantTransactionId": "abc123...",
  "ekwanzaTransactionId": "EKZ456...",
  "operationStatus": "1",
  "operationData": { ... }
}

Event 2: invoice.created

{
  "event": "invoice.created",
  "merchantTransactionId": "abc123...",
  "ekwanzaTransactionId": "EKZ456...",
  "operationStatus": "1",
  "operationData": { ... },
  "invoiceUrl": "https://invoice-momenu.toquemedia.net/invoices/..."
}

Non-paid events (no event field)

{
  "merchantTransactionId": "abc123...",
  "ekwanzaTransactionId": "EKZ456...",
  "operationStatus": "3",
  "operationData": { ... }
}

operationStatus values: "1" Paid · "3" Cancelled/Expired · "4" Failed/Refused · "5" Error

Webhook Server Example - Node.js / Express

const express = require("express");
const app = express();

app.use(express.json());

app.post("/webhook/meu-webhook", (req, res) => {
  const { event, merchantTransactionId, operationStatus, invoiceUrl } = req.body;

  switch (event) {
    case "payment.confirmed":
      console.log("Payment confirmed:", merchantTransactionId);
      // Update order state in your system
      break;

    case "invoice.created":
      console.log("Invoice ready:", invoiceUrl);
      // Save invoice URL, send to customer
      break;

    default:
      // Events without "event" field (cancelled, failed, error)
      if (["3", "4", "5"].includes(operationStatus)) {
        console.log("Payment failed:", operationStatus);
      }
  }

  res.status(200).json({ received: true });
});

app.listen(3000);

Webhook Server Example - Python / Flask

from flask import Flask, request, jsonify

app = Flask(__name__)

@app.route("/webhook/meu-webhook", methods=["POST"])
def momenu_webhook():
    data = request.json
    event = data.get("event")
    transaction_id = data.get("merchantTransactionId")
    status = data.get("operationStatus")

    if event == "payment.confirmed":
        print(f"Payment confirmed: {transaction_id}")
        # Update order state

    elif event == "invoice.created":
        invoice_url = data.get("invoiceUrl")
        print(f"Invoice ready: {invoice_url}")
        # Save invoice URL

    elif status in ["3", "4", "5"]:
        print(f"Payment failed: {status}")

    return jsonify({"received": True}), 200

Fallback: Status Polling

If webhook delivery fails, use status endpoints as fallback:

E-kwanza: GET /api/payment/ekwanza/status/:code Reference: GET /api/payment/reference/status/:operationId

When paid, both return invoiceUrl.

async function checkEkwanzaStatus(code) {
  const response = await fetch(
    `https://api.momenu.online/api/payment/ekwanza/status/${code}`,
    { headers: { "x-api-key": "YOUR_API_KEY" } }
  );

  const data = await response.json();

  if (data.status === "paid") {
    console.log("Paid! Invoice:", data.invoiceUrl);
  }

  return data;
}

Notes

  • Webhook works for both Bank Reference and E-kwanza
  • Webhook delivery is fire-and-forget (no retries) — implement status endpoints as fallback
  • Your webhook endpoint must return HTTP 2xx to acknowledge receipt
  • MCX payments are immediate and do not use webhooks or polling
  • Rate limiting: 100 req/min general, minimum 5s interval for E-kwanza polling, 30s for Reference polling

Source Transparency

This detail page is rendered from real SKILL.md content. Trust labels are metadata-based hints, not a safety guarantee.

Related Skills

Related by shared tags or category signals.

General

mom-factura-payments

No summary provided by upstream source.

Repository SourceNeeds Review
General

mom-factura-testing

No summary provided by upstream source.

Repository SourceNeeds Review
Automation

Feishu Calendar Intelligent Scheduler

飞书智能日历调度器 - 自动推荐最佳会议时间,批量管理日程,生成会议报表

Registry SourceRecently Updated
Automation

Cyber Horn

Turn text into spoken Feishu (Lark) voice messages. Use when the agent should speak in a Feishu group, send voice alerts or announcements, or reply with a pl...

Registry SourceRecently Updated
mom-factura-webhooks | V50.AI