Eaglecross API & MCP
Research B2B leads and write personalized cold-email icebreakers from ChatGPT, Claude, your coding agent, your own code, or automation tools. Same engine, credits, presets and templates as the web app.
Base URL
https://api.eaglecross.xyzMCP server
https://api.eaglecross.xyz/mcpAsynchronous jobs
Start a job, poll its progress, then read the leads. A batch takes about 30-90 seconds.
Same as the web app
Jobs, presets, templates and credits are shared: a job started over the API shows up in your dashboard.
JSON everywhere
Requests and responses are JSON (CSV upload and export too). Errors share one shape with a stable code.
Give Eaglecross a list of prospects (company, website, and ideally a contact name and title). For each lead it finds recent buying signals (hiring, funding, launches, news, tech-stack changes) with their sources, scores the lead against your Ideal Customer Profile preset, flags it reach (contact now) or skip, and writes an email subject and opening line for reach leads.
Quickstart
- 1Start a jobTerminal
curl -X POST https://api.eaglecross.xyz/v1/jobs \ -H "Authorization: Bearer $EAGLECROSS_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "name": "Fintech founders - Oct", "preset": "b2b_saas", "lookback_window": "balanced", "leads": [ {"name": "Jane Doe", "title": "CEO", "company": "Acme", "website": "acme.com"}, {"name": "Sam Lee", "title": "Head of Growth", "company": "Beta", "website": "https://beta.io"} ] }' - 2Poll until "status": "done" (every 15-30 seconds is plenty)Terminal
curl https://api.eaglecross.xyz/v1/jobs/$JOB_ID -H "Authorization: Bearer $EAGLECROSS_API_KEY" - 3Read the leads worth contacting, or export everything as CSVTerminal
curl "https://api.eaglecross.xyz/v1/jobs/$JOB_ID/leads?reach_flag=reach" -H "Authorization: Bearer $EAGLECROSS_API_KEY" curl -o leads.csv https://api.eaglecross.xyz/v1/jobs/$JOB_ID/leads.csv -H "Authorization: Bearer $EAGLECROSS_API_KEY"
Authentication
Create an API key in the web app under Settings → API & MCP (every plan). Send it as a bearer token on every request. Interactive reference with every schema: api.eaglecross.xyz/docs (OpenAPI at /openapi.json).
ec_live_, are shown once, and can be revoked anytime in Settings. Keep them server-side: never put a key in browser code or a public repo.Authorization: Bearer ec_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxMCP server
The Eaglecross MCP server works with any client that supports remote MCP servers. You sign in with your Eaglecross account when connecting (OAuth), on every plan, so no API key is needed. Eaglecross never sees your conversations.
Claude (web & desktop)
Settings → Connectors → Add custom connector → paste the MCP URL → Connect, then sign in to Eaglecross.
ChatGPT
Settings → Apps & Connectors → enable Developer mode (Advanced settings) → Create → paste the URL, authentication OAuth, then sign in.
Grok
grok.com → Connectors → add a custom connector with the URL, then sign in to Eaglecross.
Cursor, VS Code, others
Add a remote (streamable HTTP) MCP server with the URL. Clients without OAuth can send Authorization: Bearer ec_live_….
claude mcp add --transport http eaglecross https://api.eaglecross.xyz/mcpgemini mcp add --transport http eaglecross https://api.eaglecross.xyz/mcp{
"mcpServers": {
"eaglecross": {
"url": "https://api.eaglecross.xyz/mcp",
"headers": { "Authorization": "Bearer ec_live_…" }
}
}
}| Tool | What it does | Type |
|---|---|---|
get_account | Plan, credits left, default ICP preset. | read |
list_icp_presets | ICP presets and the signals each one prioritizes. | read |
research_leads | Research up to 100 leads per call, or a pasted CSV of up to 500 rows (uses credits). | write |
get_job | Job progress: leads done, reach/skip counts. | read |
list_jobs | Recent jobs, including ones from the web app. | read |
get_job_leads | Scored leads with icebreakers and top signals. | read |
get_lead | All signals with sources and dates for one lead. | read |
rewrite_icebreaker | Rewrite one lead's subject + opener (1 credit). | overwrite |
cancel_job | Stop a running job; finished leads are kept. | destructive |
get_export_link | 1-hour CSV download link for a job's results. | write |
get_settings | Default preset, templates, instructions, analysis options. | read |
update_settings | Change those defaults (shared with the web app). | overwrite |
Assistants are told to confirm with you before researching more than 20 leads. Then ask, for example:
Research these 5 founders and tell me who to email this week, with the opener for each:
- Jane Doe, CEO, Acme (acme.com)
- ...Agent skill (SKILL.md)
Drop this file into Claude Code (.claude/skills/eaglecross/SKILL.md), Cursor rules, Codex or any coding agent to teach it the API: the job workflow, credits, limits, and errors. Or paste it into a chat with Copy for LLM.
---
name: eaglecross
description: Research B2B leads with the Eaglecross API - find recent buying signals (hiring, funding, launches, news, tech-stack changes), score each lead against an ICP preset, and get a personalized cold-email subject and opening line for leads worth contacting. Use when the user wants to research prospects, find who to email, or write icebreakers. Works in Claude Code, Cursor, Codex, Gemini CLI and any agent that can make HTTP requests.
---
# Eaglecross API
Eaglecross turns a list of prospects into a ranked outreach list. For each lead it researches the company's
website, news, job posts and tech stack, scores the lead against the user's Ideal Customer Profile (ICP) preset,
flags it `reach` (contact now) or `skip`, and writes an email subject + opening line for reach leads.
It is the same engine, credits, presets and templates as the web app (https://app.eaglecross.xyz).
Docs: https://www.eaglecross.xyz/api · Interactive reference: https://api.eaglecross.xyz/docs · OpenAPI: https://api.eaglecross.xyz/openapi.json
## Auth
- Base URL: `https://api.eaglecross.xyz`
- Header on every request: `Authorization: Bearer $EAGLECROSS_API_KEY`
- Keys start with `ec_live_`. The user creates one in the web app under Settings → API & MCP (every plan).
Never print or commit the key; read it from the environment.
- Prefer MCP when the client supports it: `https://api.eaglecross.xyz/mcp` (OAuth sign-in, no key needed).
## Workflow
1. `GET /v1/account` - check `credits_balance` before starting. Tell the user the cost first.
2. `POST /v1/jobs` with `{"name", "preset"?, "lookback_window"?, "advanced_analysis"?, "leads": [...]}`
- each lead: `company` and `website` required; `name`, `title`, `linkedin_url`, `company_description`,
`location`, `industry` optional (name + title make better icebreakers)
- or `POST /v1/jobs/csv` (multipart `file`, max 5 MB) with the web app's CSV columns
3. Poll `GET /v1/jobs/{id}` every 15-30 s until `status` is `done` (a batch takes ~30-90 s).
`stalled: true` means no progress for 10+ minutes: tell the user to contact support@eaglecross.xyz.
4. `GET /v1/jobs/{id}/leads?reach_flag=reach` for leads to contact (highest score first, `limit` ≤ 200).
`GET /v1/jobs/{id}/leads.csv` for everything as CSV, or `POST /v1/jobs/{id}/export-link` for a 1-hour link.
5. `GET /v1/leads/{id}` for every signal with its source URL and date.
6. `POST /v1/leads/{id}/icebreaker` to rewrite an opener (`instructions`, `template`, `subject_template`).
Other endpoints: `GET /v1/presets`, `GET /v1/jobs` (status, limit ≤ 100, offset), `POST /v1/jobs/{id}/cancel`,
`DELETE /v1/jobs/{id}`, `GET /v1/settings`, `PATCH /v1/settings`.
Options: `preset` = `lead_gen_agency` | `b2b_saas` | `ai_agency` | `custom` (default: the user's saved preset);
`lookback_window` = `aggressive` (fresh signals only) | `balanced` | `lenient`; `advanced_analysis` (Pro only).
## Reading results
- `reach_flag`: `reach` = strong recent signal, contact now; `skip` = nothing strong enough yet (no icebreaker).
- `score`: 0-100 after time decay. `reach_reason`: why. `intent_summary`: what the company is focused on.
- `icebreaker_subject` / `icebreaker_body`: ready to paste into an email.
- `top_signals` / `signals`: `type`, `snippet`, `source_url`, `published_date`, `tier`, `score`.
Cite the source URL when you tell the user why a lead is worth contacting.
## Credits and limits (same as the web app)
- 1 credit per lead, including its icebreaker; 2 with advanced analysis (Pro). 1 credit per standalone rewrite.
Reads are free. Failed leads are refunded.
- Starting a job needs at least 1 credit per lead. There is no other cap on leads per job.
- One job processing at a time per account (web app and API combined). Leads inside a job run in parallel
per plan: Free 2, Standard 5, Pro 10. Signals kept per lead: Free 8, Standard 16, Pro 20.
- Over MCP, `research_leads` takes up to 100 leads, or a pasted CSV of up to 500 rows, per call.
## Safety
- Confirm with the user before researching more than 20 leads (it spends credits) and before
`DELETE /v1/jobs/{id}` or `POST /v1/jobs/{id}/cancel`.
- Don't start a second job while one is processing; you'll get 429 `too_many_active_jobs`.
## Errors
Shape: `{"error": {"code": "...", "message": "...", "details"?: [...]}}`
| Status | code | Do |
|---|---|---|
| 401 | unauthorized | Key missing, invalid, expired or revoked |
| 402 | insufficient_credits | Ask the user to add credits at https://app.eaglecross.xyz/pricing |
| 403 | plan_required | Feature needs a higher plan (advanced analysis = Pro) |
| 404 | not_found | No such job or lead in this account |
| 409 | account_not_ready | User must sign in to the web app once |
| 413 / 400 | file_too_large / invalid_csv | Fix the CSV as the message says |
| 422 | invalid_request / no_signals | See `error.details` |
| 429 | too_many_active_jobs | Wait for the running job to finish |
| 502 / 503 | job_start_failed / upstream_unavailable | Retry with backoff; nothing was charged |
Credits & limits
Identical to the web app: same pricing, same plan limits, same credit balance.
| Action | Credits |
|---|---|
| Research and score a lead, including its icebreaker | 1 (2 with advanced analysis) |
| Rewrite an icebreaker, or write one for a skip lead | 1 |
| Reading jobs, leads, account, settings | Free |
| Plan | Leads in parallel | Signals per lead | Advanced analysis |
|---|---|---|---|
| Free | 2 | 8 | — |
| Standard | 5 | 16 | — |
| Pro | 10 | 20 | Yes |
- Starting a job needs at least 1 credit per lead; that's the only cap on job size. Credits are charged as leads are processed, and failed leads are refunded.
- One job processes at a time per account, across the web app and the API (a second one gets
429 too_many_active_jobs). - Over MCP,
research_leadstakes up to 100 leads, or a pasted CSV of up to 500 rows, per call. CSV uploads to the API can be up to 5 MB. - Jobs and leads are deleted after your retention period (Settings → Advanced).
Buy credits or change plans at app.eaglecross.xyz/pricing.
Lead fields
| Field | Meaning |
|---|---|
reach_flag | reach = strong recent signal, contact now. skip = nothing strong enough yet. |
score | Confidence score 0-100, after time decay of each signal. |
reach_reason | Why the lead was flagged reach or skip. |
intent_summary | One-paragraph read of what the company is focused on. |
icebreaker_subject / icebreaker_body | Email subject and personalized opening line (reach leads). |
top_signals / signals | type, snippet, source_url, published_date, tier, score. |
Errors
Every error has the same shape:
{ "error": { "code": "insufficient_credits", "message": "This job needs at least 40 credits ..." } }| Status | code | What to do |
|---|---|---|
| 401 | unauthorized | Missing, invalid, expired, or revoked key or token. |
| 402 | insufficient_credits | Add credits at app.eaglecross.xyz/pricing. |
| 403 | plan_required | The feature needs a higher plan (advanced analysis is Pro). |
| 404 | not_found | No such job or lead in your account. |
| 409 | account_not_ready | Sign in to the web app once to finish account setup. |
| 413 / 400 | file_too_large / invalid_csv | Fix the CSV as described in the message. |
| 422 | invalid_request / no_signals | Check error.details for the offending fields. |
| 429 | too_many_active_jobs | A job is already processing; wait for it to finish. |
| 502 / 503 | job_start_failed / upstream_unavailable | Temporary; retry with backoff. Nothing was charged. |
Questions or a stuck job (a job reports "stalled": true after 10 minutes without progress)? support@eaglecross.xyz
Endpoints reference
Try them in the interactive referenceAccount
/v1/accountPlan, credit balance, parallel leads, credit costs and default preset.
curl https://api.eaglecross.xyz/v1/account -H "Authorization: Bearer $EAGLECROSS_API_KEY"{
"plan": "pro",
"credits_balance": 812,
"monthly_plan_credits": 1000,
"api_keys_enabled": true,
"parallel_leads": 10,
"advanced_analysis_available": true,
"active_preset": "b2b_saas",
"credit_costs": { "lead_analysis": 1, "advanced_analysis_extra": 1, "icebreaker_rewrite": 1 },
"pricing_url": "https://app.eaglecross.xyz/pricing"
}/v1/presetsICP presets (built-in and your custom one) with the signals each tier prioritizes.
curl https://api.eaglecross.xyz/v1/presets -H "Authorization: Bearer $EAGLECROSS_API_KEY"{
"presets": [
{ "id": "b2b_saas", "label": "B2B SaaS Founders", "tier1_signals": ["…"], "reach_threshold": 40, "active": true },
{ "id": "lead_gen_agency", "label": "Lead Gen Agency", "active": false }
]
}Jobs
/v1/jobsStart a research job from JSON leads. company and website are required per lead. Options: preset, lookback_window, advanced_analysis (Pro). Anything you leave out comes from your Settings.
curl -X POST https://api.eaglecross.xyz/v1/jobs \
-H "Authorization: Bearer $EAGLECROSS_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Fintech founders - Oct",
"preset": "b2b_saas",
"lookback_window": "balanced",
"leads": [
{"name": "Jane Doe", "title": "CEO", "company": "Acme", "website": "acme.com"},
{"name": "Sam Lee", "title": "Head of Growth", "company": "Beta", "website": "https://beta.io"}
]
}'{
"id": "6f1c2a9e-…",
"name": "Fintech founders - Oct",
"status": "processing",
"source": "api",
"total_leads": 2,
"processed_leads": 0,
"reach_count": 0,
"skip_count": 0,
"progress_percent": 0,
"stalled": false,
"created_at": "2026-10-29T10:00:00Z",
"completed_at": null,
"expires_at": "2026-11-28T10:00:00Z",
"app_url": "https://app.eaglecross.xyz/jobs/6f1c2a9e-…"
}/v1/jobs/csvStart a job from the same CSV you'd upload in the web app (name, company, website, plus optional title, linkedin_url, company_description, location, industry). Max 5 MB per file.
curl -X POST https://api.eaglecross.xyz/v1/jobs/csv \
-H "Authorization: Bearer $EAGLECROSS_API_KEY" \
-F "file=@leads.csv" -F "preset=lead_gen_agency"{
"id": "6f1c2a9e-…",
"name": "Fintech founders - Oct",
"status": "processing",
"source": "api",
"total_leads": 2,
"processed_leads": 0,
"reach_count": 0,
"skip_count": 0,
"progress_percent": 0,
"stalled": false,
"created_at": "2026-10-29T10:00:00Z",
"completed_at": null,
"expires_at": "2026-11-28T10:00:00Z",
"app_url": "https://app.eaglecross.xyz/jobs/6f1c2a9e-…"
}/v1/jobsYour jobs, newest first, including ones started in the web app. Query: status, limit (≤ 100), offset.
curl "https://api.eaglecross.xyz/v1/jobs?status=done&limit=20" -H "Authorization: Bearer $EAGLECROSS_API_KEY"{ "jobs": [ { "id": "6f1c2a9e-…", "status": "done", "…": "…" } ], "total": 14, "limit": 20, "offset": 0 }/v1/jobs/{id}Status and progress. Poll every 15-30 seconds until status is done. stalled is true after 10 minutes without progress.
curl https://api.eaglecross.xyz/v1/jobs/$JOB_ID -H "Authorization: Bearer $EAGLECROSS_API_KEY"{ "id": "6f1c2a9e-…", "status": "done", "processed_leads": 2, "reach_count": 1, "skip_count": 1, "progress_percent": 100, "…": "…" }/v1/jobs/{id}/cancelStop a processing job. Leads already finished are kept; leads not started are not charged.
curl -X POST https://api.eaglecross.xyz/v1/jobs/$JOB_ID/cancel -H "Authorization: Bearer $EAGLECROSS_API_KEY"/v1/jobs/{id}Delete a job and all of its leads.
curl -X DELETE https://api.eaglecross.xyz/v1/jobs/$JOB_ID -H "Authorization: Bearer $EAGLECROSS_API_KEY"/v1/jobs/{id}/export-linkSigned CSV download link that works for 1 hour without an API key (handy for sharing or automations).
curl -X POST https://api.eaglecross.xyz/v1/jobs/$JOB_ID/export-link -H "Authorization: Bearer $EAGLECROSS_API_KEY"{ "url": "https://api.eaglecross.xyz/v1/exports/…", "expires_at": "2026-10-29T11:00:00Z" }Leads
/v1/jobs/{id}/leadsA job's leads, highest score first. Query: reach_flag (reach or skip), limit (≤ 200), offset.
curl "https://api.eaglecross.xyz/v1/jobs/$JOB_ID/leads?reach_flag=reach" -H "Authorization: Bearer $EAGLECROSS_API_KEY"{
"leads": [
{
"id": "b7d0…",
"name": "Jane Doe",
"company": "Acme",
"reach_flag": "reach",
"score": 82,
"reach_reason": "Raised a Series A 3 weeks ago and is hiring 4 SDRs.",
"icebreaker_subject": "Acme's new SDR team",
"icebreaker_body": "Saw Acme is hiring four SDRs right after the Series A…",
"signal_types": ["funding", "hiring"],
"top_signals": [
{ "type": "funding", "snippet": "Acme raises $12M Series A…", "source_url": "https://…", "published_date": "2026-10-08", "tier": "tier1", "score": 34.5 }
]
}
],
"total": 1, "limit": 50, "offset": 0
}/v1/jobs/{id}/leads.csvCSV export with the same columns as the web app's export.
curl -o leads.csv https://api.eaglecross.xyz/v1/jobs/$JOB_ID/leads.csv -H "Authorization: Bearer $EAGLECROSS_API_KEY"/v1/leads/{id}One lead with every signal, its source and date, plus intent summary and data-quality flags.
curl https://api.eaglecross.xyz/v1/leads/$LEAD_ID -H "Authorization: Bearer $EAGLECROSS_API_KEY"/v1/leads/{id}/icebreakerRewrite a lead's subject and opener (1 credit). Works for skip leads too. Optional: template, subject_template, instructions, subject_instructions.
curl -X POST https://api.eaglecross.xyz/v1/leads/$LEAD_ID/icebreaker \
-H "Authorization: Bearer $EAGLECROSS_API_KEY" \
-H "Content-Type: application/json" \
-d '{"instructions": "Shorter, no question at the end"}'Settings
/v1/settingsDefault preset, icebreaker and subject templates, writing instructions, lookback window, advanced analysis and BuiltWith options. Shared with the web app's Settings page.
curl https://api.eaglecross.xyz/v1/settings -H "Authorization: Bearer $EAGLECROSS_API_KEY"/v1/settingsChange any of those settings; omitted fields keep their value. Changes show up in the web app too.
curl -X PATCH https://api.eaglecross.xyz/v1/settings \
-H "Authorization: Bearer $EAGLECROSS_API_KEY" \
-H "Content-Type: application/json" \
-d '{"active_preset": "ai_agency", "lookback_window": "aggressive"}'