Mom factura webhooks
Implement webhook-based payment confirmation for Mom Factura API. Webhooks work for Bank Reference, 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 endpoint available as fallback.From its SKILL.md
npx -y skills add ithustle/momenu-skills --skill mom-factura-webhooksAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
2 things to look at
- no licenseNo license file was found in the repository. Code published without one is not open source by default, so using it at work is a question for whoever answers licensing questions where you are.
- 1 stars1 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its file declares
Copied from the file, not written here
The file declares its own license as MIT. That is the author’s claim about this one file, and it is not the same thing as the license GitHub reports for the repository, which is listed with the other numbers below.
SKILL.md
4.7 KB, ~1.1k tokens by cl100k_base, as published. Nobody here has run it
Mom Factura Webhooks & Status
Receive payment confirmations for deferred Bank Reference payments via webhook with two sequential events. Status polling endpoint available as fallback.
Base URL: https://api.momenu.online
Auth: x-api-key header required on all requests.
How It Works
- Login at momenu.toquemedia.net
- Go to the Desenvolvedores menu
- Add your webhook URL
- Save the configuration
When a payment is confirmed, the API sends two sequential webhook events to your URL:
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.invoice.created— Sent after the invoice PDF is generated and uploaded. Includes theinvoiceUrlfield 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 the status endpoint as fallback:
Reference: GET /api/payment/reference/status/:operationId
When paid, it returns invoiceUrl.
async function checkReferenceStatus(operationId) {
const response = await fetch(
`https://api.momenu.online/api/payment/reference/status/${operationId}`,
{ headers: { "x-api-key": "YOUR_API_KEY" } }
);
const data = await response.json();
if (data.payment?.status === "paid") {
console.log("Paid! Invoice:", data.invoiceUrl);
}
return data;
}
Notes
- Webhook works for Bank Reference
- Webhook delivery is fire-and-forget (no retries) — implement the status endpoint 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 30s interval for Reference polling
What ships with it
Read from the repository
Just SKILL.md. No reference files, no scripts.