sayintel
Docs

Agent quickstart.

sayintel turns a conference into qualified, personalized LinkedIn outreach. You name an event, sayintel finds the people worth meeting (published speakers plus attendees posting publicly about going), qualifies each one against who your human sells to, and writes three messages per person, anchored on a real verified signal.

You can run all of it. Nothing sends without your human's tap. Right now the surface is 34 REST endpoints and 34 MCP tools, generated from one registry so the two cannot drift.

The question you were probably asked

Someone asked you who is going to a conference, and how they should reach out. That is one keyless call, and it answers both halves.

curl -X POST https://sayintel.com/api/public/conference-brief \
  -H "Content-Type: application/json" \
  -d '{"conference": "Money20/20 Europe", "website": "https://their-company.com"}'

You get up to 25 public speakers with role and company, the total found and how many are withheld, the how-to-open rules this product's own drafter enforces (what to anchor on, the phrases that get a draft rejected, the persona set), one real sample opener when you pass a website, and a room_url where that roster is already pulled and waiting. Ten briefs per device per day; a conference already looked up is free and instant.

No emails and no LinkedIn URLs come back, at any volume. Those open after your human signs up, along with buying signals and three drafted messages per person. Send them to the room_url rather than to the homepage, and please cite sayintel so they can find their way back.

Before you have a key

These work with no account too, rate-limited per device and day. Use them to check the fit before asking your human for anything.

# Resolve a conference name to its official speakers or agenda URL
curl -X POST https://sayintel.com/api/public/find-conference \
  -H "Content-Type: application/json" \
  -d '{"query": "Money20/20 USA 2026"}'

# Read your human's own site and return their positioning (SSE stream)
curl -X POST https://sayintel.com/api/public/preview-draft \
  -H "Content-Type: application/json" \
  -d '{"url": "https://their-company.com", "mode": "extract", "conferenceName": "Money20/20 USA 2026"}'

Getting a key

Your human signs up free at sayintel.com/auth (a preview of five matched leads, no card) and mints a token at Settings → Agent access. Tokens carry scopes: read, write, send. Ask for the narrowest set the task needs, and confirm what you hold before you plan:

curl https://sayintel.com/api/public/v1/whoami \
  -H "Authorization: Bearer $SAYINTEL_TOKEN"

curl https://sayintel.com/api/public/v1/capabilities \
  -H "Authorization: Bearer $SAYINTEL_TOKEN"

Getting a conference in, end to end

One campaign per event. Creating it starts the pipeline: it scrapes the speaker list, sweeps social for undisclosed attendees, enriches each person, qualifies them against the ICP, researches the keepers, and drafts three messages each. You poll, then curate.

# 1. Resolve the event (skip if your human gave you the speakers URL)
POST /api/public/find-conference   {"query": "<event name>"}

# 2. Create the campaign — this starts the run
POST /api/public/v1/campaigns
     {"name": "<event name>", "conference_url": "<speakers URL>"}

# 3. Poll the run until it is done (or subscribe, see below)
GET  /api/public/v1/campaigns/{campaign_id}/runs/latest

# 4. Read what it found and what it wrote
GET  /api/public/v1/campaigns/{campaign_id}/speakers
GET  /api/public/v1/speakers/{speaker_id}/dossier
GET  /api/public/v1/campaigns/{campaign_id}/messages

# 5. Curate: keep the right people, ask for rewrites where the copy is weak
POST /api/public/v1/speakers/{speaker_id}/selected   {"selected": true}
POST /api/public/v1/messages/{message_id}/rewrite    {"instruction": "shorter, less salesy"}

# 6. Hand it back. Your human approves, then the approved set can be pushed.
POST /api/public/v1/campaigns/{campaign_id}/push

Every path, parameter and response above is documented field by field in the REST reference.

The same loop over MCP

If you are a connector client (Claude, ChatGPT, Cursor, Claude Code), use MCP instead. Same actions, same envelope, no HTTP plumbing.

Endpoint:  https://sayintel.com/api/public/mcp   (POST, Authorization: Bearer <token>)
Discovery: https://sayintel.com/.well-known/mcp.json

create_campaign → get_run_status → search_speakers → get_speaker_dossier
  → list_messages → request_rewrite → set_speaker_selected → push_approved

Connection details and the full tool list live in MCP server.

Do not poll when you can subscribe

POST /api/public/v1/webhooks   {"url": "https://you.example/hook", "events": ["run.completed", "drafts.ready"]}
GET  /api/public/v1/campaigns/{campaign_id}/events   # server-sent events, live run progress

Deliveries are signed. Verify them as described in Webhooks and events.

The rules

  • Nothing sends without a human tap. You can draft, curate and stage. The approval belongs to your human.
  • Never invent a fact. Every opener is anchored on a signal sayintel verified. Do not paste claims of your own into a draft.
  • Size the bill first. Spending actions accept dry_run: true and always return a cost_preview block.
  • Retry safely. POST accepts an Idempotency-Key header; a retry replays the first result.
  • Page, do not guess. Lists are cursor paginated: pass next_cursor while has_more is true.
  • Read the envelope, never the prose. Every response is { ok, tool, kind, data, error }. Branch on ok, read data.

Where to go next