Integrations

API reference

Prosyo REST API reference: authentication, add leads, enroll in campaigns, enrichment, bulk actions, prospects, inbox, limits and errors.

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 URLhttps://app.prosyo.com/api/v1/ext
AuthAuthorization: Bearer <token>
Get a tokenIntegrations → Chrome extension & API → Generate API token
FormatJSON in, JSON out
PlansAll 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:

JSON
{ "ok": true, "data": { … } }

Error:

JSON
{ "ok": false, "error": { "code": "validation_error", "message": "…", "fieldErrors": { "email": ["Invalid email"] }, "correlationId": "a1b2c3d4" } }

Include the correlationId when you contact support about a failed request.

StatusMeaning
200Success
401Missing or invalid token
403Your role or plan doesn't allow this
404Not found in this workspace
422Validation failed
429Rate limited. Wait a minute.

GET /session#

Check the token, and read the workspace, plan and remaining import quota.

Bash
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

FieldTypeNotes
leadsarray, 1–100Required
listNamestringAdds the leads to this list, creating it if needed
listIduuidOr add them to an existing list by ID
sourceTypestringextension (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 "".

Bash
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

JSON
{
  "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.

JSON
{ "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.

FieldTypeNotes
campaignIduuidRequired
prospectIdsuuid[], 1–100Required
Bash
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.

FieldTypeNotes
prospectIdsuuid[], 1–100Required
modeenrich_only | personalized_lineDefault enrich_only
useWorkspaceInstructionsbooleanUse your workspace AI instructions
customPromptstring, max 2,000 charactersExtra guidance for the line

POST /bulk#

Organize up to 500 prospects at once.

FieldTypeNotes
actiontag, untag, stage, add_to_list, remove_from_list, suppress, unsuppress, deleteRequired
prospectIdsuuid[], 1–500Required
tagId / tagNameFor tag / untag
listId / listNameFor add_to_list / remove_from_list
stagenew, contacted, replied, interested, meeting, customer, not_interestedFor stage

suppress marks people Do not contact. delete can't be undone.

JSON
{ "action": "stage", "prospectIds": ["…"], "stage": "interested" }

GET /prospects#

Search your prospects.

Query paramExample
qq=acme
stagestage=replied
listIdlistId=…
tagIdtagId=…
campaignIdcampaignId=…
hasEmailhasEmail=true
hasLinkedinhasLinkedin=true
enrichmentStatusenrichmentStatus=enriched
createdFrom / createdToISO dates
page / pageSizePagination
returnIdsreturnIds=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 429 responses 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.