Documentation
Needle helps agents search people and places, build lead lists, run multi-channel campaigns on LinkedIn and Instagram, keep suppressions, preview messages, and send from connected accounts.
Needle helps agents search people and places, build lead lists, run multi-channel campaigns on LinkedIn and Instagram, keep suppressions, preview messages, and send from connected accounts.
The same outbound engine is available as a REST API and as MCP tools. One API key unlocks both. Listing MCP tools does not require a key; calling tools and REST endpoints does.
No install. Get an API key, then pick a path.
undefined/mcp/v1undefined/api/v1This skill is the routing layer. After you know the path, use the API Reference or MCP catalog for schemas.
Needle users create an API key in the dashboard:
sk-ndl-….If they do not have an account yet, send them to Path D.
Sending, following, and inviting require a connected LinkedIn or Instagram account. Connecting an account is dashboard-only at /accounts. The API and MCP can list, update, and delete connected accounts; they cannot start the OAuth connect flow.
Already have NEEDLE_API_KEY? Skip credential setup. Pick a path below.
All paths use the same API key. The difference is what you do next.
| Path | Question it answers | Where the work runs |
|---|---|---|
| A | Which Needle tool should I call right now? | In the agent session, over MCP |
| B | How do I add a Needle API call to this codebase? | Inside the user's product code |
| C | What is the finished outbound workflow? | In the agent session, producing a result |
| D | How does the human get a key? | Dashboard |
| E | How do I call Needle over HTTP? | REST at /api/v1 |
Use this when you need outbound during your work: searching people, building leads, running campaigns, sending LinkedIn or Instagram messages, or checking suppressions.
Connect at undefined/mcp/v1 with Authorization: Bearer sk-ndl-…. Listing tools at https://needle.app/mcp/v1/tools does not require a key; calling them does.
{
"mcpServers": {
"needle": {
"url": "undefined/mcp/v1",
"headers": {
"Authorization": "Bearer sk-ndl-…"
}
}
}
}
Works with Claude Code, Cowork, Codex, Cursor, Hermes, or any MCP client.
Route by job:
needleGetMeneedleListConnectedAccountsneedleSearchLinkedinPeople, then needleGetLinkedinProfileneedleSearchPlaces, then needleGetPlaceneedleCreateLead / needleListLeadsneedleCheckSuppressions / needleCreateSuppressionsneedleComposePreview before any sendneedleSendLinkedinInvitation or needleSendLinkedinMessageneedleFollowInstagramUser or needleSendInstagramMessageneedleCreateCampaign, needleEnrollCampaignLeads, needleListPendingApprovals, needleApprovePendingTaskDefault flow for live outbound:
needleGetMe to confirm the user and organization.needleListConnectedAccounts before any send. If none are connected, send the human to /accounts.needleCheckSuppressions before outreach.needleComposePreview when the message is generated.needleGetCampaignStats / needleSearchEvents after a campaign is live.If the task becomes "wire Needle into product code," switch to Path B.
needleGetMe: Get the authenticated userneedleListConnectedAccounts: List connected accountsneedleGetConnectedAccount: Get a connected accountneedleUpdateConnectedAccount: Update a connected accountneedleDeleteConnectedAccount: Delete a connected accountneedleListConnectedAccountEvents: List connected account eventsneedleListLeads: List leadsneedleCreateLead: Create a leadneedleGetLead: Get a leadneedleUpdateLead: Update a leadneedleDeleteLead: Delete a leadneedleListLeadEvents: List lead eventsneedleListCampaigns: List campaignsneedleCreateCampaign: Create a campaignneedleGetCampaign: Get a campaignneedleUpdateCampaign: Update a campaignneedleArchiveCampaign: Archive a campaignneedleGetCampaignStats: Get campaign statsneedleListCampaignEvents: List campaign eventsneedleListCampaignLeads: List campaign leadsneedleEnrollCampaignLeads: Enroll leadsneedleRemoveCampaignLead: Stop a lead in a campaignneedleListPendingApprovals: List pending approvalsneedleApprovePendingTask: Approve a pending sendneedleSearchEvents: Search eventsneedleGetLinkedinProfile: Get a LinkedIn profileneedleSearchLinkedinPeople: Search LinkedIn peopleneedleSendLinkedinMessage: Send a LinkedIn messageneedleListLinkedinConversationMessages: List messages in a conversationneedleListLinkedinInvitations: List pending invitationsneedleSendLinkedinInvitation: Send a connection invitationneedleWithdrawLinkedinInvitation: Withdraw an invitationneedleListLinkedinRelations: List first-degree connectionsneedleGetInstagramProfile: Get an Instagram profileneedleSendInstagramMessage: Send an Instagram messageneedleListInstagramConversationMessages: List messages in a conversationneedleFollowInstagramUser: Follow an Instagram userneedleUnfollowInstagramUser: Unfollow an Instagram userneedleSearchPlaces: Search placesneedleGetPlace: Get a placeneedleComposePreview: Preview an AI-composed messageneedleListSuppressions: List suppressionsneedleCreateSuppressions: Create suppressionsneedleCheckSuppressions: Check people and companies against the suppression listneedleDeleteSuppression: Delete a suppressionUse this when you are building an application, agent, or workflow that calls Needle from code, meaning the integration will run inside the user's product rather than from this session's MCP client.
This is the key difference from Path A: Path A calls MCP tools during the current session. Path B writes code that keeps running after the agent stops, using NEEDLE_API_KEY from the project's .env or runtime config.
NEEDLE_API_KEY=sk-ndl-…
Base URL: undefined/api/v1
Auth header: Authorization: Bearer sk-ndl-…
Smoke-test with GET /api/v1/me before writing feature code:
curl undefined/api/v1/me \
-H "Authorization: Bearer sk-ndl-…" \
-H "Content-Type: application/json"
Route the feature the same way as Path A, then call the matching REST endpoint from Path E. Sends still need a connected account in the organization that owns the key.
If you do not have a key yet, do Path D first.
Use this when the goal is a finished outbound result (a lead list, a live campaign, a one-off send, or a suppression pass), not raw tool output and not product-code integration.
needleSearchLinkedinPeople (keywords or a LinkedIn / Sales Navigator searchUrl) or needleSearchPlaces.needleGetLinkedinProfile / needleGetPlace when you need details.needleCreateLead for each person you will contact. A lead can carry LinkedIn and/or Instagram identities.needleCheckSuppressions and drop anyone you should not contact.needleListConnectedAccounts).needleCreateCampaign with the sequence graph, schedule, limits, and the connected accounts to send from.needleEnrollCampaignLeads.needleListPendingApprovals and needleApprovePendingTask when a send is waiting.needleGetCampaignStats and needleSearchEvents to see what happened.needleComposePreview for the message.needleSendLinkedinInvitation or needleSendLinkedinMessage.needleFollowInstagramUser or needleSendInstagramMessage.needleCreateSuppressions for people or companies that should not be contacted. Campaigns honor the suppression policy you set on create/update.
If the request shifts to "wire Needle into product code," switch to Path B. If you only need a single tool call, stay on Path A.
Use this when the human still needs to sign up, sign in, or create a key.
NEEDLE_API_KEY.There is no keyless tier. Listing MCP tools at /mcp/v1/tools is public; every other call needs a key.
Use this when you do not want to connect an MCP client. This works for both live work in this session and app integrations (Path B).
Base URL: undefined/api/v1
Auth header: Authorization: Bearer sk-ndl-…
curl undefined/api/v1/me \
-H "Authorization: Bearer sk-ndl-…" \
-H "Content-Type: application/json"
Successful requests return 2xx. 401 means a missing or invalid key. 422 means an invalid payload.
GET /api/v1/me: Get the authenticated userGET /api/v1/connected-accounts: List connected accountsGET /api/v1/connected-accounts/{connectedAccountId}: Get a connected accountPATCH /api/v1/connected-accounts/{connectedAccountId}: Update a connected accountDELETE /api/v1/connected-accounts/{connectedAccountId}: Delete a connected accountGET /api/v1/connected-accounts/{connectedAccountId}/events: List connected account eventsGET /api/v1/leads: List leadsPOST /api/v1/leads: Create a leadGET /api/v1/leads/{leadId}: Get a leadPATCH /api/v1/leads/{leadId}: Update a leadDELETE /api/v1/leads/{leadId}: Delete a leadGET /api/v1/leads/{leadId}/events: List lead eventsGET /api/v1/campaigns: List campaignsPOST /api/v1/campaigns: Create a campaignGET /api/v1/campaigns/{campaignId}: Get a campaignPATCH /api/v1/campaigns/{campaignId}: Update a campaignDELETE /api/v1/campaigns/{campaignId}: Archive a campaignGET /api/v1/campaigns/{campaignId}/stats: Get campaign statsGET /api/v1/campaigns/{campaignId}/events: List campaign eventsGET /api/v1/campaigns/{campaignId}/leads: List campaign leadsPOST /api/v1/campaigns/{campaignId}/leads: Enroll leadsDELETE /api/v1/campaigns/{campaignId}/leads/{leadId}: Stop a lead in a campaignGET /api/v1/campaigns/{campaignId}/pending: List pending approvalsPATCH /api/v1/campaigns/{campaignId}/pending/{taskId}: Approve a pending sendPOST /api/v1/events/search: Search eventsGET /api/v1/linkedin/profiles/{identity}: Get a LinkedIn profilePOST /api/v1/linkedin/search: Search LinkedIn peoplePOST /api/v1/linkedin/messages: Send a LinkedIn messageGET /api/v1/linkedin/conversations/{conversationId}/messages: List messages in a conversationGET /api/v1/linkedin/invitations: List pending invitationsPOST /api/v1/linkedin/invitations: Send a connection invitationDELETE /api/v1/linkedin/invitations/{invitationId}: Withdraw an invitationGET /api/v1/linkedin/relations: List first-degree connectionsGET /api/v1/instagram/profiles/{identity}: Get an Instagram profilePOST /api/v1/instagram/messages: Send an Instagram messageGET /api/v1/instagram/conversations/{conversationId}/messages: List messages in a conversationPOST /api/v1/instagram/follows: Follow an Instagram userDELETE /api/v1/instagram/follows/{identity}: Unfollow an Instagram userPOST /api/v1/places/search: Search placesGET /api/v1/places/{placeId}: Get a placePOST /api/v1/compose: Preview an AI-composed messageGET /api/v1/suppressions: List suppressionsPOST /api/v1/suppressions: Create suppressionsPOST /api/v1/suppressions/check: Check people and companies against the suppression listDELETE /api/v1/suppressions/{suppressionId}: Delete a suppressionSearch documentation, API reference, and MCP tools
We use cookies to enhance your experience on Needle and keep your data secure. Privacy Policy