Stedral platform API
Programmatic access to your AI company: read usage, your agent roster, company memory, and intel — or create tasks from your own systems. Included in the Pro and Scale plans.
Authentication
Create an API key in the dashboard under Settings → API Access. The full key is shown once at creation — we store only a hash. Send it on every request:
-H "Authorization: Bearer dxh_your_key_here"
The x-api-key header is accepted as an alternative. Keys can be revoked at any time from the same settings page.
Rate limit
120 requests per minute per key. Exceeding it returns 429 with a Retry-After header.
Plan requirement
API access is included in Pro and Scale. Tasks created via the API count toward your plan's monthly task cap.
Endpoints
https://api.digitalixhub.com/v1/pingVerify your key works. Returns the company the key belongs to.
Response
{ "ok": true, "companyId": "c0a8…" }/usageCurrent task usage against your plan's monthly cap.
Response
{
"ok": true,
"tier": "pro",
"usage": { "tasksUsed": 412, "taskCap": 2000, "canCreateTask": true }
}/agentsYour full agent roster with role, department, status, and autonomy level.
Response
{
"ok": true,
"agents": [
{
"id": "…", "name": "Remi Calloway", "shortName": "SDR",
"role": "Sales development — qualifies inbound leads",
"department": "sales", "status": "active", "autonomyLevel": "supervised"
}
]
}/memoryThe 3-layer company memory: structured facts, event timeline, and narrative.
Response
{
"ok": true,
"memory": {
"version": 14, "updatedAt": "…",
"facts": [ { "category": "identity", "items": [ … ] } ],
"events": [ … ],
"narrative": "…"
}
}/intel?limit=25Latest market-scout intel linked to your company (max 100 per request).
Response
{
"ok": true,
"intel": [
{ "id": "…", "category": "competitor", "title": "…", "summary": "…", "source": "…", "tags": [ … ] }
]
}/tasksCreate a task. With agentShortName it enters the same queue as dashboard tasks — retries, metering, and the agent's autonomy level all apply (draft-mode output still lands in your approvals inbox). Without it, the task is created as pending for manual assignment.
Request body
{ "description": "Qualify the lead from acme.com", "agentShortName": "SDR" }Response
{ "ok": true, "task": { "id": "…", "status": "queued" } }/customers?limit=25&offset=0List customers, newest first. Pagination via limit + offset (limit max 200).
Response
{ "ok": true, "customers": [ { "id": "…", "name": "Acme Ltd", "email": "…", "status": "active" } ], "total": 42, "limit": 25, "offset": 0 }/customersCreate a customer. Only name is required; email/phone/companyOrg/notes/tags optional.
Request body
{ "name": "Acme Ltd", "email": "ops@acme.com", "type": "business", "tags": ["priority"] }Response
{ "ok": true, "customer": { "id": "…", "name": "Acme Ltd", … } }/customers/:idUpdate a customer. Any subset of {name, email, phone, companyOrg, type, source, notes, status, tags}.
Request body
{ "status": "prospect" }Response
{ "ok": true, "customer": { … } }/deals?stage=proposal&limit=25List deals, most-recently-updated first. Optional stage filter (lead|qualified|proposal|negotiation|won|lost).
Response
{ "ok": true, "deals": [ { "id": "…", "name": "Acme Q4", "stage": "proposal", "valueCents": 480000, "currency": "EUR" } ], "total": 8, "limit": 25, "offset": 0 }/dealsCreate a deal. Only name is required. Passing customerId ties it to a customer you own.
Request body
{ "name": "Acme Q4", "valueCents": 480000, "stage": "proposal", "customerId": "…" }Response
{ "ok": true, "deal": { "id": "…", … } }/deals/:idUpdate a deal. Moving stage to won or lost stamps closedAt automatically.
Request body
{ "stage": "won", "closeReason": "beat competitor on turnaround" }Response
{ "ok": true, "deal": { … } }/invoices?status=sentList invoices, newest issueDate first. Optional status filter (draft|sent|paid|overdue|void).
Response
{ "ok": true, "invoices": [ { "id": "…", "number": "INV-2026-041", "status": "sent", "totalCents": 490000, "currency": "EUR" } ], "total": 12, "limit": 25, "offset": 0 }/invoicesCreate a draft invoice from line items. Server computes subtotal + tax + total from unitPriceCents × quantity.
Request body
{
"number": "INV-2026-042",
"customerId": "…",
"dueDate": "2026-08-01",
"lineItems": [ { "description": "Consulting Q3", "quantity": 20, "unitPriceCents": 24500 } ],
"taxRate": 0.20
}Response
{ "ok": true, "invoice": { "id": "…", "status": "draft", "totalCents": 588000, … } }/invoices/:idUpdate status, notes, or dueDate. Moving status to paid stamps paidAt automatically.
Request body
{ "status": "paid" }Response
{ "ok": true, "invoice": { … } }/appointments?status=pendingList appointments in ascending scheduled order. Optional status filter (pending|confirmed|cancelled|completed).
Response
{ "ok": true, "appointments": [ { "id": "…", "guestName": "Sarah Chen", "topic": "Intro session", "scheduledAt": "2026-07-14T09:00:00Z", "status": "pending" } ], "total": 5, "limit": 25, "offset": 0 }/appointments/:idSet an appointment's status (pending|confirmed|cancelled|completed). Bookings themselves are created via the public booking page (POST /api/t/appointments) so guests don't need a key.
Request body
{ "status": "confirmed" }Response
{ "ok": true, "appointment": { … } }/tickets?status=openList support tickets, newest first. Optional status filter (open|in_progress|resolved|closed).
Response
{ "ok": true, "tickets": [ { "id": "…", "subject": "Password reset", "fromEmail": "kim@…", "status": "open", "priority": "normal" } ], "total": 3, "limit": 25, "offset": 0 }/ticketsCreate a manual ticket (source is stamped as "manual"). Gmail-sourced tickets flow through the Gmail listener automatically.
Request body
{ "subject": "Refund request #4821", "fromEmail": "rita@…", "fromName": "Rita M.", "body": "…", "priority": "high" }Response
{ "ok": true, "ticket": { "id": "…", … } }/tickets/:idUpdate status, priority, or the agent's draft reply. Moving status to resolved or closed stamps resolvedAt.
Request body
{ "status": "resolved" }Response
{ "ok": true, "ticket": { … } }Errors
Errors return a JSON body with a stable code:
{ "error": { "code": "UNAUTHORIZED", "message": "Invalid or revoked API key." } }401 UNAUTHORIZED — missing, invalid, or revoked key.
403 TIER_LIMIT — your plan no longer includes API access.
429 — rate limit exceeded; respect Retry-After.
400 VALIDATION — malformed request body or parameters.
Questions or a missing endpoint you need? Tell us — the v1 surface grows with real usage.
Ready to call the API?
API access is included on Pro and Scale. Start free, create a key from Settings → API Access, and you're making authenticated requests in minutes.
Free · no card · 1-minute setup