Built for agents. Governed by people.
Agents can draft and request. Only you can approve.
API overview
REST at https://api.civicoffices.com/v1 (JSON, idempotency keys on every write, cursor pagination). Keys look like co_live_… / co_test_…; test keys hit the sandbox and never send anything. Public catalog search is available now at /api/v1/navigator?q=….
| Operation | Endpoint |
|---|---|
| Search sources | GET /v1/navigator/search |
| Get a Path | GET /v1/paths/{slug} |
| Matters | POST/GET /v1/matters |
| Drafts | POST /v1/matters/{id}/drafts |
| Request approval | POST /v1/drafts/{id}/approval-requests |
| Send approved | POST /v1/approvals/{id}/send |
| Delivery | GET /v1/correspondence/{id}/events |
| Exports | POST /v1/matters/{id}/exports |
MCP tools
Remote MCP at https://mcp.civicoffices.com/mcp (OAuth) or local stdio npx @civicoffices/mcp. There is no approve tool.
search_official_sourcesresearch:readSearch the catalog by text, form number or code section.
{ "tool": "search_official_sources", "scope": "research:read" }get_source_metadataresearch:readURL, authority, last_checked, status.
{ "tool": "get_source_metadata", "scope": "research:read" }browse_activitiesresearch:readWalk the activity tree.
{ "tool": "browse_activities", "scope": "research:read" }get_pathresearch:readA guided Path with steps and sources.
{ "tool": "get_path", "scope": "research:read" }create_mattermatters:writeOpen a new matter.
{ "tool": "create_matter", "scope": "matters:write" }list_matters / get_matter / get_timelinematters:readRead matters and timelines.
{ "tool": "list_matters", "scope": "matters:read" }save_source_to_mattermatters:writeAttach an official source.
{ "tool": "save_source_to_matter", "scope": "matters:write" }update_path_stepmatters:writeMark Path progress.
{ "tool": "update_path_step", "scope": "matters:write" }list_deadlinesmatters:readUpcoming dates across matters.
{ "tool": "list_deadlines", "scope": "matters:read" }upload_documentdocuments:writeAdd a file to a matter.
{ "tool": "upload_document", "scope": "documents:write" }capture_web_evidencedocuments:writeTimestamped capture of a public page.
{ "tool": "capture_web_evidence", "scope": "documents:write" }organize_document_recorddocuments:writeLabel and order documents.
{ "tool": "organize_document_record", "scope": "documents:write" }add_notematters:writeAdd a note to the timeline.
{ "tool": "add_note", "scope": "matters:write" }create_administrative_draftdrafts:writeDraft correspondence (content from the customer).
{ "tool": "create_administrative_draft", "scope": "drafts:write" }request_customer_approvaldrafts:writeAsk the human to approve. Returns awaiting_human.
{ "tool": "request_customer_approval", "scope": "drafts:write" }get_approval_statusdrafts:readPoll approval state.
{ "tool": "get_approval_status", "scope": "drafts:read" }send_approved_messagesend:emailSend only what was approved — hash must match.
{ "tool": "send_approved_message", "scope": "send:email" }request_print_and_mailsend:mailQueue an approved letter for print & mail.
{ "tool": "request_print_and_mail", "scope": "send:mail" }get_delivery_statussend:readDelivery and tracking events.
{ "tool": "get_delivery_status", "scope": "send:read" }ingest_incoming_correspondenceincoming:writeAttach received mail/email.
{ "tool": "ingest_incoming_correspondence", "scope": "incoming:write" }list_incomingincoming:readList received items.
{ "tool": "list_incoming", "scope": "incoming:read" }create_remindermatters:writeSet a reminder.
{ "tool": "create_reminder", "scope": "matters:write" }export_matter_packet / get_exportexports:writeBuild a dated packet.
{ "tool": "export_matter_packet", "scope": "exports:write" }cancel_correspondencesend:cancelCancel within the hold window.
{ "tool": "cancel_correspondence", "scope": "send:cancel" }Scope templates
| Template | Can | Cannot |
|---|---|---|
| Research only | Search, read sources and Paths | Touch matters |
| Docket assistant | + matters, documents, notes, reminders | Draft or send |
| Correspondence drafter | + drafts, request approval | Send without approval |
| Full agent (no approvals) | + send what a human approved, cancel | Approve — ever |
Approval model
Agents can draft and request. Only you can approve. An agent can create a draft and request approval; the human receives the rendered final by email/SMS/app and approves with a passkey. The approval binds a SHA-256 of the exact content, recipients, channel and price. send_approved_message fails if anything changed.
Sample requests
curl -X POST https://api.civicoffices.com/v1/drafts/drf_19QA/approval-requests \ -H "Authorization: Bearer co_test_…" -H "Idempotency-Key: 5d1c…"
{ "id": "apr_77Z", "status": "awaiting_human",
"content_sha256": "9f3c…a1", "expires_at": "2026-10-29T00:00:00Z" }See also /llms.txt.