API Documentation

API reference and integration guide.

It gives agents, CRMs, recruiting tools, partner workflows, and other outbound systems a shared record of what happened, who acted, which channel was used, what rules applied, and why the action was allowed or denied. Today it ships as a workspace-scoped system of record with a dashboard over the same data, designed to grow into shared infrastructure for agent-mediated contact rather than stay trapped inside one outbound tool.

Signed negative-signal exchange is available inside explicit partner trust boundaries; raw outreach history stays workspace-private. Public ecosystem visibility now lives at /api/public/macro-trends. It returns global aggregate data only, with no workspace-level breakdowns or private target history. Exact counts stay redacted until the network clears the minimum publisher threshold, but the response still exposes broad privacy-stage metadata.

Overview

Use the small loop that matters most.

Most integrations do not need every route on day one. The practical path is to wire the decision loop first, then add history import and review surfaces later.

  1. 1

    Check contactability

    Call the policy check before an outbound action so the agent sees opt-outs, cooldowns, and back-off decisions before it sends.

  2. 2

    Send in your own system

    If the result allows contact, perform the actual outbound action in your CRM, campaign system, or agent runtime.

  3. 3

    Append the resulting event

    Log what happened with provenance and an idempotency key so Singularity becomes the durable record of that contact.

Quickstart

First integration pass

These are the five steps that usually get an integration from zero to useful.

1

Claim a workspace domain

From the workspace dashboard, claim a domain and verify it with a DNS TXT record so matching operator sign-ins can open the workspace automatically.

2

Issue a workspace API key

Create a workspace-scoped key in the dashboard with only the paths the integration needs. Named keys act as service principals, and imports or webhooks can now be scoped separately for read and manage access.

3

Run contactability before outbound actions

Call the contactability endpoint before each outbound send so the external system respects opt-outs, cooldowns, back-off rules, and global negative-signal matches.

4

Append the resulting event

After the send, reply, unsubscribe, bounce, or meeting happens, append that fact with provenance and an idempotency key.

5

Read macro trends or target context when needed

Use macro trends for dashboard-level pulse checks and target summary or history reads when an agent or operator needs more context on a specific contact.

Operator Note

Operators can also connect HubSpot and Salesforce from the dashboard Integrations page for first-party CRM sync. Those routes are intentionally operator-managed and sit outside the stable public API contract.

Conventions

Assumptions every client should make

These conventions should stay stable across the current public contract.

Authentication
Authorization: Bearer <workspace-api-key>
Public read
GET /api/public/macro-trends requires no auth
Request format
JSON request and response bodies
Timestamp format
RFC3339
Write safety
Send Idempotency-Key on external writes
Signed writes
Optional X-Singularity-Signature header for API keys configured with Ed25519 public keys
Current boundary
One workspace per API key
Integration scopes
Examples: imports:read, imports:write, webhooks:read, webhooks:manage
Identity claim
Verify workspace domains from the dashboard with DNS TXT
Error shape
{"code":"invalid_request","error":"message"}

Standard headers

Authorization: Bearer <workspace-api-key>
Content-Type: application/json
Idempotency-Key: <stable-unique-key-for-write-requests>
X-Singularity-Signature: <optional-base64-ed25519-signature>

Endpoint Reference

Core routes

Start with these routes unless you already know you need the wider review or import surface.

MethodPathPurpose
GET/api/public/macro-trendsReturn free public global macro trends with no workspace-private analytics.
GET/api/metricsInspect in-memory operational counters for contactability, imports, and webhook delivery health.
GET/api/analytics/macro-trendsReturn workspace and global trend summaries for the operator dashboard.
POST/api/contactability/checkDetermine whether contact is allowed right now using a person, organization, or identity lookup.
POST/api/outreach-eventsAppend a contact attempt, reply, meeting, unsubscribe, bounce, or note after it happens.
POST/api/targets/summaryReturn the resolved target, known identities, recent events, and current policy inputs in one payload.
POST/api/targets/historyRetrieve recent outreach history for a target when a timeline view is needed.
POST/api/targets/policy-documentExport the active rule set as policy.v1 for portable policy reasoning.
POST/api/federation/queryReturn matching signed partner signals for an exact identity and channel.
POST/api/federation/signalsAppend a signed negative signal and choose whether it stays workspace-local or is shared inside trusted partner boundaries.
GET/api/record-linksInspect typed evidence links between records so operators and agents can trace why a target, idea, or federated signal is related to another record.
POST/api/external-referencesAttach or upsert portable external identifiers on records so CRM, import, and federation evidence stays queryable across systems.
GET/api/imports/outreach-csvList recent outreach CSV import jobs for a workspace, optionally filtered by status.
GET/api/imports/outreach-csv/{id}Inspect one outreach CSV import job, including row counts, retries, and any row-level errors.
POST/api/imports/outreach-csvEnqueue a durable outreach CSV import job for background processing.
GET/api/webhooks/{id}/deliveriesInspect recent webhook delivery attempts for one subscription, including retries, next attempt time, and terminal dead-letter state.
POST/api/webhooks/{id}/deliveries/{deliveryId}/replayRequeue a failed or dead-letter webhook delivery for another attempt cycle.
POST/api/record-flagsFlag disputed, wrong, or malicious records without mutating underlying history.
GET/api/policy-decisionsRetrieve stored policy decisions for audit, filtering, and review workflows.

Partner Signals

Trust-bounded signal exchange, not a public contact graph

The live rollout remains workspace-scoped, but signed negative signals can be exchanged inside explicit partner trust boundaries without exposing raw outreach history.

What this layer does now

  • Exchange trusted opt-out, hard-bounce, complaint, manual-block, and cooldown signals.
  • Let the publisher choose whether a signal stays workspace-local or is shared with trusted partners.
  • Require signed partner attestations and explicit trust boundaries.
  • Use exact-match identities first, such as email, domain, and E.164 phone.
  • Improve deny accuracy and sender hygiene across participating systems without merging full timelines.

What this layer should not do

  • Share full cross-customer outreach histories by default.
  • Create a public global identity graph or reputation score.
  • Allow open writes from untrusted tools.
  • Use broad fuzzy matching as the first partner-signal primitive.

Current evaluation model

  1. Local workspace rules remain authoritative for local policy and overrides.
  2. Trusted partner signals add evidence to the contactability decision.
  3. Low-trust or disputed partner signals should escalate toward review, not silently merge.
  4. Partner signals should never create an implicit allow. They only add deny or review evidence.

Query signed partner signals

curl -X POST https://memory.conseqai.com/api/federation/query \
  -H "Authorization: Bearer $SINGULARITY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "tenantId": "workspace_123",
    "channelId": "email",
    "subject": {
      "identityType": "email",
      "identityValue": "lena@example.com"
    }
  }'

Publish a signed negative signal

curl -X POST https://memory.conseqai.com/api/federation/signals \
  -H "Authorization: Bearer $SINGULARITY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "tenantId": "workspace_123",
    "version": "federation.signal.v1",
    "shareScope": "global",
    "partnerId": "partner_123",
    "partnerKeyId": "key_123",
    "signalType": "network_opt_out",
    "channelId": "email",
    "observedAt": "2026-03-26T12:00:00Z",
    "subject": {
      "identityType": "email",
      "identityValue": "lena@example.com"
    },
    "source": {
      "sourceSystem": "cold-agent",
      "actorIdentifier": "campaign-bot"
    },
    "evidence": {
      "reasonCode": "unsubscribe"
    },
    "signature": "<base64-ed25519-signature>"
  }'

Examples

Copy-paste starting points

These are the requests most integrations and public consumers need first.

Read public macro trends

curl https://memory.conseqai.com/api/public/macro-trends

Check contactability before send

curl -X POST https://memory.conseqai.com/api/contactability/check \
  -H "Authorization: Bearer $SINGULARITY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "tenantId": "workspace_123",
    "channelId": "email",
    "includeFederation": true,
    "identityType": "email",
    "identityValue": "lena@example.com"
  }'

Append an outreach event

curl -X POST https://memory.conseqai.com/api/outreach-events \
  -H "Authorization: Bearer $SINGULARITY_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: msg_01JX8X..." \
  -d '{
    "tenantId": "workspace_123",
    "channelId": "email",
    "eventType": "contact_attempt",
    "direction": "outbound",
    "identityType": "email",
    "identityValue": "lena@example.com",
    "sourceSystem": "cold-agent",
    "sourceRecordId": "message_48291",
    "actorType": "external_agent",
    "actorIdentifier": "campaign-bot"
  }'

Read the target summary

curl -X POST https://memory.conseqai.com/api/targets/summary \
  -H "Authorization: Bearer $SINGULARITY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "tenantId": "workspace_123",
    "identityType": "email",
    "identityValue": "lena@example.com"
  }'

Import outreach history from CSV

curl -X POST https://memory.conseqai.com/api/imports/outreach-csv \
  -H "Authorization: Bearer $SINGULARITY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "tenantId": "workspace_123",
    "sourceSystem": "crm-sync",
    "csv": "personId,channelId,eventType,occurredAt,sourceRecordId\nperson_123,email,contact_attempt,2026-03-26T12:00:00Z,row_42"
  }'

# Response:
# {"id":"job_123","status":"queued","totalRows":1,"importedCount":0,"duplicateCount":0,"failedCount":0,"errors":[]}

curl https://memory.conseqai.com/api/imports/outreach-csv/job_123 \
  -H "Authorization: Bearer $SINGULARITY_API_KEY"

# Later response:
# {"id":"job_123","status":"completed","totalRows":1,"importedCount":1,"duplicateCount":0,"failedCount":0,"errors":[]}

Inspect webhook deliveries

curl "https://memory.conseqai.com/api/webhooks/wh_123/deliveries?limit=10" \
  -H "Authorization: Bearer $SINGULARITY_API_KEY"

# Response excerpt:
# {"deliveries":[{"id":"wd_123","deliveryStatus":"failed","attemptCount":1,"nextAttemptAt":"2026-03-28T14:30:00Z"}]}

curl -X POST https://memory.conseqai.com/api/webhooks/wh_123/deliveries/wd_123/replay \
  -H "Authorization: Bearer $SINGULARITY_API_KEY"

AI Guides

Point an assistant at the contract directly

If you want an AI assistant to explain how to integrate, give it the machine-readable guide first so it starts from the actual public contract.

Suggested prompt

Read https://memory.conseqai.com/llms-full.txt and show me how to integrate contactability checks, outreach logging, and target summaries into my agent, CRM, or outbound tool.