Skip to content
API reference

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:

curl https://api.digitalixhub.com/v1/ping \
-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
GET/ping

Verify your key works. Returns the company the key belongs to.

Response

{ "ok": true, "companyId": "c0a8…" }
GET/usage

Current task usage against your plan's monthly cap.

Response

{
  "ok": true,
  "tier": "pro",
  "usage": { "tasksUsed": 412, "taskCap": 2000, "canCreateTask": true }
}
GET/agents

Your 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"
    }
  ]
}
GET/memory

The 3-layer company memory: structured facts, event timeline, and narrative.

Response

{
  "ok": true,
  "memory": {
    "version": 14, "updatedAt": "…",
    "facts": [ { "category": "identity", "items": [ … ] } ],
    "events": [ … ],
    "narrative": "…"
  }
}
GET/intel?limit=25

Latest market-scout intel linked to your company (max 100 per request).

Response

{
  "ok": true,
  "intel": [
    { "id": "…", "category": "competitor", "title": "…", "summary": "…", "source": "…", "tags": [ … ] }
  ]
}
POST/tasks

Create 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" } }
GET/customers?limit=25&offset=0

List 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 }
POST/customers

Create 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", … } }
PATCH/customers/:id

Update a customer. Any subset of {name, email, phone, companyOrg, type, source, notes, status, tags}.

Request body

{ "status": "prospect" }

Response

{ "ok": true, "customer": { … } }
GET/deals?stage=proposal&limit=25

List 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 }
POST/deals

Create 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": "…", … } }
PATCH/deals/:id

Update a deal. Moving stage to won or lost stamps closedAt automatically.

Request body

{ "stage": "won", "closeReason": "beat competitor on turnaround" }

Response

{ "ok": true, "deal": { … } }
GET/invoices?status=sent

List 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 }
POST/invoices

Create 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, … } }
PATCH/invoices/:id

Update status, notes, or dueDate. Moving status to paid stamps paidAt automatically.

Request body

{ "status": "paid" }

Response

{ "ok": true, "invoice": { … } }
GET/appointments?status=pending

List 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 }
PATCH/appointments/:id

Set 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": { … } }
GET/tickets?status=open

List 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 }
POST/tickets

Create 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": "…", … } }
PATCH/tickets/:id

Update 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 usthe 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

API Reference — Digitalix Hub