This contract defines the public Proof SDK flow for creating and operating on shared documents over HTTP.
Canonical route:
POST /documents
Compatibility alias:
POST /share/markdown
Legacy internal route:
POST /api/documents
POST /documents HTTP/1.1
Content-Type: application/json
Authorization: Bearer <apiKey> # when API-key auth is enabled{
"markdown": "# Plan\n\nShip the rewrite.",
"title": "Rewrite Plan",
"role": "commenter",
"ownerId": "agent:claude"
}POST /documents?title=Rewrite%20Plan&role=commenter HTTP/1.1
Content-Type: text/markdown
Authorization: Bearer <apiKey> # when API-key auth is enabled# Plan
Ship the rewrite.{
"success": true,
"slug": "abc123xy",
"docId": "b9d9f8e8-5a4e-4af8-a9d4-5e0ecf7ff4ab",
"url": "/d/abc123xy",
"shareUrl": "https://your-proof.example/d/abc123xy",
"tokenPath": "/d/abc123xy?token=...",
"tokenUrl": "https://your-proof.example/d/abc123xy?token=...",
"ownerSecret": "8b5f...owner secret...",
"accessToken": "4d53...link token...",
"accessRole": "commenter",
"active": true,
"shareState": "ACTIVE",
"snapshotUrl": "https://your-proof.example/snapshots/abc123xy.html",
"createdAt": "2026-02-12T16:10:00.000Z",
"_links": {
"view": "/d/abc123xy",
"state": "/documents/abc123xy/state",
"ops": { "method": "POST", "href": "/documents/abc123xy/ops" },
"events": "/documents/abc123xy/events/pending?after=0",
"docs": "/agent-docs"
}
}ownerSecret- Full-owner credential for that document
- Can pause, resume, revoke, delete, and perform owner-level agent actions
- Store securely and do not expose in user-facing UI
accessToken- Scoped link credential for
viewer,commenter, oreditor - Use this token for non-owner operations where possible
- If you need a tokenized share URL, use
tokenUrl
- Scoped link credential for
PROOF_SHARE_MARKDOWN_AUTH_MODE controls direct-share auth:
none: open route, good for local/devapi_key: requirePROOF_SHARE_MARKDOWN_API_KEYauto: resolve tononeby default in Proof SDK
/api/documents is governed separately by PROOF_LEGACY_CREATE_MODE:
allowwarndisabledauto
POST /documents- Persist
ownerSecretsecurely - Return
shareUrlto the user - Use
accessTokenorownerSecretfor follow-up operations
GET /documents/:slug/stateGET /api/documents/:slug/open-contextGET /api/documents/:slug/collab-sessionGET /api/documents/:slug/info
Use POST /documents/:slug/ops with:
type: "comment.add"type: "comment.reply"type: "comment.resolve"type: "suggestion.add"type: "suggestion.accept"type: "suggestion.reject"type: "rewrite.apply"
Send Idempotency-Key on mutation requests so retries stay safe.
- Poll:
GET /documents/:slug/events/pending?after=<id>&limit=<n> - Ack:
POST /documents/:slug/events/ack
- Resolve open context and capabilities
- Join collab with
session.collabWsUrlandsession.token - Refresh with
POST /api/documents/:slug/collab-refreshbefore token expiry - Reconnect using the refreshed token
curl -X POST http://localhost:4000/documents \
-H "Content-Type: application/json" \
-d '{"markdown":"# Plan\n\nShip the rewrite.","title":"Rewrite Plan","role":"commenter"}'