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.
https://needle.app/mcp/v1https://needle.app/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 https://needle.app/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": "https://needle.app/mcp/v1",
"headers": {
"Authorization": "Bearer sk-ndl-…"
}
}
}
}
Works with Claude Code, Cowork, Codex, Cursor, Hermes, or any MCP client.
Route by job:
needleGetMeneedleListConnectedAccountsneedleSearchLinkedinPeople, then needleGetLinkedinProfileneedleSearchLinkedinCompanies, needleGetLinkedinCompany, needleListLinkedinCompanyJobs, or needleSearchLinkedinJobs (searches all of LinkedIn unless you pass companies; resolve location, industry and title ids with needleListLinkedinSearchParameters)needleSearchLinkedinPosts, needleListLinkedinPosts, needleGetLinkedinPost, needleListLinkedinPostCommentsneedleCommentOnLinkedinPost or needleReactToLinkedinPostneedleListLinkedinConversations, then needleListLinkedinConversationMessagesneedleListLinkedinReceivedInvitations, then needleRespondToLinkedinInvitationneedleSearchPlaces, then needleGetPlaceneedleCreateLead / needleCreateLeads / needleListLeadsneedleCheckSuppressions / needleCreateSuppressionsneedleComposePreview before any sendneedleSendLinkedinInvitation, needleSendLinkedinMessage, or needleSendLinkedinInMailneedleFollowInstagramUser 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 eventsneedleListConnectedAccountTasks: List connected account tasksneedleListLeads: List leadsneedleCreateLead: Create a leadneedleCreateLeads: Create leads in bulkneedleGetLead: Get a leadneedleUpdateLead: Update a leadneedleDeleteLead: Delete a leadneedleListLeadEvents: List lead eventsneedleListLeadTasks: List lead tasksneedleListCampaigns: List campaignsneedleCreateCampaign: Create a campaignneedleGetCampaign: Get a campaignneedleUpdateCampaign: Update a campaignneedleArchiveCampaign: Archive a campaignneedleGetCampaignStats: Get campaign statsneedleListCampaignEvents: List campaign eventsneedleListCampaignTasks: List campaign tasksneedleListCampaignLeads: 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 messageneedleSendLinkedinInMail: Send a Sales Navigator InMailneedleGetLinkedinInMailBalance: Get remaining InMail creditsneedleListLinkedinConversations: List conversationsneedleListLinkedinConversationMessages: List messages in a conversationneedleListLinkedinInvitations: List pending invitationsneedleSendLinkedinInvitation: Send a connection invitationneedleWithdrawLinkedinInvitation: Withdraw an invitationneedleListLinkedinReceivedInvitations: List invitations sent to youneedleRespondToLinkedinInvitation: Accept or decline a received invitationneedleListLinkedinFollowers: List followersneedleListLinkedinFollowing: List accounts this account followsneedleListLinkedinRelations: List first-degree connectionsneedleGetLinkedinCompany: Get a LinkedIn companyneedleListLinkedinCompanyJobs: List jobs posted by a companyneedleListLinkedinCompanyPosts: List posts from a company pageneedleSearchLinkedinJobs: Search LinkedIn jobsneedleSearchLinkedinCompanies: Search LinkedIn companiesneedleSearchLinkedinPosts: Search LinkedIn postsneedleListLinkedinPosts: List posts by a person or companyneedleGetLinkedinPost: Get a LinkedIn postneedleListLinkedinPostComments: List comments on a postneedleCommentOnLinkedinPost: Comment on a postneedleReactToLinkedinPost: React to a postneedleListLinkedinSearchParameters: List LinkedIn search parametersneedleGetInstagramProfile: Get an Instagram profileneedleGetInstagramAccountProfile: Get the connected account profileneedleSendInstagramMessage: Send an Instagram messageneedleReactToInstagramMessage: React to an Instagram messageneedleListInstagramConversations: List Instagram conversationsneedleListInstagramConversationMessages: List messages in a conversationneedleListInstagramConversationParticipants: List the participants of a conversationneedleListInstagramPosts: List the posts of an accountneedleGetInstagramPost: Get an Instagram postneedleCreateInstagramPost: Publish an Instagram postneedleListInstagramPostComments: List the comments on a postneedleCommentOnInstagramPost: Comment on a postneedleListInstagramPostReactions: List the likes on a postneedleLikeInstagramPost: Like a postneedleListInstagramFollowers: List followersneedleListInstagramFollowing: List followed accountsneedleFollowInstagramUser: 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: https://needle.app/api/v1
Auth header: Authorization: Bearer sk-ndl-…
Smoke-test with GET /api/v1/me before writing feature code:
curl https://needle.app/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; api: "classic" when the account has no Sales Navigator seat) or needleSearchPlaces. For companies, posts and job listings, use needleSearchLinkedinCompanies, needleSearchLinkedinPosts, needleGetLinkedinCompany / needleListLinkedinCompanyJobs.needleGetLinkedinProfile / needleGetPlace when you need details.needleCreateLeads for the whole list at once, or needleCreateLead per person. Keep the lead ids that come back: enrolling needs them. LinkedIn identity accepts john-doe, /in/john-doe, https://www.linkedin.com/in/john-doe, or a user id (ACoAAA…). Instagram accepts john-doe, @john-doe, or https://www.instagram.com/john-doe.needleCheckSuppressions and drop anyone you should not contact.needleListConnectedAccounts).needleCreateCampaign with the sequence graph, schedule, limits, and the connected accounts to send from.needleEnrollCampaignLeads with the lead ids from the list you sourced.needleListPendingApprovals and needleApprovePendingTask when a send is waiting.needleGetCampaignStats and needleSearchEvents to see what happened.needleComposePreview for the message.needleSendLinkedinInvitation, needleSendLinkedinMessage, or needleSendLinkedinInMail (check credits with needleGetLinkedinInMailBalance).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: https://needle.app/api/v1
Auth header: Authorization: Bearer sk-ndl-…
curl https://needle.app/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/connected-accounts/{connectedAccountId}/tasks: List connected account tasksGET /api/v1/leads: List leadsPOST /api/v1/leads: Create a leadPOST /api/v1/leads/bulk: Create leads in bulkGET /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/leads/{leadId}/tasks: List lead tasksGET /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}/tasks: List campaign tasksGET /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 sent 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/linkedin/companies/{identifier}: Get a LinkedIn companyGET /api/v1/linkedin/companies/{identifier}/jobs: List jobs posted by a companyPOST /api/v1/linkedin/jobs/search: Search LinkedIn jobsPOST /api/v1/linkedin/companies/search: Search LinkedIn companiesPOST /api/v1/linkedin/posts/search: Search LinkedIn postsGET /api/v1/linkedin/posts: List posts by a person or companyGET /api/v1/linkedin/posts/{postId}: Get a LinkedIn postGET /api/v1/linkedin/posts/{postId}/comments: List comments on a postPOST /api/v1/linkedin/posts/{postId}/comments: Comment on a postPOST /api/v1/linkedin/posts/{postId}/reactions: React to a postPOST /api/v1/linkedin/inmails: Send a Sales Navigator InMailGET /api/v1/linkedin/inmails/balance: Get remaining InMail creditsGET /api/v1/linkedin/conversations: List conversationsGET /api/v1/linkedin/followers: List followersGET /api/v1/linkedin/following: List followed accountsGET /api/v1/linkedin/invitations/received: List received invitationsPOST /api/v1/linkedin/invitations/received/{invitationId}: Accept or decline a received invitationGET /api/v1/linkedin/search/parameters: List LinkedIn search parametersGET /api/v1/instagram/profiles/{identity}: Get an Instagram profileGET /api/v1/instagram/me: Get the connected account profilePOST /api/v1/instagram/messages: Send an Instagram messagePOST /api/v1/instagram/messages/{messageId}/reactions: React to an Instagram messageGET /api/v1/instagram/conversations: List Instagram conversationsGET /api/v1/instagram/conversations/{conversationId}/messages: List messages in a conversationGET /api/v1/instagram/conversations/{conversationId}/participants: List the participants of a conversationGET /api/v1/instagram/posts: List the posts of an accountPOST /api/v1/instagram/posts: Publish an Instagram postGET /api/v1/instagram/posts/{postId}: Get an Instagram postGET /api/v1/instagram/posts/{postId}/comments: List the comments on a postPOST /api/v1/instagram/posts/{postId}/comments: Comment on a postGET /api/v1/instagram/posts/{postId}/reactions: List the likes on a postPOST /api/v1/instagram/posts/{postId}/reactions: Like a postGET /api/v1/instagram/followers: List followersGET /api/v1/instagram/following: List followed accountsPOST /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