Sales
Environment: Live
Set up your service for selling airtime and data through Moolre.
# Sales
Set up your service for selling airtime and data through Moolre.
The Sales endpoints let you sell airtime and mobile data bundles on MTN, Telecel, and AT, paid from your Moolre wallet. Add top-ups to your app, reseller platform, or customer service tools.
## Before you begin
Before using the Airtime or Data Sales APIs, you must create a Sell on Our Platform Service in the Moolre App.
[Open the Moolre App](https://app.moolre.com/).
## Special payment pricing
Special payment pricing is available for businesses that want to sell airtime and data. Contact Moolre Support to request this pricing.
[Contact Moolre Support](mailto:hello@moolre.com?subject=Airtime%20and%20Data%20Sales%20pricing).
## Sales workflow
1. Create a Sell on Our Platform Service in the Moolre App.
2. For Data, look up a bundle ID and price with Bundles.
3. Sell airtime or the chosen data bundle from your wallet.
4. Confirm the final outcome with Sales Status.
## API reference
- [Airtime](https://docs.moolre.com/api/sales/airtime): Send airtime on MTN, Telecel, or AT, paid from a Moolre wallet. Minimum GHS 1.00.
- [Data](https://docs.moolre.com/api/sales/data): Send a network-specific data bundle, paid from a Moolre wallet. Its bundle price determines the charge; do not send amount.
- [Bundles](https://docs.moolre.com/api/sales/bundles): Look up bundle IDs, prices, quantities, validity, and categories, with an optional network filter. Choose a bundle from the matching network before making a Data sale.
- [Status](https://docs.moolre.com/api/sales/status): Check Airtime and Data sales within the paying wallet by original external reference, transaction ID, or returned sale reference. Read pending, sent, failed/refunded, and not-found outcomes.
## Handle pending sales
ASL11 means a sale is in progress, not that the airtime or data has been delivered. ASL06 is an uncertain outcome: the sale may still have gone through. Treat both as unfinished until Sales Status returns a final result.
Check the sale with Sales Status before retrying. Look it up with idtype 1 and the original externalref (or extid), using the same paying wallet accountnumber. Never generate a new external reference to resubmit a pending or uncertain sale.
Try It requests in Live mode make a real purchase from the selected wallet. Other replies from the sales server are returned unchanged; do not assume delivery for any code not documented on the endpoint page.
## Choose a data bundle
Data sales need a bundle ID instead of an amount. Call Bundles for the recipient's network, then pass the returned bundle value unchanged to the Data API with the matching network as channel. The bundle price determines what the wallet is charged, so do not send amount.
Bundles response keys map to sale channels: mtn → MTN, telecel → TELECEL, at → AT. Legacy numeric values are also accepted (1 = MTN, 6 = Telecel, 7 = AT); send them in network for Bundles and in channel for sales. An empty network array means no bundles are currently listed for that network.
## Sale outcomes
Sales Status returns data.txstatus with one of these values:
| txstatus | Outcome | Meaning |
| --- | --- | --- |
| 0 | Pending | The sale is not yet final. Check its status again before deciding what to do next. |
| 1 | Sent | The airtime or data sale was sent. |
| 2 | Failed and refunded | refundid identifies the refund transaction. |
| 3 | Not found | No sale was found for this lookup in the selected wallet. Check the wallet, identifier type, and identifier. |