This is the Service Requirement Document (SRD) for your certification build. Working only from this document and the linked API reference, you must configure a complete, working service on IremboHub — form, pricing, workflow, notifications, and integration endpoints — that lets a citizen renew their NovaSat TV decoder subscription.
NovaSat TV is a decoder/smartcard pay-TV operator. Subscriptions are monthly and post-paid: a subscriber renews every month, either with the same offer or by switching to a different offer (formula × options × duration). This is a sandbox certification scenario — every number in it is fictitious.
API reference for this build: NovaSat TV — Mobile Payment REST API (v1) (read and test every endpoint before you begin mapping).
ENG: Renew NovaSat TV Subscription
FR: Renouveler l'Abonnement Télé NovaSat
KINY: Kuvugurura Ifatabuguzi rya Televiziyo kuri NovaSat
New service category:
ENG: Internet and Subscription Services
KIN: Serivisi za Murandasi no Kwiyandikisha
FRE: Services d'Internet et d'Abonnement
Service group: create a group under the category above and name it consistently with the service (see naming conventions).
You are assessed on how you name things. Apply these rules:
renew-novasat-tv-subscription.idBase, numSubscriber, numContract, tokenId).The service implements the two NovaSat renewal flows (see §1.5 of the API reference):
typeOperation = 1): validate decoder → show current amount → citizen pays → registerAutomaticRenewal.typeOperation = 3): validate decoder → load offers → citizen picks formula/options/duration → verifyRenewalOffers returns the amount → citizen pays → registerStandardRenewal.The citizen is the Requester, IremboHub is the Integration layer, and NovaSat TV is the Partner API.
New Section: Decoder & Offer Details
New Blocks: Decoder Details, Offer Details
New Fields: Decoder number, Renew previous subscription?, Previous TV subscription offer, Previous subscription duration, TV subscription offer, Subscription duration (Months), Offer Option, Offer Price per Month, Total Price
| Section | Block | Field name (Label) | Type | List of values / Placeholder | Widget requirements | Validation Rules | Error Messages | Display Rules |
|---|---|---|---|---|---|---|---|---|
| ENG: Decoder & Offer Details FR: Détails du décodeur et de l'offre KINY: Amakuru ya dekoderi n'ikiguzi |
ENG: Offer Details FR: Détails de l'offre KINY: Amakuru y'ikiguzi |
ENG: Renew previous subscription? FR: Renouveler l'abonnement précédent? KINY: Kuvugurura ifatabuguzi riheruka? |
Radio Button | ENG: 1. Yes 2. No · FR: 1. Oui 2. Non · KINY: 1. Yego 2. Oya | If Yes, fetch: Previous TV subscription offer, Previous subscription duration, Total Price → typeOperation = 1.If No, fetch: list of TV subscription offers, offer price/month, subscription durations, offer options → typeOperation = 3. |
Required | This field is required | Always on display |
| ENG: Decoder number FR: Numéro du décodeur KINY: Nomero ya dekoderi |
Decoder Fetch | ENG: Enter your decoder number FR: Entrez votre numéro de décodeur KINY: Injiza nomero yawe ya dekoderi |
Save decoder number to the applicant's account. Fetch via checkAccount: idBase, numSubscriber, numContract, tokenId. |
Required (14 digits). If already saved, auto-fill (not disabled). | ENG: Sorry, we cannot find your decoder information… / This is a valid decoder, you can now proceed… (trilingual) | Display once a value is selected on "Renew previous subscription?" | ||
| idBase | Information List | Required, Hidden | Not displayed | |||||
| numSubscriber | Information List | Required, Hidden | Not displayed | |||||
| numContract | Information List | Required, Hidden | Not displayed | |||||
| tokenId | Information List | Value returned by checkAccount; must be carried into every subsequent endpoint call. | Required, Hidden | Not displayed | ||||
| ENG: Previous TV subscription offer FR: Offre précédente d'abonnement TV KINY: Ikiguzi cy'ifatabuguzi riheruka |
Information List | Displayed if "Yes" on "Renew previous subscription?" | ||||||
| ENG: Previous subscription duration (Months) FR: Durée de l'abonnement précédent (mois) KINY: Igihe ifatabuguzi riheruka ryamaze (Amezi) |
Information List | Displayed if "Yes" | ||||||
| ENG: Total Price FR: Prix total KINY: Igiciro |
Information List | Total price must be fetched from NovaSat TV System. | Displayed if "Yes" | |||||
| ENG: TV subscription offer FR: Offre d'abonnement KINY: Ikiguzi cy'ifatabuguzi rya televiziyo |
Fetched, Dropdown | Fetched dynamically from NovaSat TV System (getRenewalOffers). |
Required | This field is required | Displayed if "No" | |||
| ENG: Offer Price per Month FR: Prix de l'offre par mois KINY: Ikiguzi ku kwezi |
Information List | Displayed when a TV subscription offer is selected | ||||||
| ENG: Subscription duration (Months) FR: Durée de l'abonnement (mois) KINY: Igihe ifatabuguzi rizamara (Amezi) |
Fetched, Dropdown | Fetched dynamically from NovaSat TV System. | Required | This field is required | Displayed if "No" | |||
| ENG: Offer Option FR: Option d'offre KINY: Amahitamo y'ikiguzi |
Fetched, Multi-select Dropdown | Fetched dynamically from NovaSat TV System. | Optional | Displayed if "No" AND the selected offer is one of: FAMILY, PREMIUM, COMPLETE | ||||
| ENG: Total Price FR: Prix total KINY: Igiciro |
Information List | Total price must be fetched from NovaSat TV System (verifyRenewalOffers). |
Displayed if "No" |
RWF
3 hrs
| Condition | Price |
|---|---|
| "Yes" on "Renew previous subscription?" | Total price fetched from NovaSat TV (current offer). |
| "No" on "Renew previous subscription?" | Total price fetched from NovaSat TV once the applicant selects offer, option and duration (verifyRenewalOffers). |
The charged amount must equal the amount returned by NovaSat (
checkAccount/verifyRenewalOffers). No client-side price computation.
| Merchant | Payment Account Identifier |
|---|---|
| GOR | GOR-CG-RWF |
Use the shared certification payment code below — do not request or create a new one.
| Environment | Service payment code |
|---|---|
| UAT | RRA-4ed26a32b0 |
| Production | RRA-4ed26a32b0 |
Workflow: Apply-Pay-Integrate (Workflow 01) — IremboHub helps the applicant apply and pay, then routes the application to NovaSat's system for processing.
| Workflow Status | Label |
|---|---|
| Payment Pending | Payment Pending |
| Paid | Paid |
| Approved | ENG: Subscription Renewed FR: Abonnement renouvelé KINY: Ifatabuguzi yavuguruwe |
| Step | Title | Description (English) |
|---|---|---|
| 1 | Payment | Use your bill ID to pay for your service using any of the methods in the "Payment options" section. |
| 2 | Renewal Confirmation | After successful payment, you will receive a notification confirming the renewal of your TV subscription. |
5 mins
SMS
| Status | SMS Notification (English) |
|---|---|
| Pending Payment | Dear Applicant, your application for billing_number was successfully submitted! Fees to be paid: $Amount RWF. Pay before: DD-MM-YY HH:MM. For support, call 9099 |
| Paid | Dear Applicant, your application for billing_number was successfully paid! Application number: Amount_paid. For support, call 9099 |
| Approved | Dear Applicant, your NovaSat TV subscription has been successfully renewed and is valid until DD-MM-YY. Amount paid: decoder_number. For support, call 9099 |
(Provide the Kinyarwanda and French variants for each, and the corresponding Email subject + body — same content, trilingual, IremboGov footer.)
Build and test the following integration endpoints in IremboHub Service Manager, mapping each to the NovaSat TV — Mobile Payment REST API (v1).
There is no live NovaSat host. First build a mock of the NovaSat API (a Postman mock server, or any mock/stub service you control) that returns the payloads documented in the API reference — see §1.6 Building the mock on that page. Point
{{MpaymentRestUrl}}at your mock, test every endpoint against it, then reproduce the mapping in the platform against the same mock base URL.
Endpoint naming pattern: renew-novasat-tv__<method>__<fetch|push> — e.g. renew-novasat-tv__checkAccount__fetch.
| Endpoint | NovaSat method | Purpose | Triggered by |
|---|---|---|---|
…__checkAccount__fetch |
checkAccount |
Validate the decoder; load idBase, numSubscriber, numContract, tokenId (+ current offer or offers catalogue) |
Decoder number field |
…__getRenewalOffers__fetch |
getRenewalOffers |
Load the priced offers / durations / options | "Renew previous subscription? = No" |
| Endpoint | NovaSat method | Purpose | Triggered by |
|---|---|---|---|
…__verifyRenewalOffers__push |
verifyRenewalOffers |
Validate the formula/option/duration triplet; return the amount to pay | On offer/option/duration selection |
…__registerStandardRenewal__push |
registerStandardRenewal |
Commit the different-offer renewal after payment | On payment success (Integrate) |
…__registerAutomaticRenewal__push |
registerAutomaticRenewal |
Commit the same-offer renewal after payment | On payment success (Integrate) |
{{MpaymentRestUrl}} points at it.healthCheck is GET); Content-Type: application/json; endpoint marked Active.numCard, currency (RWF), operatorName (IREMBO), country (146), typeOperation, tokenId, idBase, numSubscriber, numContract, mainOffer, duration, optionsList, amount.1 for the same-offer flow, 3 for the different-offer flow, driven by "Renew previous subscription?".tokenId returned by checkAccount must flow unchanged into every subsequent endpoint.idBase, numSubscriber, numContract, offersList, amount, endDate, transactionId.returnCode = 1, surface errorLabel and block progression (e.g. 0013 unknown smartcard, 0100 unknown subscriber, 0141 transaction already done).registerStandardRenewal / registerAutomaticRenewal must equal the amount returned by verifyRenewalOffers / checkAccount.healthCheck (GET) endpoint for monitoring.Complete the API-parameter → form-field mapping table for every field consumed or produced by the endpoints above.
| API Parameter | Form Field |
|---|---|
idBase |
idBase (hidden) |
numSubscriber |
numSubscriber (hidden) |
numContract |
numContract (hidden) |
tokenId |
tokenId (hidden) |
mainOffer |
TV subscription offer |
duration |
Subscription duration (Months) |
optionsList |
Offer Option |
amount |
Total Price |
| … | (complete the remaining rows) |
| Transition | Document Generated | Type |
|---|---|---|
| Payment Pending | Invoice | |
| Paid | Receipt |
(Receipt and invoice are generated by default for all paid services.)
Certification is scored in two parts. You must pass both.
| Component | Weight in final grade | Requirement to pass |
|---|---|---|
| Course quizzes (aggregate of every quiz in the course) | 30% | Every quiz must be passed individually at ≥ 90%. |
| This practical build | 70% | Score ≥ 80% on the practical rubric below. |
There is no partial credit for the quiz component: if any single quiz is below 90%, the quiz gate is not met.
| Area | Weight (of practical) | What "pass" looks like |
|---|---|---|
| Form (structure, fields, display & validation rules, trilingual labels) | 20% | Conditional display works; hidden technical fields present; correct widgets. |
| Pricing (dynamic, currency, merchant, expiry) | 15% | Amount always sourced from NovaSat; no hard-coded prices. |
| Workflow (states, labels, next steps, SLA) | 15% | Apply-Pay-Integrate configured with correct trilingual labels. |
| Notifications (SMS + Email, trilingual, all statuses) | 10% | Correct variables; all three statuses; three languages. |
| Integrations / Endpoints | 30% | Mock built and faithful to the API reference; all 5 endpoints created, named per convention, Active, correctly mapped, token propagated, errors handled, amount integrity. |
| Naming & hygiene | 10% | Conventions followed; no leftover placeholders; clean labels. |
Practical pass mark: ≥ 80%.
Hard-fail conditions (automatic non-pass):
typeOperation or tokenId handling incorrect (renewals would misfire in production).tokenId and payment identifiers as sensitive: carry them between endpoints, but never log or expose them in the form UI.Workflow 01 — Apply · Pay · Integrate: all services where IremboHub helps the applicant apply and pay, then routes the application to the institution's system for processing.
API reference: NovaSat TV — Mobile Payment REST API (v1)
→ List each change request separately and articulate what the change is about.