API Changelog
NexSpace uses date-based API versioning. Breaking changes ship only under a new version date; additive, non-breaking changes (new fields, new endpoints) roll out to all active versions and are listed here under Additive changes.The machine-readable source of truth for supported versions is
GET https://api.nexspace365.com/.well-known/api-versions. Pin your
integration with the NexSpace-Version header.Versions
2026-07-24 — Headless AI follow-on
Extends the headless stack after Tiers 1–3:
-
Broadened event triggers.
eventautomations now fire onstaff.onboarded,lead.qualified, andcredential.expiredin addition to the shift events. See Agent Automations. -
Run-outcome auto-disable. A trigger’s
consecutiveFailuresstreak now counts runs that error mid-flight (not just dispatch failures); a completed run resets it. The auto-disable quarantine therefore reacts to agents that repeatedly error, not only ones that fail to enqueue. -
MCP Streamable-HTTP. Send
Accept: text/event-streamon atools/callto receive the response as SSE. Supplyparams._meta.progressTokento also getnotifications/progressframes. Streams are resumable: reconnect toGET /mcp/stream/{streamId}(from theMcp-Stream-Idresponse header) with aLast-Event-IDheader to replay missed frames. -
CLI
agents run. Start and stream a headless run from the terminal, with--output-format stream-jsonfor line-delimited JSON (NDJSON) events. - Status: Latest · stable
- Sunset: none
2026-07-23 — Headless AI Tier 3
In-product agent automations. Cron schedule and event triggers
(GET/POST/PATCH/DELETE /api/agent-builder/{id}/triggers, plus /toggle
and /run-now) that fire agents through the durable run path. A timezone-aware
cron dispatcher computes nextRunAt and auto-disables a trigger after a
consecutive-failure streak; event triggers dispatch on matching business events.
Both inherit the one-run-per-agent guard, the lifecycle webhooks, and the
approval loop. Adds the runAsUserId privilege-escalation guard (binding another
user is internal-operator only, otherwise 403 RUN_AS_FORBIDDEN) and
per-mutation audit. See Agent Automations.
- Status: Stable
- Sunset: none
2026-07-22 — Headless AI Tiers 1–2
Tier 1 — the agent-run API. POST /api/agents/{id}/runs behind the
agents:run scope, with resumable SSE streaming (Last-Event-ID), MCP
request-id correlation, MCP idempotency, and outputSchema on registry tools.
Tier 2 — the approval-resolution loop. List a paused run’s approvals, then
approve/reject with the agents:approve scope to resume or terminate it; the
rejected run status; run lifecycle webhooks (agent_run.pending_approval,
agent_run.completed, agent_run.failed); MCP approval verbs; run list and
cancel (GET/DELETE /api/agents/{id}/runs); and orphan/retention
reconciliation. See Agent Runs.
- Status: Stable
- Sunset: none
2026-05-10 — Initial public API
The headless ecosystem launch: API keys, OAuth 2.1 (PKCE + Dynamic Client
Registration), the hosted MCP server, curated agent verbs, idempotency,
sandbox test keys, and usage analytics.
- Status: stable
- Sunset: none
Additive changes
Non-breaking improvements applied to all active versions. These do not require a version bump — your existingNexSpace-Version pin keeps working.
-
@nexspace/cli@0.2.0agent surface — discovery loop (search→mcp schema→--dry-run), first-class MCP verb commands,skill install,context use, webhooks +events listen(HMAC), approvals / audit /logs tail, fixtures, andconformance run. See CLI Overview and Commands. The CLI ships on its own semver, independent of the dated API versions above — nothing here changes the REST contract. Note that 0.2.0 does change the CLI’s default output format for scripts: see Output format. 0.2.0 also fixes the documented exit codes, which never actually worked: the bin entrypoint collapsed every failure to1, so2(auth) and3(bad input) were unreachable. Agents branching on exit status will now see the distinct codes instead of a uniform1. -
Rate-limit headers on every API-key response —
X-RateLimit-Limit,X-RateLimit-Remaining,X-RateLimit-Reset,X-RateLimit-Window, andX-RateLimit-Policynow accompany every successful API-key-authenticated response, so agents can throttle proactively. The429rejection carries the first four plusRetry-After, but notX-RateLimit-Policy. See Rate Limits. -
Structured error contract for agents — error responses now carry
suggestionandretryablefields (and, over MCP, aSuggestion:line in tool-error text) so LLM agents can self-correct. See Error Handling. -
Webhook retries & auto-disable — failed deliveries now retry on a fixed
exponential backoff (30s, 2m, 15m, 1h, 6h). After the initial send plus 5
retries all fail, the subscription is automatically disabled and its creator is
notified; re-enable it with
PATCH /api/webhooks/{id}. See Webhooks → Retry Policy. -
On-demand sandbox reset —
POST /api/sandbox/resetclears a facility’snex_test_sandbox rows and re-seeds a small synthetic dataset for a clean slate. See Sandbox. Prefernexspace fixtures sandbox-reset --facility-id Nwhen using the CLI (session auth only). -
Credential-agnostic identity probe —
GET /api/auth/mereturns the identity a credential authenticates as, accepting any supported credential (API key, PAT, OAuth access token, or session). It’s the shared “who am I” endpoint for the CLI (nexspace whoami), SDKs, and MCP clients. See Authentication → Verify identity.
Headless capability waves
These expanded what a headless credential can reach over MCP. All are additive: no REST contract changed, and no existingNexSpace-Version pin is affected.
Several introduce new scopes, though — a credential minted before those
waves shipped will not reach the new tools until the scope is granted, and none
of the new scopes are part of the default connector set.
- CRM writes (
crm:write) — thecrmtool category flipped from read-only toread_writeover MCP after a tenancy audit of its write tools. The legacycrm:*wildcard also satisfies the new scope. See Scopes and the Tool catalog. - Scheduling writes (
scheduling:write) — theschedulingcategory flipped toread_write: the shift writers plus the schedule-settings writers. See Scopes and the Tool catalog. - Communications writes (
communications:write) — thecommunicationscategory flipped toread_write: scoped individual outreach (send_sms,send_email_notification) and the org-verified campaign writers. Fan-out tools that never had a delivery engine stay denylisted. See Scopes and the Tool catalog. - Connected-apps lane (
apps:read/apps:write) — whitelabeled third-party actions (Slack, QuickBooks, HubSpot, …) brokered through the org’s connected accounts, on their own scope lane rather than a tool category. Deliberately not part of the default connector scopes: reaching into an owner’s outside SaaS has to be an explicit grant. See MCP → Connected-app actions. Ships withlist_connected_apps, a read-only tool listing which apps the current user has connected. - Deep-research tools (
search/fetch) — two read-only knowledge-base tools using the names ChatGPT’s connector expects:searchreturns matching organization documents,fetchreturns one document’s full text by the idsearchreturned. Results are scoped to the caller’s organization and role. See ChatGPT. get_approval_status— a read-only tool that resolves theapprovalIdreturned when a write answerspending_approval, reporting the lifecycle status (pending / approved / rejected / expired) and, once resolved, the execution result or rejection reason. Only your own submitted actions are visible. See MCP → Approvals.- Org guardrails on MCP dispatch — organization AI guardrail policies
(
block/require_approval/warn) are now evaluated on the headless MCP path, not just inside the in-app agent loop. A blocking policy answers JSON-RPC-32003with the policy name undererror.data.guardrail; arequire_approvalpolicy forces the approval gate on a write that would otherwise auto-execute. See Governance. - MCP rate limiter — MCP calls are now metered by their own limiter,
separate from the
/apiper-key budget: 120 requests/minute by default, bucketed per API key, else per user, else per IP. See Rate limits → MCP rate limits. - Model-tier equivalence gate — an operator can require a capable model for a
specific tool. Since your model is invisible to the server, an external caller
is graded by a credential-level tier equivalence; an ungraded credential fails
closed against a floored tool with
-32003carryingrequiredTierandtierEquivalence. No tool ships with a floor by default. See Model tier gate.
Deprecation policy
- 12-month window — a deprecated version keeps working for at least 12
months. During that window responses include RFC 8594
DeprecationandSunsetheaders. - After sunset — requests pinned to a removed version return
410 Gonewith codeVERSION_SUNSET. Upgrade to the latest version to resolve. - Migration notes for each new version are published on this page before the previous version’s sunset date.

