Connect an AI Agent to Your Syndicate
This guide connects an AI agent (Claude, ChatGPT, Cursor, or a tool you write) to a syndicate you manage on Wefunder. By the end you will have listed your syndicates, invited a member, and proposed removing one, with the removal waiting on your approval rather than executing on its own.
Prerequisites
- A Wefunder account that manages at least one syndicate.
- An OAuth application in the developer portal. Syndicate managers can enter the portal without a separate approval step.
Two ways in
Use Wefunder's hosted MCP server. Wefunder runs an MCP server at https://wefunder.com/mcp/server that exposes syndicate, company, and deal tools and handles OAuth for you. Point Claude Desktop, ChatGPT, Cursor, or any MCP client at that URL and complete the consent screen. The connection guide lives at wefunder.com/mcp/README.md. Access is enabled per account while the server is in beta; if your client is told MCP is not enabled for your account, ask us.
Call the API from your own code. The rest of this page takes this route. It is what you want when the agent is part of your own product, and every call below is the same one the hosted server makes on your behalf.
Step 1: Register an OAuth application
In the portal you get a client_id and a client_secret. Keep the secret server-side.
Agents act as a specific person, so use the Authorization Code + PKCE flow. Request:
read:syndicatesto view syndicates, members, deals, statistics, and portfolio.write:syndicatesto invite and manage members, update settings, and propose deal actions.
Both scopes are selectable in the portal without approval.
Step 2: Get an access token
Send the user to https://wefunder.com/oauth/authorize with your client_id, redirect_uri, scope, and PKCE parameters; exchange the returned code at https://api.wefunder.com/oauth/token. Access tokens last two hours and come with a refresh token. See Authentication for the full flow.
To limit a token to one syndicate, add resource_type=syndicate, resource_id=syn_..., and resource_scope=required to the authorize request. The token then sees that syndicate and nothing else, even if the user manages several. See Resource Binding.
Step 3: Try the API
List your syndicates
curl "https://api.wefunder.com/syndicates" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN"
{
"data": [
{
"id": "syn_aB3xQ9k2vF8mNp1zT5wY7Qc4",
"type": "syndicate",
"attributes": {
"name": "Acme Syndicate",
"slug": "acme-syndicate",
"tagline": "Early-stage software",
"published": true,
"launched": true,
"membership_open": true,
"member_count": 47,
"deal_count": 6,
"created_at": "2025-06-01T10:00:00Z",
"updated_at": "2026-03-01T14:00:00Z"
}
}
],
"meta": { "has_more": false, "page_count": 1 }
}
List members
curl "https://api.wefunder.com/syndicates/syn_aB3xQ9k2vF8mNp1zT5wY7Qc4/members" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN"
Invite a member
curl -X POST "https://api.wefunder.com/syndicates/syn_aB3xQ9k2vF8mNp1zT5wY7Qc4/members/invite" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{ "email": "[email protected]", "name": "Jane Smith" }'
The invitee receives an email with an accept link. Their role starts as invitee and becomes member when they accept. To invite a co-manager instead, add "syndicate_permission": "full_access"; only the syndicate's creator may do that, and anyone else gets 403 with type: "forbidden". Passing "operator" does not invite a co-manager: it invites a regular member. Inviting an existing member or an already-invited email returns 409. The Members page has the full mapping.
Propose removing a member
Removing a member is irreversible, so the API does not do it on your say-so. POST /intents records an intent and returns a review link:
curl -X POST "https://api.wefunder.com/intents" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"action_name": "syndicates.remove_member",
"resource_type": "Club",
"resource_id": "syn_aB3xQ9k2vF8mNp1zT5wY7Qc4",
"params": { "member_id": "mem_7Hk2mP9qR4sT1uV6wX8yZ3aB" },
"requested_by_agent": "My CLI Tool"
}'
{
"data": {
"id": "int_aB3xQ9k2vF8mNp1zT5wY7Qc4",
"type": "intent",
"attributes": {
"action": "syndicates.remove_member",
"status": "pending",
"review_url": "https://wefunder.com/intents/a1b2c3d4-e5f6-7890-abcd-ef1234567890/review",
"...": "..."
}
}
}
Open review_url in a browser, read the impact summary, and approve or reject. The other actions that need approval are listed on Intents.
Removing a member is only possible this way: DELETE /syndicates/{id}/members/{member_id} answers 422 with type: "use_intents".
Check an intent
curl "https://api.wefunder.com/intents/int_aB3xQ9k2vF8mNp1zT5wY7Qc4" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN"
status moves from pending to approved, executing, and executed, or to rejected, expired, or failed.
See what your tools did
Every call your app makes on the user's behalf is recorded, and the user sees it in Settings → Activity on wefunder.com. See Activity.
How intents work in practice
- The agent calls an intent-minting endpoint (
POST /intents). - The API returns a pending intent with
review_urlandimpact_summary. - The agent shows the summary and the link to the human.
- The human reviews on Wefunder and approves or rejects. Pending intents expire after 24 hours.
- The agent polls
GET /intents/{id}to learn the outcome.
The agent never executes the dangerous action itself. See Intents for the full action list and guarantees.
Next steps
- Syndicate API for every endpoint and field.
- Intents for the full list of actions that wait on a human.
- Resource Binding to confine a token to one syndicate.