REST API · Remote MCP · Agent skill

    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.

    Generate API key

    Base URL

    https://api.eaglecross.xyz

    MCP server

    https://api.eaglecross.xyz/mcp

    Asynchronous 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

    1. 1Start a job
      Terminal
      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"}
          ]
        }'
    2. 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"
    3. 3Read the leads worth contacting, or export everything as CSV
      Terminal
      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).

    Keys start with 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.
    Header
    Authorization: Bearer ec_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

    MCP 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 Code (then run /mcp to sign in)
    claude mcp add --transport http eaglecross https://api.eaglecross.xyz/mcp
    Gemini CLI
    gemini mcp add --transport http eaglecross https://api.eaglecross.xyz/mcp
    mcp.json (clients without OAuth)
    {
      "mcpServers": {
        "eaglecross": {
          "url": "https://api.eaglecross.xyz/mcp",
          "headers": { "Authorization": "Bearer ec_live_…" }
        }
      }
    }
    ToolWhat it doesType
    get_accountPlan, credits left, default ICP preset.read
    list_icp_presetsICP presets and the signals each one prioritizes.read
    research_leadsResearch up to 100 leads per call, or a pasted CSV of up to 500 rows (uses credits).write
    get_jobJob progress: leads done, reach/skip counts.read
    list_jobsRecent jobs, including ones from the web app.read
    get_job_leadsScored leads with icebreakers and top signals.read
    get_leadAll signals with sources and dates for one lead.read
    rewrite_icebreakerRewrite one lead's subject + opener (1 credit).overwrite
    cancel_jobStop a running job; finished leads are kept.destructive
    get_export_link1-hour CSV download link for a job's results.write
    get_settingsDefault preset, templates, instructions, analysis options.read
    update_settingsChange 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:

    Prompt
    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.

    SKILL.md
    ---
    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.

    ActionCredits
    Research and score a lead, including its icebreaker1 (2 with advanced analysis)
    Rewrite an icebreaker, or write one for a skip lead1
    Reading jobs, leads, account, settingsFree
    PlanLeads in parallelSignals per leadAdvanced analysis
    Free28—
    Standard516—
    Pro1020Yes
    • 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_leads takes 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

    FieldMeaning
    reach_flagreach = strong recent signal, contact now. skip = nothing strong enough yet.
    scoreConfidence score 0-100, after time decay of each signal.
    reach_reasonWhy the lead was flagged reach or skip.
    intent_summaryOne-paragraph read of what the company is focused on.
    icebreaker_subject / icebreaker_bodyEmail subject and personalized opening line (reach leads).
    top_signals / signalstype, snippet, source_url, published_date, tier, score.

    Errors

    Every error has the same shape:

    Error
    { "error": { "code": "insufficient_credits", "message": "This job needs at least 40 credits ..." } }
    StatuscodeWhat to do
    401unauthorizedMissing, invalid, expired, or revoked key or token.
    402insufficient_creditsAdd credits at app.eaglecross.xyz/pricing.
    403plan_requiredThe feature needs a higher plan (advanced analysis is Pro).
    404not_foundNo such job or lead in your account.
    409account_not_readySign in to the web app once to finish account setup.
    413 / 400file_too_large / invalid_csvFix the CSV as described in the message.
    422invalid_request / no_signalsCheck error.details for the offending fields.
    429too_many_active_jobsA job is already processing; wait for it to finish.
    502 / 503job_start_failed / upstream_unavailableTemporary; retry with backoff. Nothing was charged.

    Questions or a stuck job (a job reports "stalled": true after 10 minutes without progress)? support@eaglecross.xyz

    Account

    GET/v1/account

    Plan, credit balance, parallel leads, credit costs and default preset.

    Request
    curl https://api.eaglecross.xyz/v1/account -H "Authorization: Bearer $EAGLECROSS_API_KEY"
    Response · 200 OK
    {
      "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"
    }
    GET/v1/presets

    ICP presets (built-in and your custom one) with the signals each tier prioritizes.

    Request
    curl https://api.eaglecross.xyz/v1/presets -H "Authorization: Bearer $EAGLECROSS_API_KEY"
    Response · 200 OK
    {
      "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

    POST/v1/jobs

    Start 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.

    Request
    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"}
        ]
      }'
    Response · 201 Created
    {
      "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-…"
    }
    POST/v1/jobs/csv

    Start 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.

    Request
    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"
    Response · 201 Created
    {
      "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-…"
    }
    GET/v1/jobs

    Your jobs, newest first, including ones started in the web app. Query: status, limit (≤ 100), offset.

    Request
    curl "https://api.eaglecross.xyz/v1/jobs?status=done&limit=20" -H "Authorization: Bearer $EAGLECROSS_API_KEY"
    Response · 200 OK
    { "jobs": [ { "id": "6f1c2a9e-…", "status": "done", "…": "…" } ], "total": 14, "limit": 20, "offset": 0 }
    GET/v1/jobs/{id}

    Status and progress. Poll every 15-30 seconds until status is done. stalled is true after 10 minutes without progress.

    Request
    curl https://api.eaglecross.xyz/v1/jobs/$JOB_ID -H "Authorization: Bearer $EAGLECROSS_API_KEY"
    Response · 200 OK
    { "id": "6f1c2a9e-…", "status": "done", "processed_leads": 2, "reach_count": 1, "skip_count": 1, "progress_percent": 100, "…": "…" }
    POST/v1/jobs/{id}/cancel

    Stop a processing job. Leads already finished are kept; leads not started are not charged.

    Request
    curl -X POST https://api.eaglecross.xyz/v1/jobs/$JOB_ID/cancel -H "Authorization: Bearer $EAGLECROSS_API_KEY"
    DELETE/v1/jobs/{id}

    Delete a job and all of its leads.

    Request
    curl -X DELETE https://api.eaglecross.xyz/v1/jobs/$JOB_ID -H "Authorization: Bearer $EAGLECROSS_API_KEY"

    Leads

    GET/v1/jobs/{id}/leads

    A job's leads, highest score first. Query: reach_flag (reach or skip), limit (≤ 200), offset.

    Request
    curl "https://api.eaglecross.xyz/v1/jobs/$JOB_ID/leads?reach_flag=reach" -H "Authorization: Bearer $EAGLECROSS_API_KEY"
    Response · 200 OK
    {
      "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
    }
    GET/v1/jobs/{id}/leads.csv

    CSV export with the same columns as the web app's export.

    Request
    curl -o leads.csv https://api.eaglecross.xyz/v1/jobs/$JOB_ID/leads.csv -H "Authorization: Bearer $EAGLECROSS_API_KEY"
    GET/v1/leads/{id}

    One lead with every signal, its source and date, plus intent summary and data-quality flags.

    Request
    curl https://api.eaglecross.xyz/v1/leads/$LEAD_ID -H "Authorization: Bearer $EAGLECROSS_API_KEY"
    POST/v1/leads/{id}/icebreaker

    Rewrite a lead's subject and opener (1 credit). Works for skip leads too. Optional: template, subject_template, instructions, subject_instructions.

    Request
    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

    GET/v1/settings

    Default preset, icebreaker and subject templates, writing instructions, lookback window, advanced analysis and BuiltWith options. Shared with the web app's Settings page.

    Request
    curl https://api.eaglecross.xyz/v1/settings -H "Authorization: Bearer $EAGLECROSS_API_KEY"
    PATCH/v1/settings

    Change any of those settings; omitted fields keep their value. Changes show up in the web app too.

    Request
    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"}'