Public API Documentation
Build with MSG4wrd.io API v5
Use the v5 API for authentication, SMS, calls, playable voice messages, private Hub synchronization, contacts, keyword webhooks, GSM modem devices, SMS campaigns, monitoring, top-ups, account limits, billing, and token QR codes.
All authenticated portal features are available to every account by default. Wallet credits and account limits govern usage.
https://api.msg4wrd.io
Authentication
Call /api/login, then send protected requests with a Bearer token.
Message Status
Response Format
Responses are JSON except authenticated audio downloads, which return audio bytes with byte-range support. Validation failures include a message and may include an errors map.
Calls and Voice Messages
- The Webapp is public and the Hub may stay on a private home network. The Hub initiates authenticated connections, uploads activity and polls for work; the public server does not need a Hub URL.
- On the Hub, enable Cloud activity and calls, bind the SIM/channel, and choose the incoming/outgoing SMS, call and voice switches. Call detection must be enabled. Incoming playable voice requires a saved voicemail/recording and a modem that supports recording.
- Cloud activity OFF keeps the existing SMS connection active but disables call/voice capture and remote call acceptance. Saving with it enabled, or Sync now, recovers missed call states and saved voicemail from bound channels since the worker was created; already captured events are not duplicated.
- Outbound SMS polling follows the Devices sender assignment. An enabled Both device owns the PH and US queues before country-specific devices. A sender_not_assigned response is a routing warning, even when HTTP is 200 and the legacy body status is 404; an empty queue has no routing warning.
- Conversation recording: hold the mic, speak, then release to preview. Slide left or press Escape to cancel; discard or explicitly Send the draft. HTTPS, browser microphone permission and MediaRecorder support are required. Recording stops before two minutes and is capped at 8 MiB.
- Send voice uploads audio to POST /api/v5/call/media, then queues POST /api/v5/call with one audio part. The Hub calls the recipient and plays the recording. POST /api/v5/inbound/reply continues to send text SMS.
- A queued single-audio call is immediately playable in its conversation from the uploaded source, even while the Hub is offline. The exact prepared audio replaces that source in the same entry after the Hub uploads it. Mixed text/audio calls become playable after preparation.
- Use preview_only:true to prepare text, audio or ordered mixed parts without dialing. Calls also provides mic recording and file upload. Review an unknown call result before creating a new request with a new idempotency key.
- Enable remote call acceptance for queued calls. Offline or paused workers retain captured events. Delivery retries are bounded; failed jobs are visible in the worker and can be retried. Activity uploads and audio retries do not redial a call.
Text + recording preview · POST /api/v5/call
{
"device_uid": "YOUR_HUB_DEVICE_UID",
"idempotency_key": "voice-preview-001",
"preview_only": true,
"parts": [
{
"type": "text",
"text": "Hello. Here is your recorded message."
},
{
"type": "audio",
"media_id": "22222222-2222-4222-8222-222222222222"
}
]
}POST /api/v5/send
Send SMS Status Flow
Send requests are documented separately because the API queues an outbound message first, then the sender workflow moves it through status codes.
curl -X POST "https://api.msg4wrd.io/api/v5/send?mobile=09171234567&message=Hello%20from%20MSG4wrd&local=0&priority=0" \ -H "Authorization: Bearer YOUR_TOKEN_HERE" \ -H "Accept: application/json"
Save the returned sent.id. That ID is the same value used for resend when the outbound message later fails.
curl -X POST "https://api.msg4wrd.io/api/v5/inbound/message/125/resend" \ -H "Authorization: Bearer YOUR_TOKEN_HERE" \ -H "Accept: application/json"
- 1Read messages from GET /api/v5/inbound or GET /api/v5/inbound/thread/{mobile}.
- 2Find a stored SMS with a positive id, type = sms, is_inbound = 0 and status = 3.
- 3Call POST /api/v5/inbound/message/{id}/resend using that message ID.
- 4A successful resend resets the same message to status 0 pending and returns the updated sent object.
The API accepted the request, charged the wallet, created the outbound SMS row, and returned the message ID in sent.id.
Store sent.id. The gateway/device worker picks up pending outbound messages for delivery.
The message is actively being processed by the sender workflow.
Do not resend yet. Continue reading the thread or inbound list until the status moves to success or failed.
The outbound SMS was marked as delivered/sent by the processing workflow.
No resend action is needed.
The outbound SMS failed and is eligible for API resend if it belongs to the authenticated account.
Call POST /api/v5/inbound/message/{id}/resend with the failed outbound message ID.
Endpoint Catalog
API v5 Routes
Base
Authentication bootstrap and session/token management.
/api/loginAuthenticate with email/password and receive a bearer token.
emailpasswordJSON Response Example
{
"token": "1|abc123...",
"user": {
"id": 1,
"firstname": "Juan",
"lastname": "Dela Cruz",
"email": "[email protected]"
}
}/api/v5/logoutEnd the current session without revoking the persisted API token.
JSON Response Example
/api/v5/tokens/createRegenerate the account API token and invalidate previous tokens.
JSON Response Example
{
"token": "2|xyz789..."
}/api/v5/tokens/qr-codeReturn a QR code data URI for the active API token.
JSON Response Example
{
"qr_code": "data:image/svg+xml;base64,PHN2Zy...",
"mime_type": "image/svg+xml"
}Account
Account wallet, usage, and device and outbound SMS limit metadata.
/api/v5/accountRetrieve wallet, account limits and usage, keyword usage, and active API token details.
JSON Response Example
{
"wallets": {
"balance": 150.00
},
"limits": {
"device_limit": 1,
"devices_used": 0,
"devices_remaining": 1,
"sms_daily_limit": 200,
"sms_sent_today": 0,
"sms_remaining_today": 200,
"sms_monthly_limit": 3000,
"sms_sent_this_month": 0,
"sms_remaining_this_month": 3000
},
"total_keyword_used": 3,
"authToken": "1|abc123...",
"realtime_channel": "account-realtime-channel"
}Send SMS
Outbound SMS queueing, status tracking, and failed-message resend behavior.
/api/v5/sendQueue an outbound SMS message using query parameters.
mobilemessagelocalsendernamepriorityJSON Response Example
{
"message": "Message queued successfully.",
"charged": 1,
"sent": {
"id": 124,
"mobile": "09171234567",
"normalized_mobile": "+639171234567",
"content": "Hello",
"sender": "default",
"is_inbound": 0,
"local": 0,
"priority": 0,
"status": 0,
"created_at": "2026-05-09T10:01:00.000000Z"
}
}Calls and Voice
Public call queue, private Hub execution, text-to-speech, audio uploads and authenticated playback.
/api/v5/callQueue a call on your Hub. The Hub converts text to speech and combines ordered text/audio parts into one message. It uploads prepared audio before dialing. Keep the same idempotency key and request body when retrying: new jobs return 202, identical requests 200, and a changed request with the same key 409. preview_only prepares audio without dialing.
device_uididempotency_keymobilepartsvoicepreview_onlyscheduled_atexpires_atRequest Example
{
"device_uid": "YOUR_HUB_DEVICE_UID",
"idempotency_key": "voice-reply-001",
"mobile": "+639171234567",
"parts": [
{
"type": "audio",
"media_id": "22222222-2222-4222-8222-222222222222"
}
]
}JSON Response Example
{
"id": "11111111-1111-4111-8111-111111111111",
"device_uid": "YOUR_HUB_DEVICE_UID",
"mobile": "+639171234567",
"idempotency_key": "voice-reply-001",
"parts": [
{
"type": "audio",
"media_id": "22222222-2222-4222-8222-222222222222"
}
],
"status": "queued",
"direction": "out",
"type": "call",
"preview_only": false,
"cancel_requested": false,
"audio_url": null,
"seconds": 0,
"scheduled_at": "2026-10-04T01:00:00.000000Z",
"expires_at": "2026-10-05T01:00:00.000000Z"
}/api/v5/callPaginated incoming and outgoing calls, newest first, with owned Hub presence. Preview-only jobs are omitted from this list; read them by ID. Unknown callers remain in Calls rather than being merged into a phone conversation. Read call details for any associated incoming voicemail.
directionstatusdevice_uidsearchfromtopageJSON Response Example
{
"data": [
{
"id": "11111111-1111-4111-8111-111111111111",
"device_uid": "YOUR_HUB_DEVICE_UID",
"mobile": "+639171234567",
"idempotency_key": "voice-reply-001",
"parts": [
{
"type": "audio",
"media_id": "22222222-2222-4222-8222-222222222222"
}
],
"status": "queued",
"direction": "out",
"type": "call",
"preview_only": false,
"cancel_requested": false,
"audio_url": null,
"seconds": 0,
"scheduled_at": "2026-10-04T01:00:00.000000Z",
"expires_at": "2026-10-05T01:00:00.000000Z"
}
],
"current_page": 1,
"last_page": 1,
"per_page": 20,
"total": 1,
"hubs": [
{
"device_uid": "YOUR_HUB_DEVICE_UID",
"name": "Home Hub",
"sender_country": "ph",
"online": true,
"last_seen_at": "2026-10-04T01:00:00.000000Z",
"capabilities": {
"accept_calls": true
}
}
]
}/api/v5/call/{id}Owned job or incoming call details, parts, timestamps, current state and authenticated audio_url. Jobs use UUIDs; local call log entries use activity-N. An incoming call has playable audio only when a saved recording exists. Prepared audio becomes available after the Hub uploads it.
idJSON Response Example
{
"id": "11111111-1111-4111-8111-111111111111",
"device_uid": "YOUR_HUB_DEVICE_UID",
"mobile": "+639171234567",
"idempotency_key": "voice-reply-001",
"parts": [
{
"type": "audio",
"media_id": "22222222-2222-4222-8222-222222222222"
}
],
"status": "ready",
"direction": "out",
"type": "call",
"preview_only": false,
"cancel_requested": false,
"audio_url": "/api/v5/call/media/22222222-2222-4222-8222-222222222222/audio",
"seconds": 12,
"scheduled_at": "2026-10-04T01:00:00.000000Z",
"expires_at": "2026-10-05T01:00:00.000000Z"
}/api/v5/call/{id}/cancelCancel a queued job immediately or request cancellation during preparation/calling. The Hub retrieves cancellation through heartbeat. A terminal job returns 409. Incoming activity-N entries are log records and cannot be cancelled through this route.
idJSON Response Example
{
"id": "11111111-1111-4111-8111-111111111111",
"device_uid": "YOUR_HUB_DEVICE_UID",
"mobile": "+639171234567",
"idempotency_key": "voice-reply-001",
"parts": [
{
"type": "audio",
"media_id": "22222222-2222-4222-8222-222222222222"
}
],
"status": "cancelled",
"direction": "out",
"type": "call",
"preview_only": false,
"cancel_requested": true,
"audio_url": null,
"seconds": 0,
"scheduled_at": "2026-10-04T01:00:00.000000Z",
"expires_at": "2026-10-05T01:00:00.000000Z"
}/api/v5/call/mediaUpload a browser recording or audio file using multipart/form-data. Returns a private media UUID and owner-only audio_url (201). Reference the UUID in an audio part. Non-PCM formats require FFmpeg on the Hub.
audiosecondsRequest Example
curl -X POST "https://api.msg4wrd.io/api/v5/call/media" \ -H "Authorization: Bearer YOUR_TOKEN_HERE" \ -H "Accept: application/json" \ -F "[email protected]" \ -F "seconds=12"
JSON Response Example
{
"id": "22222222-2222-4222-8222-222222222222",
"audio_url": "/api/v5/call/media/22222222-2222-4222-8222-222222222222/audio"
}/api/v5/call/media/{id}/audioAuthenticated audio bytes, with byte-range support for playback and seeking (200 or 206). This response is binary audio. Use a Range header such as bytes=0-1023 for partial playback. The portal streams through its authenticated session; never place a bearer token in a public audio URL.
id/api/v5/call/queue/claimHub protocol: claim one due job. Returns job:null if nothing is available, otherwise a preparing job, claim_token and audio-part download URLs. The lease lasts 10 minutes and heartbeat renews it. Started calls are never automatically reassigned or redialed.
device_uidcountriesRequest Example
{
"device_uid": "YOUR_HUB_DEVICE_UID",
"countries": [
0,
1
]
}JSON Response Example
{
"job": null
}/api/v5/call/heartbeatHub protocol: report presence/capabilities, renew active owned claims and retrieve cancellation IDs. Stale started calls become unknown. Review an unknown outcome before creating a deliberate new call.
device_uidcapabilitiesactiveRequest Example
{
"device_uid": "YOUR_HUB_DEVICE_UID",
"capabilities": {
"accept_calls": true
},
"active": [
{
"id": "11111111-1111-4111-8111-111111111111",
"claim_token": "CURRENT_CLAIM_TOKEN"
}
]
}JSON Response Example
{
"cancelled": [
"11111111-1111-4111-8111-111111111111"
]
}/api/v5/call/eventsHub protocol: post incoming/outgoing call snapshots or fenced job progress. Older versions cannot overwrite newer snapshots. Before dialing a job, upload its prepared audio, report ready, then report dialing and require an explicit authorized:true response. A successful HTTP response alone does not authorize dialing. Completion of a call requires answer confirmation.
device_uidlocal_idmobiledirectionstatusversionoccurred_atcall_job_idclaim_tokensecondsbodychannel_namesim_numberstarted_atanswered_atended_atRequest Example
{
"device_uid": "YOUR_HUB_DEVICE_UID",
"local_id": "hub-call-001",
"mobile": "+639171234567",
"direction": "in",
"status": "ended",
"version": 3,
"occurred_at": "2026-10-04T01:01:00Z",
"started_at": "2026-10-04T01:00:30Z",
"answered_at": "2026-10-04T01:00:42Z",
"ended_at": "2026-10-04T01:01:00Z",
"seconds": 18,
"channel_name": "Home SIM"
}JSON Response Example
{
"accepted": true,
"authorized": false,
"cancel_requested": false
}/api/v5/call/{id}/voiceHub protocol: upload the exact prepared audio for a currently claimed job using multipart/form-data, before ready/dialing. Returns its private media ID (201; 200 for identical audio). Changing saved audio or using a stale claim returns 409.
iddevice_uidclaim_tokenaudiosecondsRequest Example
curl -X POST "https://api.msg4wrd.io/api/v5/call/11111111-1111-4111-8111-111111111111/voice" \ -H "Authorization: Bearer YOUR_TOKEN_HERE" \ -H "Accept: application/json" \ -F "device_uid=YOUR_HUB_DEVICE_UID" \ -F "claim_token=CURRENT_CLAIM_TOKEN" \ -F "seconds=12" \ -F "[email protected]"
JSON Response Example
{
"id": "22222222-2222-4222-8222-222222222222"
}/api/v5/call/voiceHub protocol: upload a saved incoming voicemail/recording or local outgoing voice snapshot using multipart/form-data. Creates a voice_message conversation entry with playable private audio. Identity (account, Hub, local_id) is deduplicated: identical audio returns the existing ID; changed audio returns 409. Unknown callers are not merged into a phone thread.
device_uidlocal_idmobiledirectionversionoccurred_atsecondsaudioRequest Example
curl -X POST "https://api.msg4wrd.io/api/v5/call/voice" \ -H "Authorization: Bearer YOUR_TOKEN_HERE" \ -H "Accept: application/json" \ -F "device_uid=YOUR_HUB_DEVICE_UID" \ -F "local_id=hub-call-001" \ -F "mobile=+639171234567" \ -F "direction=in" \ -F "version=4" \ -F "occurred_at=2026-10-04T01:01:00Z" \ -F "seconds=12" \ -F "[email protected]"
JSON Response Example
{
"id": "22222222-2222-4222-8222-222222222222"
}/api/v5/sms/eventsHub protocol: import local outbound SMS snapshots into conversations without sending or charging the SMS again. Increasing versions update the same activity; retries retain their original version and timestamp.
device_uidlocal_idmobilestatusbodyversionoccurred_atchannel_namesim_numberRequest Example
{
"device_uid": "YOUR_HUB_DEVICE_UID",
"local_id": "hub-sms-002",
"mobile": "+639171234567",
"body": "Your request is ready.",
"status": "submitted",
"version": 2,
"occurred_at": "2026-10-04T01:00:00Z",
"channel_name": "Home SIM"
}JSON Response Example
{
"accepted": true
}Inbound
SMS, calls and voice messages share a normalized mobile thread. Use entry_key as the unique UI identity and type (sms, call or voice_message) to choose its presentation. Keep positive SMS IDs for SMS actions. call_status carries the detailed call state; audio_url and seconds describe owner-only playback. Numeric status remains 0=pending, 1=sending, 2=success, 3=failed. Only stored outgoing SMS entries can use SMS resend.
/api/v5/inboundList SMS, call and voice conversations, with the latest entry per normalized mobile and saved contact details.
searchpageJSON Response Example
{
"data": [
{
"id": -8,
"entry_key": "activity:8",
"type": "voice_message",
"mobile": "+639171234567",
"normalized_mobile": "+639171234567",
"content": "Voice message",
"sender": "",
"is_inbound": 1,
"status": 2,
"call_status": null,
"call_id": null,
"audio_url": "/api/v5/call/media/22222222-2222-4222-8222-222222222222/audio",
"seconds": 12,
"created_at": "2026-10-04T01:02:00.000000Z",
"from_mobile": "+639171234567",
"received_at": "2026-10-04T01:02:00.000000Z",
"contact_name": "Juan Dela Cruz",
"contact_mobile": "09171234567"
}
],
"current_page": 1,
"last_page": 1,
"per_page": 15,
"total": 1,
"realtime_channel": "account-realtime-channel"
}/api/v5/inbound/thread/{mobile}Retrieve the latest 500 SMS, call and voice entries for one mobile, oldest first. entry_key is the unique UI identity; audio_url is authenticated playback, seconds is the recording duration, and call_status is the detailed call state.
mobileJSON Response Example
{
"mobile": "+639171234567",
"variants": [
"09171234567",
"+639171234567"
],
"messages": [
{
"id": 123,
"entry_key": "sms:123",
"type": "sms",
"mobile": "09171234567",
"normalized_mobile": "+639171234567",
"content": "Hello",
"sender": "default",
"is_inbound": 0,
"local": 0,
"priority": 0,
"status": 2,
"created_at": "2026-10-04T01:00:00.000000Z"
},
{
"id": -7,
"entry_key": "activity:7",
"type": "call",
"mobile": "+639171234567",
"normalized_mobile": "+639171234567",
"content": "Incoming call ended",
"sender": "Home SIM",
"is_inbound": 1,
"status": 2,
"call_status": "ended",
"call_id": "activity-7",
"audio_url": null,
"seconds": 18,
"created_at": "2026-10-04T01:01:00.000000Z"
},
{
"id": -8,
"entry_key": "activity:8",
"type": "voice_message",
"mobile": "+639171234567",
"normalized_mobile": "+639171234567",
"content": "Voice message",
"sender": "",
"is_inbound": 1,
"status": 2,
"call_status": null,
"call_id": null,
"audio_url": "/api/v5/call/media/22222222-2222-4222-8222-222222222222/audio",
"seconds": 12,
"created_at": "2026-10-04T01:02:00.000000Z"
},
{
"id": 0,
"entry_key": "call:11111111-1111-4111-8111-111111111111",
"type": "voice_message",
"call_id": "11111111-1111-4111-8111-111111111111",
"mobile": "+639171234567",
"normalized_mobile": "+639171234567",
"content": "Voice message",
"sender": "",
"is_inbound": 0,
"status": 0,
"call_status": "queued",
"audio_url": "/api/v5/call/media/22222222-2222-4222-8222-222222222222/audio",
"seconds": 12,
"created_at": "2026-10-04T01:03:00.000000Z"
}
]
}/api/v5/inbound/replySend a manual reply to an inbound thread target.
mobilemessageJSON Response Example
{
"message": "Reply sent successfully.",
"sent": {
"id": 125,
"mobile": "09171234567",
"normalized_mobile": "+639171234567",
"content": "Reply text",
"sender": "default",
"is_inbound": 0,
"status": 0,
"created_at": "2026-05-09T10:02:00.000000Z"
}
}/api/v5/inbound/message/{id}/resendReset a failed outbound SMS message back to pending.
idJSON Response Example
{
"message": "Message queued for resend.",
"sent": {
"id": 125,
"mobile": "09171234567",
"normalized_mobile": "+639171234567",
"content": "Reply text",
"sender": "default",
"is_inbound": 0,
"status": 0,
"created_at": "2026-05-09T10:02:00.000000Z"
}
}/api/v5/inboundStore an inbound SMS from a registered device and run configured automations. Hub retries retain source_id and occurred_at to deduplicate ingestion and preserve its original time.
device_uidmobilemessagelocalsource_idoccurred_atRequest Example
{
"device_uid": "YOUR_HUB_DEVICE_UID",
"source_id": "hub-sms-001",
"mobile": "+639171234567",
"message": "Hello from the Hub",
"local": 0,
"occurred_at": "2026-10-04T01:00:00Z"
}JSON Response Example
{
"status": 200,
"message": "success"
}Contacts
Saved SMS contacts used by inbound lists and manual sends.
/api/v5/contactsList saved SMS contacts.
JSON Response Example
{
"data": [
{
"id": 1,
"name": "Juan Dela Cruz",
"mobile": "09171234567",
"created_at": "2026-05-09T10:00:00.000000Z",
"updated_at": "2026-05-09T10:00:00.000000Z"
}
]
}/api/v5/contactsCreate a saved SMS contact.
namemobileJSON Response Example
{
"message": "Contact added successfully.",
"contact": {
"id": 1,
"name": "Juan Dela Cruz",
"mobile": "09171234567",
"created_at": "2026-05-09T10:00:00.000000Z",
"updated_at": "2026-05-09T10:00:00.000000Z"
}
}/api/v5/contacts/{id}Update a saved SMS contact.
idnamemobileJSON Response Example
{
"message": "Contact updated successfully.",
"contact": {
"id": 1,
"name": "Juan Dela Cruz",
"mobile": "09171234567",
"created_at": "2026-05-09T10:00:00.000000Z",
"updated_at": "2026-05-09T10:05:00.000000Z"
}
}/api/v5/contacts/{id}Delete a saved SMS contact.
idJSON Response Example
SMS Campaigns
Recipient-file parsing, sample templates, draft creation, delivery reporting, reuse, and queued sending.
/api/v5/campaigns/parseParse an XLSX, CSV, or TXT recipient file into a validation preview.
file/api/v5/campaigns/template/{type}Download a basic, company, or unique-message sample template.
typeformat/api/v5/campaignsList campaigns plus aggregate recipient and delivery totals.
page/api/v5/campaignsSave a campaign draft without spending credits or sending messages.
namemessagesrecipientssource_filename/api/v5/campaigns/{id}Retrieve campaign totals, cost estimate, wallet balance, and recipient delivery statuses.
idpagestatus/api/v5/campaigns/{id}/duplicateLoad a previous campaign into the Copy and Use composer workflow.
id/api/v5/campaigns/{id}/sendQueue a draft after checking wallet credits and daily/monthly outbound limits.
idKeywords
Keyword routing, webhook assignment, devices, and linked mobile numbers.
/api/v5/keywords-devicesRetrieve keywords, mobile devices, and linked mobile numbers.
JSON Response Example
{
"keywords": [
{
"id": 1,
"keyword": "PAYMENT",
"webhook": "https://example.com/webhook",
"status": true
}
],
"devices": [
{
"id": 1,
"name": "Main GSM Modem",
"device_id": "DEVICE-001",
"mobile": "09171234567",
"status": true
}
]
}/api/v5/keyword/createCreate a keyword and webhook configuration.
keywordwebhookdevice_idewallet_channelis_default_webhookdefault_webhookstatusmobile_appJSON Response Example
{
"success": true,
"message": "Keyword created"
}/api/v5/keyword/{id}Update an existing keyword.
idkeywordwebhookdevice_idewallet_channelis_default_webhookdefault_webhookstatusmobile_appJSON Response Example
{
"success": true,
"message": "Keyword updated."
}/api/v5/keyword/{id}Delete an existing keyword.
idJSON Response Example
{
"success": true,
"message": "Keyword deleted."
}Devices
GSM modem device registration and management.
/api/v5/device/createRegister a new GSM modem device.
idis_updatenamedevice_idmobileis_autoreply_to_senderis_msg4wrdstatusJSON Response Example
{
"success": true,
"message": "Device registered"
}/api/v5/device/{id}Update a registered GSM modem device.
idnamedevice_idmobileis_autoreply_to_senderis_msg4wrdstatusJSON Response Example
{
"success": true,
"message": "Device updated."
}/api/v5/device/{id}Delete a registered GSM modem device.
idJSON Response Example
{
"success": true,
"message": "Device deleted."
}Sender Numbers
Blocked sender-number management for Philippine and US numbers.
/api/v5/sender-number/createAdd a number to the account’s blocked-sender list.
mobile/api/v5/sender-number/{id}Delete a blocked sender number owned by the account.
idBilling
Top-up offers, promos, limit add-ons, one-time checkout, payment history, and invoices.
/api/v5/credit-packagesList active credit top-ups, promos, and account-limit add-ons.
/api/v5/paymentsList one-time purchase and legacy payment history.
page/api/v5/payments/{id}/proofDownload the authenticated account’s own manual payment proof image.
id/api/v5/payments/gateway-settingsRead enabled payment gateways and public checkout configuration.
/api/v5/payments/gateway-settings/{gateway}/qrDownload the configured public QR image for GCash or Maya.
gateway/api/v5/checkout/paypal/orderCreate a PayPal order for an active offer.
credit_package_id/api/v5/checkout/paypal/order/{txn}/captureCapture a PayPal order and fulfill credits and limit increments once.
txn/api/v5/checkout/manualSubmit GCash or Maya payment details and proof for verification.
credit_package_idgatewayreference_numberproof/api/v5/billingList billing invoices and payment history.
pageJSON Response Example
{
"data": [
{
"id": 1,
"description": "Credit top-up",
"amount": 999.00,
"status": "paid",
"paid_at": "2026-05-09T10:00:00.000000Z"
}
],
"current_page": 1,
"last_page": 2
}