Skip to main content
Waveguide
Docs navigation

API

The dashboard talks to a JSON API you can call yourself. This page covers the main tenant-facing and public surfaces (core tenant ops, MCP capabilities, jobs, scheduling, media, connections). A few dashboard-only or agency/ops routes are omitted. Programmatic access authenticates with your tenant access key (wgk_…) — find and rotate it under Settings → API access.

The access key is your API credential. Day-to-day dashboard sign-in uses email links instead; you only need the key for scripts and integrations.

Base URL: https://waveguide.adwave.com

Authentication

Exchange your access key for a tenant-scoped session token (30-day expiry):

curl -X POST https://waveguide.adwave.com/auth/login \
  -H "content-type: application/json" \
  -d '{"access_key": "wgk_..."}'
# → { "token": "eyJ...", "tenant": { "tenantId": "ten_...", "name": "Acme" } }

Use it as a bearer on every call:

export WG_TOKEN="eyJ..."
curl -H "authorization: Bearer $WG_TOKEN" \
  https://waveguide.adwave.com/tenants/ten_.../spend

Tokens are scoped to your tenant only. “Sign out everywhere” (Settings) and key rotation both invalidate outstanding sessions.

Endpoints

All paths below are relative to the base URL. :id is your tenant id (ten_…). Unless noted, endpoints require Authorization: Bearer $WG_TOKEN.

Tenant core

MethodPathPurpose
GET/tenants/:idTenant status + connections
GET/tenants/:id/spendMonth-to-date model spend by category
GET/tenants/:id/sessionsRecent agent sessions
GET/tenants/:id/auditAudit log (most recent 200)
GET/tenants/:id/approvalsPending approvals
GET/POST/tenants/:id/soulRead / replace SOUL.md
GET/PUT/tenants/:id/soul-profileStructured persona (identity, scheduling, send windows)
GET/POST/PATCH/DELETE/tenants/:id/policies[/:pid]Standing policies
POST/tenants/:id/wakeWake the agent with a message (rate-limited); optional conversation_id continues an ask chat
GET/tenants/:id/wakes/:wakeIdWake / session status
GET/tenants/:id/conversationsList ask + mission chats
POST/tenants/:id/conversationsCreate ask chat; optional first text wakes
GET/tenants/:id/conversations/:cid/messagesMessages for one chat
POST/tenants/:id/conversations/:cid/messagesContinue ask or mission chat
POST/tenants/:id/conversations/:cid/make-jobPromote ask chat → mission chat
GET/tenants/:id/inboxHybrid Inbox (projected suggestions/approvals + ambient updates)
POST/tenants/:id/inbox/:iid/readMark materialized inbox item read (inb:…)
POST/tenants/:id/inbox/:iid/dismissDismiss ambient item or suggestion (opp:…)
POST/tenants/:id/inbox/:iid/startStart job from Inbox item
GET/tenants/:id/ask-threadCompat: ?conversation_id= returns that chat; without it { migrated: true, messages: [] }
GET/tenants/:id/reactive-statusLive reactive session hint
GET/tenants/:id/sessions/:sessionId/streamSSE activity stream
POST/tenants/:id/killKill switch
POST/tenants/:id/resumeResume after pause/kill
POST/tenants/:id/rotate-keyRotate the access key (returned once)
POST/tenants/:id/exportFull data export → returns a bundle key
GET/tenants/:id/export-downloadDownload export bundle
GET/tenants/:id/artifactsTenant artifact listing
POST/tenants/:id/deletePermanent delete (irreversible)
GET/tenants/:id/channelsList channel bindings
DELETE/tenants/:id/channels/:bindingIdRemove a channel binding
POST/tenants/:id/channels/telegram-codeStart Telegram link
GET/tenants/:id/billing-portalStripe customer portal URL
POST/tenants/:id/upgradeFree → paid Checkout (no trial)
GET/POST/PATCH/DELETE/tenants/:id/members…Team members + invites
PATCH/tenants/:id/settingsTenant settings
PATCH/tenants/:id/onboardingOnboarding progress
GET/DELETE/tenants/:id/schedules[/:sid]Time-based wake schedules
GET/POST/DELETE/tenants/:id/suppressionDo-not-contact list
GET/PUT/DELETE/tenants/:id/capability-bindings[/:bid]Preferred providers per capability
GET/tenants/:id/ledger-statsCRM ledger rollups
GET/tenants/:id/opportunitiesAgent-suggested opportunities
POST/tenants/:id/opportunities/:oid/{dismiss|snooze|start}Act on an opportunity
GET/tenants/:id/lane-healthOutreach lane health
POST/tenants/:id/lane-health/:lane/resumeResume a paused lane

Persona enrichment & media

MethodPathPurpose
POST/tenants/:id/soul-enrichmentStart Learn-from-URL job
GET/tenants/:id/soul-enrichment/latestLatest enrichment draft
POST/tenants/:id/soul-enrichment/:jobId/applyAccept draft (all or empty-only)
POST/tenants/:id/soul-enrichment/:jobId/discardDiscard draft
GET/POST/tenants/:id/mediaList / upload media
GET/tenants/:id/media/:mediaId/contentMedia bytes
PATCH/DELETE/tenants/:id/media/:mediaIdUpdate metadata / delete

Scheduling

Configure mode (Waveguide / Calendly / external) on the soul profile. Native public booking is gated by BOOKING_NATIVE_ENABLED.

MethodPathAuthPurpose
GET/tenants/:id/scheduling/calendly/event-typesbearerList Calendly event types
POST/tenants/:id/scheduling/calendly/syncbearerReconcile recent Calendly events
GET/book/:slugpublicBooking page HTML
GET/book/:slug/slotspublicAvailable slots JSON
POST/book/:slugpublic (rate-limited)Create a booking
POST/book/manage/:token/cancellink tokenCancel a booking
POST/book/manage/:token/reschedulelink tokenReschedule a booking

Connections (OAuth / social / Twilio)

MethodPathPurpose
POST/tenants/:id/connectionsStart Nango OAuth connect
POST/tenants/:id/connections/syncRefresh connection status
DELETE/tenants/:id/connections/:providerDisconnect provider
POST/tenants/:id/connections/twilioSave Twilio SMS credentials
POST/tenants/:id/slack-install-urlSlack app install URL
GET/tenants/:id/socialSocial platform status
POST/tenants/:id/social/connectLink a social platform
POST/tenants/:id/social/syncRefresh linked platforms
POST/tenants/:id/social/disconnectUnlink a platform

Capabilities (MCP tools)

See Capabilities for product behavior. Catalog ids match MCP_CATALOG in code.

MethodPathPurpose
GET/tenants/:id/mcp/catalogCurated catalog (excludes platform-managed)
GET/tenants/:id/mcp/connectionsConnected MCP servers + tool manifests
POST/tenants/:id/mcp/connectionsConnect catalog entry or arbitrary URL
POST/tenants/:id/mcp/connections/:cid/syncRe-discover tools; detect drift
PATCH/tenants/:id/mcp/connections/:cid/tools/:toolOverride risk tier / clear poisoning flag
POST/tenants/:id/mcp/connections/:cid/suggest-catalogSuggest arbitrary URL for catalog review
DELETE/tenants/:id/mcp/connections/:cidDisconnect
GET/POST/DELETE/tenants/:id/mcp/connections/:cid/watches…Site-watch poll registrations

OAuth-protected arbitrary MCP servers complete at GET /oauth/mcp/callback (browser redirect; not bearer-auth).

Hosted sending

MethodPathPurpose
GET/tenants/:id/sending-identitiesHosted outreach identities
PATCH/tenants/:id/sending-identities/:identityIdUpdate display name / forward / resume
GET/POST/tenants/:id/sending-domainsBYO brand domains
POST/tenants/:id/sending-domains/:domain/verifyRe-check DNS

Jobs (missions)

MethodPathPurpose
GET/tenants/:id/mission-templatesStarter job templates
GET/POST/tenants/:id/missionsList / create jobs
GET/tenants/:id/missions/:midJob detail
PATCH/tenants/:id/missions/:mid/briefEdit brief
PATCH/tenants/:id/missions/:mid/autonomyAutonomy level
PATCH/tenants/:id/missions/:mid/job-kindJob kind (outreach / campaign / …)
GET/PATCH/tenants/:id/missions/:mid/todos…Job todos
GET/tenants/:id/missions/:mid/artifactsArtifacts (use format=bytes for code bundles)
GET/tenants/:id/missions/:mid/pending-approvalsPending approvals for this job
POST/tenants/:id/missions/:mid/approve-pendingBatch-approve non-sensitive
POST/tenants/:id/missions/:mid/{pause|resume|kill}Lifecycle
POST/tenants/:id/missions/:mid/setup/{skip|refresh|seed-text|confirm-webhook|confirm-playbook}Setup plan actions
POST/tenants/:id/missions/:mid/amendments/{approve|deny}Brief amendments
POST/tenants/:id/missions/:mid/graph/amendments/{approve|deny}Graph amendments

Audience exports

MethodPathPurpose
GET/POST/PATCH/DELETE/tenants/:id/audience-exports…Manage exports
POST/tenants/:id/audience-exports/:exportId/runRun an export
POST/tenants/:id/audience-exports/credentials/s3Store S3 credentials (vaulted)

Examples

Wake the agent with a task:

curl -X POST -H "authorization: Bearer $WG_TOKEN" \
  -H "content-type: application/json" \
  -d '{"text": "Summarize this week and flag anything odd."}' \
  https://waveguide.adwave.com/tenants/ten_.../wake

Connect a curated MCP tool (Apollo):

curl -X POST -H "authorization: Bearer $WG_TOKEN" \
  -H "content-type: application/json" \
  -d "{\"catalog_id\": \"apollo\", \"secret\": \"$APOLLO_API_KEY\"}" \
  https://waveguide.adwave.com/tenants/ten_.../mcp/connections

Create a standing policy (auto-approve budget changes with a delta under $50):

curl -X POST -H "authorization: Bearer $WG_TOKEN" \
  -H "content-type: application/json" \
  -d '{
    "action_type": "campaign.budget_change",
    "predicate": {"budget_delta_cents": {"lt": 5000}},
    "effect": "auto_approve"
  }' \
  https://waveguide.adwave.com/tenants/ten_.../policies

Predicates map dotted paths in the tool input to constraints (lt, lte, gt, gte, eq, in), combined with AND semantics. An empty predicate {} matches every action of that type. Policies apply to T2 only — T3 always requires a human — and tainted input forces approval regardless of policy.

Kill switch:

curl -X POST -H "authorization: Bearer $WG_TOKEN" \
  https://waveguide.adwave.com/tenants/ten_.../kill

Approval resolution endpoints (/a/:token/approve, /a/:token/deny) use the signed single-use token carried in the approval card — they are not access-key-authenticated, because the token itself is the credential. Treat approval links like passwords: don’t forward them.

Rate limits and errors

Auth endpoints are rate-limited per IP; /wake allows 5 manual runs per hour. Public /book/:slug POSTs are rate-limited per IP. Errors return JSON ({"error": "message"}) with conventional status codes: 401 bad/expired credentials, 403 wrong tenant scope, 429 rate-limited, 5xx our problem.

Not in this reference

Agent-runtime callbacks (/runtime/*), provider webhooks (/webhooks/*), and internal/service routes are platform-internal — sandboxes call them with capability tokens, not your access key. Operator docs: docs/external-accounts.md, docs/runbook.md, docs/adr/0009-scheduling-service.md.