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
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
Send in your own system
If the result allows contact, perform the actual outbound action in your CRM, campaign system, or agent runtime.
- 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.
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.
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.
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.
Append the resulting event
After the send, reply, unsubscribe, bounce, or meeting happens, append that fact with provenance and an idempotency key.
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.
| Method | Path | Purpose |
|---|---|---|
| GET | /api/public/macro-trends | Return free public global macro trends with no workspace-private analytics. |
| GET | /api/metrics | Inspect in-memory operational counters for contactability, imports, and webhook delivery health. |
| GET | /api/analytics/macro-trends | Return workspace and global trend summaries for the operator dashboard. |
| POST | /api/contactability/check | Determine whether contact is allowed right now using a person, organization, or identity lookup. |
| POST | /api/outreach-events | Append a contact attempt, reply, meeting, unsubscribe, bounce, or note after it happens. |
| POST | /api/targets/summary | Return the resolved target, known identities, recent events, and current policy inputs in one payload. |
| POST | /api/targets/history | Retrieve recent outreach history for a target when a timeline view is needed. |
| POST | /api/targets/policy-document | Export the active rule set as policy.v1 for portable policy reasoning. |
| POST | /api/federation/query | Return matching signed partner signals for an exact identity and channel. |
| POST | /api/federation/signals | Append a signed negative signal and choose whether it stays workspace-local or is shared inside trusted partner boundaries. |
| GET | /api/record-links | Inspect 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-references | Attach or upsert portable external identifiers on records so CRM, import, and federation evidence stays queryable across systems. |
| GET | /api/imports/outreach-csv | List 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-csv | Enqueue a durable outreach CSV import job for background processing. |
| GET | /api/webhooks/{id}/deliveries | Inspect recent webhook delivery attempts for one subscription, including retries, next attempt time, and terminal dead-letter state. |
| POST | /api/webhooks/{id}/deliveries/{deliveryId}/replay | Requeue a failed or dead-letter webhook delivery for another attempt cycle. |
| POST | /api/record-flags | Flag disputed, wrong, or malicious records without mutating underlying history. |
| GET | /api/policy-decisions | Retrieve 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
- Local workspace rules remain authoritative for local policy and overrides.
- Trusted partner signals add evidence to the contactability decision.
- Low-trust or disputed partner signals should escalate toward review, not silently merge.
- 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-trendsCheck 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.