Civic Offices
For AI Agents

Built for agents. Governed by people.

Agents can draft and request. Only you can approve.

Coming soon API keys are not issued yet. Join the waitlist →

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=….

OperationEndpoint
Search sourcesGET /v1/navigator/search
Get a PathGET /v1/paths/{slug}
MattersPOST/GET /v1/matters
DraftsPOST /v1/matters/{id}/drafts
Request approvalPOST /v1/drafts/{id}/approval-requests
Send approvedPOST /v1/approvals/{id}/send
DeliveryGET /v1/correspondence/{id}/events
ExportsPOST /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

TemplateCanCannot
Research onlySearch, read sources and PathsTouch matters
Docket assistant+ matters, documents, notes, remindersDraft or send
Correspondence drafter+ drafts, request approvalSend without approval
Full agent (no approvals)+ send what a human approved, cancelApprove — 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…"

See also /llms.txt.