Getting Started
This guide walks you from zero to a verified subscription in four steps. All endpoints are JSON over HTTPS; every request must originate from an IP allowlisted on your merchant account.
Step 1 - Receive credentials
After the commercial requirements and onboarding phase is done, Noju will share an API key and the service_code(s) provisioned for your merchant account. You receive a single API key per environment (sandbox and/or production), and your egress IPs are allowlisted as part of onboarding. Treat the key as an opaque secret; for rotation, contact your Noju account manager.
Step 2 - First request
Once you have your API key, export it and POST to /subscriptions/init:
export NOJU_API_KEY='your-api-key'
curl -X POST 'https://merchants.noju.io/subscriptions/init' \
-H 'Content-Type: application/json' \
-H "API-KEY: $NOJU_API_KEY" \
-d '{
"msisdn": "60123456789",
"service_code": "NORDVPN",
"country_code": "my",
"language": "en"
}'
A successful response returns a verif_request_id (for OTP flows) or carrier-channel hints such as short_code and keyword (for SMS-driven flows).
Step 3 - Verify the OTP
When the subscriber receives the OTP, submit it together with the verif_request_id from Step 2:
curl -X POST 'https://merchants.noju.io/subscriptions/verify' \
-H 'Content-Type: application/json' \
-H "API-KEY: $NOJU_API_KEY" \
-d '{
"verif_request_id": "550e8400-e29b-41d4-a716-446655440000",
"otp": "1234"
}'
A status: "SUCCESS" response means the subscription is active and the first charge has been attempted (for non-PSMS flows).
Step 4 - Check status
To reconcile state at any time, POST the subscription_id to /subscriptions/status:
curl -X POST 'https://merchants.noju.io/subscriptions/status' \
-H 'Content-Type: application/json' \
-H "API-KEY: $NOJU_API_KEY" \
-d '{ "subscription_id": "550e8400-e29b-41d4-a716-446655440000" }'
The response includes the subscription's current state, MSISDN, service, and lifecycle timestamps.
What's next
- Authentication — header format, IP allowlist, and key rotation.
- Conventions — the response envelope and the HTTP-vs-
status_codesemantics. - Errors — global error codes and the carrier-error catalog.