Veloxiom API Reference
Reference for the Veloxiom ISP Management Platform: the public REST API v1 (token) plus the internal panel / mobile action endpoints. Every parameter listed here is taken from the current production code.
API Sections
🔐 Authentication
Veloxiom exposes two distinct surfaces. Choose the right one for your integration:
- REST API v1 — the public, programmatic API at
/api/v1.php. Authenticated with a scoped API token (Bearer). This is what third-party integrations should use. - Panel / Mobile actions — the action-based endpoints at
/process.php(hosted:/{tenant}/process.php) used internally by the admin panel and the mobile app. Sendaction=…asPOSTform fields. They require an authenticated admin session cookie + CSRF token, or amobile_tokenfor themobile_*actions — they are not a Bearer API and are not covered by API-token scopes. Panel permissions (module/level) are enforced per action.
API Tokens (REST API v1)
Create scoped tokens in the panel under Admin → API & Webhooks. Each token is shown once (only a SHA-256 hash is stored), carries per-module scopes, supports an expiry, and can be revoked. A token is tenant-scoped — it only ever sees its own tenant's data.
Token Scopes
Each token grants per-module access at level none / view / write (write implies view). Endpoints require a specific scope; insufficient scope returns HTTP 403.
| Scope module | Grants access to |
|---|---|
| customers | Customers / subscribers |
| plans | Service plans |
| billing | Invoices & billing |
| routers | Network devices / routers |
| monitoring | Monitoring data (can also read routers) |
| crm | Tickets & messaging (write required to send) |
2FA (Two-Factor Authentication) (panel session actions)
Mobile app authentication
The Veloxiom mobile app uses the same /process.php endpoint. The actions below need no session; everything else in the app sends the mobile_token POST field (tokens expire and are typed staff or customer).
{ok, name, logo_url}. No auth.username, password. Returns {ok, token, user{id, username, name, role, permissions}}.username, password. Returns a customer-typed token.mobile_token.username, password, plan (required), name, email, phone. Errors: password_required, plan_required plus the standard add errors.🔌 REST API v1 (Token)
The public REST API at /api/v1.php. Reads (GET ?resource=…) work on every installation. Writes (POST ?action=…) let a customer build their own app (CRM, mobile, billing integration) and are available on Veloxiom Standalone when the license includes the api_write feature; on hosted tenants they answer 403 feature_not_licensed unless enabled by Veloxiom. Check ?resource=me → write_enabled. All writes go through the exact same panel logic as the admin UI (RADIUS, IPAM, billing, audit log, webhooks) — no second write path.
Licensing: the api_write feature is part of the Standalone license (issued per installation). Read endpoints and send_message never require it. Tokens are created in the panel under Settings → API tokens with per-module scopes (customers, plans, billing, routers, monitoring, crm × view|write).
Read Resources (GET)
{ok, pong, ts}.write_enabled, standalone.username, name, email, phone. Supports q, limit, offset. Scope: customers:view.username, plan, rate_limit, disabled, comment, static_ip, expire_date, name, email, phone, afm, address, online, session{}, meta{} (password/secret fields stripped). Scope: customers:view.id, session_id, username, nas, ip, ipv6_prefix, ipv6_delegated, mac, started_at, seconds, download_bytes, upload_bytes. Scope: customers:view or monitoring:view.daily[] breakdown: sessions, seconds, download_bytes, upload_bytes. Scope: customers:view or monitoring:view.sessions). Scope: customers:view or monitoring:view.id, name, rate_limit, price. Scope: plans:view.status, q, username. Fields: id, number, customer, username, total, status, issue_date. Scope: billing:view.einv_*) and items[]. Scope: billing:view.id, invoice_id, username, amount, method, gateway, reference, paid_at. Scope: billing:view.id, name, ip, hostname, site, role, health. Scope: routers:view or monitoring:view.id, subject, customer, status, priority, created_at, updated_at. Filter q. Scope: crm:view.replies[]. Scope: crm:view.direction, channel, phone. Scope: crm:view.Write Actions (POST) Standalone / licensed · api_write
Send POST /api/v1.php?action=<name> with a JSON body (Content-Type: application/json) or form fields. Every write is audit-logged as api:<token name> and fires the listed webhook event.
api_write). Scope: crm:write. Params: channel (sms|viber|whatsapp), to, text, username. Returns: status, channel, to. Webhook: message.sent.409 username_exists, 422 unknown_plan. Scope: customers:write. Params: username, password, plan, name, email, phone, phone2, afm, doy, address, id_card, activity, comment, static_ip, expire_date, expire_time, billing_price, billing_vat, ipv6_mode, ipv6_pool_id, ipv6_prefix. Returns: username, plan, disabled, created. Webhook: customer.created.username + any field of create_customer (only sent fields change). Returns: username, plan, disabled, updated. Webhook: customer.updated.username. Returns: username, disabled, changed. Webhook: customer.disabled.username. Returns: username, disabled, changed. Webhook: customer.enabled.username, plan. Returns: username, plan, previous_plan, changed. Webhook: customer.plan_changed.username, expire_date (empty = clear), expire_time. Returns: username, expire_date, expire_time. Webhook: customer.updated.username. Returns: username, kicked_sessions, closed_accounting. Webhook: customer.reconnected.username, confirm=yes. Returns: username, deleted. Webhook: customer.deleted.name, rate_limit, price, price_vat_mode, price_vat_rate, price_sub_fee, burst_rate, burst_threshold, burst_time, priority, min_rate, aggregation, data_cap_gb, fup_rate, fup_action. Returns: id, name, rate_limit, created. Webhook: plan.created.id or current_name, name, rate_limit, … (as create_plan). Returns: id, name, rate_limit, updated. Webhook: plan.updated.409 plan_in_use if customers are assigned, unless force=yes. Scope: plans:write. Params: id or name, force=yes. Returns: id, deleted. Webhook: plan.deleted.items the customer's plan price is used. einv_submit=1 submits to myDATA/e-invoicing provider. Scope: billing:write. Params: username, month (YYYY-MM), items[{description, qty, unit_price, discount_pct, vat_rate}], vat, doctype_title, due_date, einv_submit (0|1, default 1). Returns: invoice_id, number, total, status, issue_date, due_date. Webhook: invoice.created.username it settles the oldest unpaid invoices, surplus becomes credit. Scope: billing:write. Params: invoice_id or username, amount, method (cash|card|pos|bank|iban|other), reference, note. Returns: invoice_id, amount, method, result{paid, applied, remaining, invoice_status, credited}. Webhook: payment.recorded, invoice.paid.invoice_id, status (unpaid|paid|cancelled|draft|issued|overdue|partial), payment_method, payment_reference, payment_note. Returns: invoice_id, status, reactivated. Webhook: invoice.status_changed.subject, message, username, priority (low|medium|high|urgent), category, contact_email, contact_name. Returns: id, subject, customer, status, priority. Webhook: ticket.created.id, message, status. Returns: ticket_id, reply_id, status. Webhook: ticket.replied.id, status, priority, subject, assigned_to, category. Returns: ticket_id, updated. Webhook: ticket.updated.Common Query Parameters
| Parameter | Type | Description |
|---|---|---|
| resource / r | string | Resource name (GET) |
| action | string | Action name (POST; query or body) |
| limit | int | Page size, 1–500 (default 100) |
| offset | int | Row offset for pagination (default 0) |
| q | string | Free-text search (customers/invoices/tickets) |
| from / to | YYYY-MM-DD | Period for usage |
Errors
| HTTP | error | Meaning |
|---|---|---|
| 401 | unauthorized | Missing/invalid/revoked/expired token |
| 403 | insufficient_scope | Token lacks the required scope (error_details.need) |
| 403 | feature_not_licensed | Write actions not licensed on this installation (api_write) |
| 404 | unknown_resource / not_found | No such resource, or customer/plan/invoice/ticket not found |
| 400 | unknown_action / invalid_json | Unknown POST action or malformed JSON body |
| 409 | username_exists / plan_in_use | Conflict with existing data |
| 422 | missing_parameter / invalid_parameter / invalid_username / unknown_plan / invalid_amount | Validation failure (error_details.param) |
| 429 | rate_limited | Rate limit exceeded (120 req/min per token) |
| 502 | upstream_error | Router / SMS provider / e-invoicing provider failure |
Error body: {"ok":false,"error":"<code>","error_code":"<code>","error_message":"…","error_details":{…},"meta":{"request_id":"req_…"}}. Send envelope=2 for error as a structured object.
Envelope, Pagination & Request IDs
| Field | Description |
|---|---|
ok | Always present. true on success, false on error. |
data | The payload (array for lists, object for single resources). |
count | Number of rows in the current response. |
pagination | limit, offset, total, has_more, next_offset — on list resources. |
meta.request_id | Per-call id, also returned as the X-Request-Id header (quote it in bug reports). |
Errors stay flat for backward compatibility ({ok:false,error:"…"}). Send envelope=2 for a structured error: {ok:false,error:{code,message,details},meta:{request_id}}. Validation failures return 422. Callers still using ?token=… receive Deprecation/Sunset headers — prefer Authorization: Bearer or X-Api-Token.
Field values
invoice.status | unpaid · paid · partial · overdue · cancelled |
message.channel | sms · viber · whatsapp |
Machine-readable spec (OpenAPI)
GET /api/v1.php?resource=openapi returns the OpenAPI 3.0.3 document (v1.2) of your installation, including all write actions with request/response schemas — load it into Postman/Insomnia or generate a client (openapi-generator, Swagger Codegen) in any language.
👥 Customers / Subscribers (panel/mobile session action)
Manage ISP subscribers — create, edit, delete, and control service status.
Customer Parameters (action=add / action=edit)
| Parameter | Type | Description |
|---|---|---|
| user (alias: user_name) | string | PPPoE/DHCP username (unique, validated format) |
| pass (alias: password) | string | PPPoE password (required on add) |
| limit | string | Service plan name (required; must exist as a plan / rate profile) |
| comment | string | Display name / comment stored on the RADIUS user |
| static_ip (alias: ip_address) | string | Static IPv4 (Framed-IP-Address), optional |
| expire_date | date | Expiration date (YYYY-MM-DD), optional |
| expire_time | time | Expiration time (HH:MM), optional |
action=delete and action=toggle_status take user_id (alias username). action=aade_lookup takes afm (VAT number, digits only).
Billing profile parameters (action=save_billing_customer)
| Parameter | Type | Description |
|---|---|---|
| username | string | Subscriber username (required) |
| cust_name | string | Legal / full name |
| cust_afm | string | VAT number (ΑΦΜ) |
| cust_doy | string | Tax office (ΔΟΥ) |
| cust_activity | string | Business activity |
| cust_addr | string | Billing address |
| cust_phone | string | Phone |
| cust_email | string | |
| cust_idcard | string | ID card number |
| billing_price | float | Per-customer price override (optional) |
| billing_vat | float | Per-customer VAT rate override (optional) |
📋 Service Plans
Create and manage internet service plans with speed profiles, pricing, and FUP policies.
Plan Parameters (action=add_plan / action=edit_plan)
| Parameter | Type | Description |
|---|---|---|
| plan_name | string | Plan name (e.g. 'FTTH 100Mbps') |
| rate_limit | string | Speed in MikroTik rate-limit syntax, upload/download (e.g. 10M/100M) |
| default_price | float | Price (EUR) |
| price_vat_mode | string | Whether default_price is entered net or gross of VAT |
| price_vat_rate | float | VAT rate (%) |
| price_sub_fee | float | Subscriber fee / surcharge added to the price |
| aggregation | string | Aggregation / burst policy preset |
| burst_time | string | Burst time (MikroTik) |
| priority | int | Queue priority (1–8) |
| data_cap_gb | int | Monthly data cap in GB (0 = unlimited) |
| fup_action | string | Action when the cap is reached (throttle / block) |
action=delete_plan takes plan_id.
💰 Billing & Invoicing
Automated billing engine with invoice generation, status tracking, and batch operations.
month (YYYY-MM), users[] (optional subset of usernames), einv_submit (1 = submit to e-invoicing)users, month, items_json, vat, taxes_json, transport_json, doctype_title, einv_submitid, status ∈ unpaid · paid · overdue · cancelledid. Refused for issued/submitted/paid invoices.💳 Payments
Payments are recorded manually from the panel or arrive automatically from the configured gateways (DIAS, Revolut, Stripe, Viva, PayPal, myPOS) and are matched to invoices by the payment-sync jobs.
invoice_id, amount, method, reference, noteusername, amount, method, reference, noteinvoice_idSupported Payment Gateways
| Gateway | Type | Description |
|---|---|---|
| DIAS | bank | Greek interbank payment system (RF codes) |
| Revolut | online | Online card payments via Revolut Business |
| Stripe | online | International card & subscription payments |
| Viva Wallet | online | Greek/EU card payments |
| PayPal | online | PayPal payments |
| myPOS | online / POS | Card payments & POS terminals (Checkout / REST) |
📄 e-Invoicing (AADE / myDATA)
Submit invoices electronically to AADE myDATA. Supports multiple e-invoicing providers.
invoice_id, provider (see table)invoice_idSupported e-Invoicing Providers
Provider (provider value) | Status | Description |
|---|---|---|
myDATA (AADE) — mydata | active | Direct AADE myDATA API submission |
Elorus — elorus | active | Elorus invoicing / ERP platform |
ΕΣΚΑΠ — eskap | active | AADE e-invoicing provider channel |
ΕΣΥΠ / ΤΗΛΕΔ (ΓΓΠΣ) — esyp | active | Public-sector e-invoicing (B2G) |
SoftOne — softone | beta | SoftOne ERP connector |
IMPACT — impact | coming soon | IMPACT e-invoicing provider |
Primer (Cosmos) — primer | coming soon | Primer/Cosmos e-invoicing |
Retail@Link — retail_at_link | coming soon | Retail@Link e-invoicing |
Edpsoft — edpsoft | coming soon | Edpsoft e-invoicing |
Epsilon Net / Entersoft / Galaxy — epsilon, entersoft, galaxy | coming soon | ERP connectors |
📡 RADIUS / PPPoE / DHCP
FreeRADIUS integration for PPPoE and DHCP authentication, CoA (Change of Authorization), and session management.
PPPoE/DHCP authentication, accounting and CoA are fully active and driven by the panel (customer add/edit/disable, plan change, reconnect). There are no public HTTP actions for listing/disconnecting RADIUS sessions yet (radius_sessions, radius_disconnect, radius_coa are on the roadmap). Active sessions are available in the panel and via the mobile action mobile_online_users; subscriber reconnect via mobile_user_reconnect.
🔧 MikroTik Routers
Manage MikroTik RouterOS devices — add, configure, monitor, and execute API commands.
Router Parameters (action=add_router / action=edit_router)
| Parameter | Type | Description |
|---|---|---|
| r_ip | string | Router management IP address |
| r_name | string | Router display name |
| r_user | string | RouterOS API username |
| r_pass | string | RouterOS API password |
| r_radius_ip | string | RADIUS NAS IP (defaults to management IP) |
| r_radius_secret | string | RADIUS shared secret |
| r_radius_vendor | string | NAS vendor (mikrotik, cisco) |
| orig_ip (edit only) | string | Current IP of the router being edited |
action=delete_router and action=switch_router take ip.
🌐 Network Settings
🗺️ Topology & Maps
Network topology visualization with 2D/3D maps. Supports multiple monitoring backends.
metrics_source ∈ librenms · observium · zabbix · mikrotikSupported Monitoring Backends
| Backend | Protocol | Description |
|---|---|---|
| LibreNMS | REST API | Open-source network monitoring |
| Observium | REST API | Network monitoring platform |
| Zabbix | JSON-RPC | Enterprise monitoring solution |
| MikroTik | RouterOS API | Direct router SNMP/API polling |
📦 Device Inventory (IPAM)
IP Address Management and network device inventory with approval workflows.
📊 SNMP Monitoring
Real-time network monitoring via SNMP. Collect bandwidth, latency, and interface metrics from routers and switches.
Collection runs via scheduled collectors and is visualised in the built-in Grafana dashboards. Router health (CPU, RAM, uptime, version) is returned by action=list_routers_ui and, per device, by the REST resource routers (health field). Mobile: mobile_snmp_devices, mobile_uptime. On-demand snmp_collect / router_health actions are not exposed.
📞 VoIP / Telephony (MOR)
MOR/M2 telephony integration — SIP trunk management, CDR records, tariffs, balance management, and VoIP billing.
🔒 WireGuard VPN
🎫 Helpdesk / Tickets
Customer support ticket system with assignment, priorities, categories and status tracking. Integrations: REST ?resource=tickets, ?resource=ticket and (Standalone/licensed) action=create_ticket / reply_ticket / update_ticket.
subject (required), description, customer, priority, status, assigned_to, category; send ticket_id to update, delete_id to delete.ids (comma-separated), bulk_action ∈ status · assign · close, bulk_valueField values
status | open · in_progress · waiting · resolved · closed |
priority | low · medium · high · urgent |
🤖 AI Assistant
🔔 Notifications
Multi-channel notification system — Telegram, Email, Push notifications.
telegram_enabled, telegram_bot_token, telegram_bot_username, telegram_admin_chat_idtitle, body, severity, channels, users (target subscribers)👤 Admin Management
admin_user, admin_pass, admin_email, perms (module→level map)admin_id, optional admin_pass, admin_email, permsadmin_id🏢 Multi-Tenant
Multi-tenant architecture — each tenant is an isolated ISP instance with its own database, domain, branding, and configuration.
Tenant provisioning is a super-admin operation performed from the control panel; it runs the full pipeline (database, schema, RADIUS, WireGuard/NPM, captive portal) internally with rollback on failure.
⚙️ System Settings
🔗 Webhooks
Receive real-time notifications when events occur in Veloxiom. Configure outbound webhooks in the panel under Admin → API & Webhooks. The signing secret (whsec_…) is shown once at creation.
Available Events
| Event | Description |
|---|---|
| message.received | An inbound message (SMS/other channel) arrived |
| message.sent | An outbound message was dispatched (e.g. via API send_message) |
| ping | Test event sent from the admin UI |
| * | Subscribe to all current and future events |
Additional business events (customer.*, invoice.*, ticket.*, router.*) are on the roadmap and not yet emitted.
Delivery & Signature
Each delivery is an HTTPS POST with a JSON body. Verify authenticity with the HMAC-SHA256 signature computed over the raw request body using your webhook secret. Only public HTTPS URLs are accepted (loopback/private/CGNAT ranges are rejected — SSRF protection).
🏗️ ERP Integrations
Connect Veloxiom with your ERP system for synchronized billing, customer data, and financial reporting.
| ERP | Status | Integration Type |
|---|---|---|
| Elorus | active | Full sync — invoices, customers, payments |
| SoftOne | coming soon | REST API integration |
| Epsilon Net | coming soon | REST API integration |
| Entersoft | coming soon | REST API integration |
| Galaxy / Real | coming soon | REST API integration |
| QuickBooks Online | beta | OAuth2 — customers, invoices, payments via sync queue |
| Xero | beta | OAuth2 — customers, invoices, payments via sync queue |
| 1C:Enterprise | beta | OData — customers, invoices, payments via sync queue |
📨 Response Format
REST API v1 and all JSON panel/mobile actions return ok: true|false. Some legacy panel actions used by HTML forms respond with a redirect instead of JSON. Error codes for REST are listed in the REST section; panel actions return a short error string (e.g. password_required, plan_required).
⏱️ Rate Limits
| Scope | Limit | Window |
|---|---|---|
| REST API v1 token | 120 requests | per minute, per token (HTTP 429 on excess) |
Need Help?
For API support and custom integration assistance, contact us via the contact form.