- Prosyo Docs
- Integrations
- API reference
On this page
The Prosyo API lets your own tools add leads, enroll prospects in campaigns, enrich, organize and read your inbox. The Chrome extension uses the same API.
Basics#
| Base URL | https://app.prosyo.com/api/v1/ext |
| Auth | Authorization: Bearer <token> |
| Get a token | Integrations → Chrome extension & API → Generate API token |
| Format | JSON in, JSON out |
| Plans | All plans. Your plan's limits apply. |
Tokens act as the user who created them, with that user's role and workspace. Rotate token replaces every token in the workspace. Revoke all tokens disconnects every install.
Response envelope#
Success:
{ "ok": true, "data": { … } }Error:
{ "ok": false, "error": { "code": "validation_error", "message": "…", "fieldErrors": { "email": ["Invalid email"] }, "correlationId": "a1b2c3d4" } }Include the correlationId when you contact support about a failed request.
| Status | Meaning |
|---|---|
200 | Success |
401 | Missing or invalid token |
403 | Your role or plan doesn't allow this |
404 | Not found in this workspace |
422 | Validation failed |
429 | Rate limited. Wait a minute. |
GET /session#
Check the token, and read the workspace, plan and remaining import quota.
curl https://app.prosyo.com/api/v1/ext/session \
-H "Authorization: Bearer $PROSYO_TOKEN"POST /leads#
Add or update prospects, optionally on a list. Role: Member or higher. Limit: 60 requests per minute.
Body
| Field | Type | Notes |
|---|---|---|
leads | array, 1–100 | Required |
listName | string | Adds the leads to this list, creating it if needed |
listId | uuid | Or add them to an existing list by ID |
sourceType | string | extension (default), extension_profile, extension_search, extension_comments |
Lead fields: fullName, firstName, lastName, title, companyName, linkedinUrl, website, email, phone, locationName. Each lead needs a name, LinkedIn URL or email. Leave empty fields out rather than sending "".
curl -X POST https://app.prosyo.com/api/v1/ext/leads \
-H "Authorization: Bearer $PROSYO_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"listName": "API test",
"leads": [
{ "firstName": "Alex", "lastName": "Rivera", "title": "Head of Sales",
"companyName": "Acme", "email": "alex@acme.com",
"linkedinUrl": "https://www.linkedin.com/in/alexrivera" }
]
}'Response data
{
"received": 1,
"processed": 1,
"inserted": 1,
"skipped": 0,
"failed": 0,
"quotaBlocked": 0,
"listId": "…",
"prospectIds": ["…"],
"quota": { "monthlyImports": 5000, "remaining": 4999 }
}prospectIds includes both new and already-existing people, so you can pass it straight to /campaigns or /enrich.
GET /campaigns#
List up to 50 draft, running and paused campaigns. Role: Viewer or higher.
{ "campaigns": [ { "id": "…", "name": "UK founders", "status": "running", "enrolled": 142 } ] }POST /campaigns#
Enroll prospects in a campaign. Role: Member or higher. Limit: 30 requests per minute.
| Field | Type | Notes |
|---|---|---|
campaignId | uuid | Required |
prospectIds | uuid[], 1–100 | Required |
curl -X POST https://app.prosyo.com/api/v1/ext/campaigns \
-H "Authorization: Bearer $PROSYO_TOKEN" \
-H "Content-Type: application/json" \
-d '{ "campaignId": "CAMPAIGN_ID", "prospectIds": ["PROSPECT_ID"] }'Response data: { "enrolled": 1, "skipped": 0, "campaignName": "UK founders" }
People already enrolled, marked Do not contact, or unsuitable for the sequence are skipped, not double-enrolled.
POST /enrich#
Queue AI research or a first-touch line. Uses 1 credit per prospect, and failures are refunded.
| Field | Type | Notes |
|---|---|---|
prospectIds | uuid[], 1–100 | Required |
mode | enrich_only | personalized_line | Default enrich_only |
useWorkspaceInstructions | boolean | Use your workspace AI instructions |
customPrompt | string, max 2,000 characters | Extra guidance for the line |
POST /bulk#
Organize up to 500 prospects at once.
| Field | Type | Notes |
|---|---|---|
action | tag, untag, stage, add_to_list, remove_from_list, suppress, unsuppress, delete | Required |
prospectIds | uuid[], 1–500 | Required |
tagId / tagName | For tag / untag | |
listId / listName | For add_to_list / remove_from_list | |
stage | new, contacted, replied, interested, meeting, customer, not_interested | For stage |
suppress marks people Do not contact. delete can't be undone.
{ "action": "stage", "prospectIds": ["…"], "stage": "interested" }GET /prospects#
Search your prospects.
| Query param | Example |
|---|---|
q | q=acme |
stage | stage=replied |
listId | listId=… |
tagId | tagId=… |
campaignId | campaignId=… |
hasEmail | hasEmail=true |
hasLinkedin | hasLinkedin=true |
enrichmentStatus | enrichmentStatus=enriched |
createdFrom / createdTo | ISO dates |
page / pageSize | Pagination |
returnIds | returnIds=true returns only IDs |
GET /boards#
Returns your lists, tags and pipeline stages, with the IDs you need for /bulk and /leads.
GET /inbox#
Returns the latest conversations visible to the token's user.
Outgoing events#
To receive events from Prosyo (replies, stage changes and so on), use signed webhooks.
Good practice#
- Keep tokens in a secrets manager or your automation tool's credentials.
- Batch requests (up to 100 leads) instead of one request per person.
- Retry
429responses after a short wait. - Use a dedicated Prosyo user for integrations so a teammate leaving doesn't break them.
See Custom triggers for end-to-end recipes.
