Everything you need to provision your node, connect your clients, and build a live product on the RGX wholesale software integration substrate. From your first API call to production scale.
RGX Systems is a wholesale software integration substrate for Value-Added Resellers. You are not reselling RGX — you are building your own product on top of it. Your clients never know RGX exists.
The platform gives you a single authenticated API surface that connects to every tool your clients use — CRM, email, calendar, messaging channels, file storage, and calling — and exposes them through a consistent set of REST endpoints scoped to your VAR node.
The model in one sentence: You provision a VAR node, register your clients under it, connect their tools, and expose whatever features you want through your own UI. RGX handles the pipeline orchestration, scoped token key generation, data validation, and encrypted storage. You handle the relationship.
Every VAR operator receives a VAR node — an isolated multi-tenant container that holds all your client records, credentials, usage events, and billing data. Nothing from your node is visible to other operators. Nothing from other operators is visible to yours.
rgx_live_… (48-char hex)X-Api-Key header/usageYou call the API — authenticated with your Master API Key. Every request is validated against your node, rate-checked, and logged.
The platform resolves the client — requests scoped to a client_ref route to that client's isolated credential store and configuration.
The integration layer executes — credentials are decrypted in memory, the third-party API is called, and the result is normalized and returned.
Usage is recorded — request metadata (endpoint, payload size, processing units, status code) written to your node's usage log for billing.
Once you have your Master API Key, you can have your first client registered and connected within minutes. All endpoints are under https://rgxsystems.com/api/v1/.
Confirm your key is active and your node is live before building anything.
GET /api/v1/health X-Api-Key: rgx_live_your_key_here // Response { "ok": true, "node": "Acme MSP", "plan": "standard", "timestamp": "2026-05-22T09:00:00Z" }
Every client gets a client_ref — a unique identifier you define. Use whatever makes sense in your system (account ID, slug, etc.).
POST /api/v1/clients X-Api-Key: rgx_live_your_key_here { "client_ref": "contoso-ltd", "name": "Contoso Ltd", "email": "ops@contoso.com" } // Response { "ok": true, "client_ref": "contoso-ltd", "id": "cli_…" }
Credentials are encrypted with AES-256-GCM immediately on write and never returned in plaintext. Only one integration per type per client.
POST /api/v1/clients/contoso-ltd/connect X-Api-Key: rgx_live_your_key_here { "type": "hubspot", "config": { "api_key": "their_hubspot_key" } }
GET /api/v1/clients/contoso-ltd/crm/deals X-Api-Key: rgx_live_your_key_here // Response { "ok": true, "deals": [ { "id": "deal_001", "name": "Q2 Renewal", "stage": "Proposal", "value": 24000 } ], "count": 1 }
Rate limit headers are returned on every response: X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset. Check these in production to avoid 429s.
Clients are the core tenant unit under your VAR node. Each client has isolated credential storage, configuration, channel history, and call logs. A client maps to one of your end customers.
| Method | Endpoint | Description |
|---|---|---|
| POST | /clients | Register a new client on your node |
| GET | /clients | List all clients with cursor pagination |
| GET | /clients/:ref | Get a single client by reference ID |
| PATCH | /clients/:ref | Update name, email, or metadata |
| DELETE | /clients/:ref | Remove client and all associated data |
The GET /clients endpoint and all list endpoints return a next_cursor token when more records exist. Pass it back as ?cursor=… on the next request. No offset arithmetic, no missed records.
GET /api/v1/clients?limit=25 // Response { "clients": [...], "next_cursor": "eyIyMDI2..." } GET /api/v1/clients?limit=25&cursor=eyIyMDI2... // Next page
Each client can have one integration per type. Credentials are encrypted on write and decrypted in-memory only at runtime.
| Type | Auth Method | Notes |
|---|---|---|
hubspot | API Key | Deals, contacts, activity logging, deal creation |
salesforce | Access Token + Instance URL | Full CRM access via REST API |
pipedrive | API Key | Deals, contacts, activity |
gohighlevel | API Key + Location ID | GHL CRM + pipeline access |
vtiger | Username + Access Key + URL | vTiger CRM REST API |
gmail | OAuth tokens | Inbox, send, calendar, Drive (shared OAuth scope) |
outlook | OAuth tokens | Inbox, send, calendar, OneDrive, Teams |
imap | Host, port, user, password | Any IMAP/SMTP provider |
slack | Bot Token | Read channels, post messages |
teams | OAuth tokens | Read/post via Microsoft Graph |
twilio | Account SID + Auth Token + From | Send/receive SMS |
Disconnecting: DELETE /clients/:ref/integrations/:type removes the integration and purges the encrypted credentials. The integration slot is then available for reconnection.
The /ingest endpoint is your primary payload logging endpoint. Use it to record any communication event into your node. All ingested messages are stored, validated, and queryable.
POST /api/v1/ingest
{
"client_ref": "contoso-ltd",
"messages": [
{ "role": "user", "content": "When does my contract renew?" },
{ "role": "assistant", "content": "Your contract renews August 1st." }
],
"channel": "sms",
"process_with_ai": false // set true to auto-generate summary
}
For richer per-client storage with channel metadata, use the client-scoped channel ingest endpoint:
POST /api/v1/clients/contoso-ltd/channels/ingest
{
"channel": "email",
"direction": "inbound",
"from_address": "client@contoso.com",
"subject": "Renewal question",
"body_preview": "Hi, when does my contract renew?",
"external_id": "msg_abc123"
}
Up to 100 messages across multiple clients in a single call. Per-item success/failure results returned. Usage tracked in aggregate.
POST /api/v1/bulk/ingest
{
"items": [
{ "client_ref": "contoso-ltd", "messages": [...], "channel": "slack" },
{ "client_ref": "fabrikam-inc", "messages": [...], "channel": "whatsapp" }
]
}
Log calls with full transcripts. Summaries and action items auto-extracted and stored per record.
POST /api/v1/clients/contoso-ltd/calls/log
{
"direction": "inbound",
"from_number": "+14155551234",
"duration_seconds": 312,
"transcript": "Full transcript text here..."
}
| Method | Endpoint | Description |
|---|---|---|
| GET | /clients/:ref/channels/recent | Recent channel messages. Filter by ?channel=email, ?since=ISO |
| GET | /clients/:ref/calls | Call log history with cursor pagination |
| GET | /clients/:ref/contacts/:id/timeline | Unified interaction history for a contact across all channels and calls |
Full inbox access and send capability. Works across Gmail, Outlook/M365, and any IMAP provider. Requires a gmail, outlook, or imap integration to be connected for the client.
| Method | Endpoint | Description |
|---|---|---|
| GET | /clients/:ref/email/inbox | Fetch inbox messages (subject, from, date, preview). Pass ?limit= to control count. |
| GET | /clients/:ref/email/:messageId | Read full body of a specific message by ID returned from inbox |
| POST | /clients/:ref/email/send | Send an email. Body: to, subject, body, optional cc, bcc |
Google Calendar and Outlook Calendar. Accessible via the gmail or outlook integration — no separate connection required.
| Method | Endpoint | Description |
|---|---|---|
| GET | /clients/:ref/calendar/events | List upcoming events. Filter by ?timeMin= and ?timeMax= (ISO format) |
| POST | /clients/:ref/calendar/events | Create event. Body: title, start, end, attendees[], optional location, description |
| GET | /clients/:ref/calendar/availability | Free/busy lookup. Body: emails[], timeMin, timeMax |
| Method | Endpoint | Description |
|---|---|---|
| GET | /clients/:ref/slack/channels | List Slack channels the connected bot is a member of |
| GET | /clients/:ref/slack/:channel/messages | Read recent messages from a Slack channel |
| POST | /clients/:ref/slack/:channel/message | Post a message to a Slack channel |
| POST | /clients/:ref/sms/send | Send SMS via client's connected Twilio number. Body: to, body |
List and search files from Google Drive or OneDrive. Accessible via the gmail (Drive) or outlook (OneDrive) integration.
GET /api/v1/clients/contoso-ltd/files?q=contract+2026 // Response { "files": [ { "id": "1BxiM…", "name": "Contoso_Contract_2026.pdf", "webViewLink": "https://…" } ] }
Send any text input and receive a structured response from the processing pipeline. Optionally scope it to a client to apply their stored configuration automatically.
POST /api/v1/process
{
"input": "Summarize the last 3 deals in our pipeline",
"client_ref": "contoso-ltd", // applies stored system prompt
"session_id": "sess_abc"
}
// Response
{ "response": "...", "processing_ms": 740, "units_used": 388 }
Passthrough mode: Set "process_with_ai": false (on /ingest) or "passthrough": true (on /process) to skip pipeline processing entirely. The request is logged and stored only. Use this when your own stack handles inference.
Store a system prompt and output length configuration per client. Applied automatically on every /process and /ingest call scoped to that client.
PATCH /api/v1/clients/contoso-ltd/ai-config
{
"system_prompt": "You are a business assistant for Contoso Ltd. Always respond concisely and focus on their IT infrastructure priorities.",
"max_tokens": 1024
}
Store reference material, SOPs, policies, and documents per client. Searched and injected as context on processing requests. Fully queryable and updatable.
| Method | Endpoint | Description |
|---|---|---|
| POST | /clients/:ref/knowledge | Add a document. Body: title, content, optional tags[], source_url |
| GET | /clients/:ref/knowledge | List all knowledge docs with cursor pagination |
| POST | /clients/:ref/knowledge/search | Full-text keyword search across title and content |
| PATCH | /clients/:ref/knowledge/:docId | Update title, content, or tags on an existing document |
| DELETE | /clients/:ref/knowledge/:docId | Remove a knowledge document |
POST /api/v1/clients/contoso-ltd/knowledge
{
"title": "Contoso SLA Policy",
"content": "P1 incidents must be acknowledged within 15 minutes...",
"tags": ["sla", "policy"]
}
Register an HTTPS endpoint on your VAR node to receive push events in real-time. Payloads are HMAC-SHA256 signed — verify the X-RGX-Signature header on every delivery.
POST /api/v1/webhooks
{
"url": "https://yourapp.com/webhooks/rgx",
"events": ["message.ingested", "call.logged", "client.created"],
"label": "Production Receiver"
}
// Response — signing secret shown ONCE, store it immediately
{ "id": "wh_…", "signing_secret": "whsec_…" }
message.ingestedcall.loggedclient.createdclient.deletedall — subscribe to everythingGET /webhooks — list allDELETE /webhooks/:id — removeGET /webhooks/:id/deliveries — delivery logPOST /webhooks/:id/test — send test eventconst sig = req.headers['x-rgx-signature']; const expected = crypto .createHmac('sha256', 'whsec_your_secret') .update(JSON.stringify(req.body)) .digest('hex'); if (sig !== expected) return res.status(401).end();
Issue API keys directly to your clients so they can call the platform themselves — without exposing your master key. Sub-keys authenticate against your VAR node and are revocable at any time.
POST /api/v1/clients/contoso-ltd/keys
{ "label": "Contoso Portal Key" }
// Response — raw key shown once
{ "key": "rgx_live_sub_…", "id": "ck_…" }
| Method | Endpoint | Description |
|---|---|---|
| POST | /clients/:ref/keys | Issue a scoped sub-key for this client |
| GET | /clients/:ref/keys | List all active sub-keys for this client |
| DELETE | /clients/:ref/keys/:keyId | Revoke a sub-key immediately |
Two components — a flat monthly base fee plus a per-seat charge for each active client on your node.
Example: You have 20 active clients. Your RGX invoice = $2,000 base + (20 × $30) = $2,600/month. You charge your clients whatever you want — $500/mo each = $10,000 MRR against a $2,600 cost. Your margin grows with every client you add.
GET /api/v1/usage // Response { "current_month": { "requests": 4821, "messages": 18340, "active_seats": 20, "seat_charges_usd": 1200.00, "estimated_invoice_usd": 3200.00 }, "history": [...] }
Get a full breakdown of activity across your entire book of clients in a single call.
| Method | Endpoint | Description |
|---|---|---|
| GET | /reports/summary | Total clients, active clients, messages, calls, top channels, per-client breakdown |
| GET | /reports/usage | Endpoint-level breakdown of requests and processing costs. Pass ?days=30 (1–90) |
| GET | /billing/summary | Seat-based billing export — base fee, active seats, seat charges, estimated invoice, and per-client seat list for your own invoicing tools |
| GET | /health | Node health and key validation |
| POST | /ingest | Log message batch with optional processing |
| POST | /process | Process input or passthrough log-only |
| GET | /usage | Node usage and billing summary |
| POST | /bulk/ingest | Batch ingest up to 100 items across clients |
| POST | /clients | Register client |
| GET | /clients | List all clients (cursor paginated) |
| GET | /clients/:ref | Get client detail |
| PATCH | /clients/:ref | Update client |
| DELETE | /clients/:ref | Delete client |
| POST | /clients/:ref/connect | Connect integration |
| GET | /clients/:ref/integrations | List integrations (credentials masked) |
| DELETE | /clients/:ref/integrations/:type | Disconnect integration |
| GET | /clients/:ref/crm/deals | Pipeline deals |
| GET | /clients/:ref/crm/contacts | Contacts and leads |
| POST | /clients/:ref/crm/activity | Log CRM activity |
| POST | /clients/:ref/crm/deal | Create deal |
| GET | /clients/:ref/email/inbox | Inbox messages |
| GET | /clients/:ref/email/:messageId | Full message body |
| POST | /clients/:ref/email/send | Send email |
| GET | /clients/:ref/calendar/events | List events |
| POST | /clients/:ref/calendar/events | Create event |
| GET | /clients/:ref/calendar/availability | Free/busy lookup |
| GET | /clients/:ref/files | List/search files |
| POST | /clients/:ref/channels/ingest | Ingest channel message |
| GET | /clients/:ref/channels/recent | Recent channel history |
| POST | /clients/:ref/calls/log | Log call with transcript |
| GET | /clients/:ref/calls | Call history |
| GET | /clients/:ref/contacts/:id/timeline | Unified contact timeline |
| GET | /clients/:ref/slack/channels | List Slack channels |
| GET | /clients/:ref/slack/:ch/messages | Read Slack messages |
| POST | /clients/:ref/slack/:ch/message | Post to Slack |
| POST | /clients/:ref/sms/send | Send SMS |
| GET | /clients/:ref/ai-config | Get processing config |
| PATCH | /clients/:ref/ai-config | Set processing config |
| POST | /clients/:ref/knowledge | Add knowledge doc |
| GET | /clients/:ref/knowledge | List knowledge docs |
| POST | /clients/:ref/knowledge/search | Search knowledge base |
| PATCH | /clients/:ref/knowledge/:docId | Update knowledge doc |
| DELETE | /clients/:ref/knowledge/:docId | Delete knowledge doc |
| POST | /clients/:ref/keys | Issue sub-key |
| GET | /clients/:ref/keys | List sub-keys |
| DELETE | /clients/:ref/keys/:keyId | Revoke sub-key |
| POST | /webhooks | Register webhook |
| GET | /webhooks | List webhooks |
| DELETE | /webhooks/:id | Remove webhook |
| GET | /webhooks/:id/deliveries | Delivery history |
| POST | /webhooks/:id/test | Send test event |
| GET | /reports/summary | Aggregate client activity |
| GET | /reports/usage | Endpoint usage breakdown |
| GET | /billing/summary | Seat billing export for invoicing |
Documentation: rgxsystems.com/docs
Support: support@rgxsystems.com
Status: rgxsystems.com/status
WHOLESALE SOFTWARE INFRASTRUCTURE