Weezly Outreach
|Developer Docs

Pipeline CRM API

Manage your sales pipeline stages, contacts, and notes. Move contacts between stages and track your pipeline activity.

Stages

List Stages

GET/api/pipeline/stages

List all pipeline stages for the authenticated user, ordered by position.

Request — cURLcURL
curl --location --request GET 'http://outreach.weezly.com/api/pipeline/stages' \
  --header 'X-API-KEY: sk_live_YOUR_API_KEY'
Response — 200 OKJSON
{
  "stages": [
    { "id": "ps_001", "name": "Interested", "color": "#EF4444", "emoji": "🔥", "position": 0 },
    { "id": "ps_002", "name": "Meeting Booked", "color": "#3B82F6", "emoji": "📅", "position": 1 },
    { "id": "ps_003", "name": "Demo", "color": "#8B5CF6", "emoji": "🎯", "position": 2 },
    { "id": "ps_004", "name": "Won Deal", "color": "#22C55E", "emoji": "🏆", "position": 3 },
    { "id": "ps_005", "name": "Lost Deal", "color": "#6B7280", "emoji": "💀", "position": 4 }
  ]
}

Create Stage

POST/api/pipeline/stages

Create a new pipeline stage.

Request Body

ParameterTypeDescription
namerequiredstringStage name (unique per user)
colorstringHex color code (default: #3B82F6)
emojistringEmoji for the stage (default: 📋)
positionnumberSort position (appended to end if omitted)
Request — cURLcURL
curl --location --request POST 'http://outreach.weezly.com/api/pipeline/stages' \
  --header 'X-API-KEY: sk_live_YOUR_API_KEY' \
  --header 'Content-Type: application/json' \
  --data '{
  "name": "Negotiation",
  "color": "#F59E0B",
  "emoji": "🤝",
  "position": 3
}'
Response — 201 CreatedJSON
{
  "stage": {
    "id": "ps_006",
    "name": "Negotiation",
    "color": "#F59E0B",
    "emoji": "🤝",
    "position": 3,
    "userId": "user_123",
    "createdAt": "2026-06-07T10:00:00.000Z"
  }
}

Response Codes

201Stage created
400Name is required
409Stage with this name already exists

Update Stage

PATCH/api/pipeline/stages/:id

Update a pipeline stage's name, color, emoji, or position.

Request Body

ParameterTypeDescription
namestringStage name
colorstringHex color code
emojistringStage emoji
positionnumberSort position
Request — cURLcURL
curl --location --request PATCH 'http://outreach.weezly.com/api/pipeline/stages/:id' \
  --header 'X-API-KEY: sk_live_YOUR_API_KEY'
Response — 200 OKJSON
{
  "stage": { "id": "ps_006", "name": "Final Negotiation", "color": "#F59E0B", "emoji": "🤝", "position": 3 }
}

Delete Stage

DELETE/api/pipeline/stages/:id

Delete a pipeline stage. Contacts in this stage are removed from the pipeline (not deleted).

Request — cURLcURL
curl --location --request DELETE 'http://outreach.weezly.com/api/pipeline/stages/:id' \
  --header 'X-API-KEY: sk_live_YOUR_API_KEY'
Response — 200 OKJSON
{ "ok": true }

Response Codes

200Stage deleted
404Stage not found

Reorder Stages

PUT/api/pipeline/stages/reorder

Reorder all stages by providing an ordered array of stage IDs.

Request Body

ParameterTypeDescription
stageIdsrequiredstring[]Ordered array of stage IDs
Request — cURLcURL
curl --location --request PUT 'http://outreach.weezly.com/api/pipeline/stages/reorder' \
  --header 'X-API-KEY: sk_live_YOUR_API_KEY' \
  --header 'Content-Type: application/json' \
  --data '{
  "stageIds": [
    "ps_004",
    "ps_001",
    "ps_002",
    "ps_003",
    "ps_005"
  ]
}'
Response — 200 OKJSON
{ "ok": true }

Contacts

List Contacts

GET/api/pipeline/contacts

List all contacts in the pipeline, grouped by stage. Optionally filter by account.

Query Parameters

ParameterTypeDescription
accountIdstringFilter by LinkedIn account ID (sender)
stageIdstringFilter by stage ID
Request — cURLcURL
curl --location --request GET 'http://outreach.weezly.com/api/pipeline/contacts' \
  --header 'X-API-KEY: sk_live_YOUR_API_KEY'
Response — 200 OKJSON
{
  "contacts": [
    {
      "id": "pc_001",
      "providerContactId": "contact_abc123",
      "contactName": "Sarah Chen",
      "contactPhotoUrl": "https://media.licdn.com/...",
      "chatId": "chat_xyz789",
      "stageId": "ps_001",
      "stage": { "id": "ps_001", "name": "Interested", "emoji": "🔥" },
      "lastMessagePreview": "Thanks for connecting! I'd love to...",
      "lastMessageAt": "2026-06-05T14:30:00.000Z",
      "lastMessageIsSender": false,
      "notes": [
        { "id": "cn_001", "content": "Interested in demo next week", "createdAt": "2026-06-05T15:00:00.000Z" }
      ],
      "createdAt": "2026-06-03T08:00:00.000Z"
    }
  ]
}

Move Contact

PATCH/api/pipeline/contacts/:id

Move a contact to a different pipeline stage. Set stageId to null to remove from pipeline.

Request Body

ParameterTypeDescription
stageIdrequiredstring|nullTarget stage ID, or null to remove from pipeline
Request — cURLcURL
curl --location --request PATCH 'http://outreach.weezly.com/api/pipeline/contacts/:id' \
  --header 'X-API-KEY: sk_live_YOUR_API_KEY' \
  --header 'Content-Type: application/json' \
  --data '{
  "stageId": "ps_002"
}'
Response — 200 OKJSON
{
  "contact": {
    "id": "pc_001",
    "stageId": "ps_002",
    "stage": { "id": "ps_002", "name": "Meeting Booked", "emoji": "📅" }
  }
}

Add Contact to Pipeline

POST/api/pipeline/contacts

Add a contact to the pipeline. Uses the provider contact ID from your LinkedIn inbox.

Request Body

ParameterTypeDescription
providerContactIdrequiredstringContact identifier from the inbox
contactNamerequiredstringContact display name
contactPhotoUrlstringContact avatar URL
chatIdstringChat ID for the conversation
stageIdrequiredstringPipeline stage to place the contact in
Request — cURLcURL
curl --location --request POST 'http://outreach.weezly.com/api/pipeline/contacts' \
  --header 'X-API-KEY: sk_live_YOUR_API_KEY'
Response — 201 CreatedJSON
{
  "contact": {
    "id": "pc_new002",
    "providerContactId": "contact_def456",
    "contactName": "Marcus Johnson",
    "stageId": "ps_001",
    "createdAt": "2026-06-07T10:00:00.000Z"
  }
}

Response Codes

201Contact added to pipeline
409Contact is already in the pipeline

Remove Contact

DELETE/api/pipeline/contacts/:id

Remove a contact from the pipeline entirely.

Request — cURLcURL
curl --location --request DELETE 'http://outreach.weezly.com/api/pipeline/contacts/:id' \
  --header 'X-API-KEY: sk_live_YOUR_API_KEY'
Response — 200 OKJSON
{ "ok": true }

Contact Notes

List Notes

GET/api/pipeline/notes

List notes for a specific contact.

Query Parameters

ParameterTypeDescription
contactIdrequiredstringProvider contact ID
Request — cURLcURL
curl --location --request GET 'http://outreach.weezly.com/api/pipeline/notes' \
  --header 'X-API-KEY: sk_live_YOUR_API_KEY'
Response — 200 OKJSON
{
  "notes": [
    {
      "id": "cn_001",
      "providerContactId": "contact_abc123",
      "content": "Interested in demo next week. Decision maker for their team of 15.",
      "createdAt": "2026-06-05T15:00:00.000Z",
      "updatedAt": "2026-06-05T15:00:00.000Z"
    },
    {
      "id": "cn_002",
      "providerContactId": "contact_abc123",
      "content": "Follow up after July 1st — on vacation until then",
      "createdAt": "2026-06-06T09:00:00.000Z",
      "updatedAt": "2026-06-06T09:00:00.000Z"
    }
  ]
}

Create Note

POST/api/pipeline/notes

Add a note to a contact.

Request Body

ParameterTypeDescription
contactIdrequiredstringProvider contact ID
contentrequiredstringNote text
Request — cURLcURL
curl --location --request POST 'http://outreach.weezly.com/api/pipeline/notes' \
  --header 'X-API-KEY: sk_live_YOUR_API_KEY' \
  --header 'Content-Type: application/json' \
  --data '{
  "contactId": "contact_abc123",
  "content": "Had a great call — sending proposal tomorrow"
}'
Response — 201 CreatedJSON
{
  "note": {
    "id": "cn_003",
    "providerContactId": "contact_abc123",
    "content": "Had a great call — sending proposal tomorrow",
    "createdAt": "2026-06-07T10:00:00.000Z"
  }
}

Update Note

PATCH/api/pipeline/notes/:id

Update a note's content.

Request Body

ParameterTypeDescription
contentrequiredstringUpdated note text
Request — cURLcURL
curl --location --request PATCH 'http://outreach.weezly.com/api/pipeline/notes/:id' \
  --header 'X-API-KEY: sk_live_YOUR_API_KEY'
Response — 200 OKJSON
{
  "note": { "id": "cn_003", "content": "Updated note content", "updatedAt": "2026-06-07T10:05:00.000Z" }
}

Delete Note

DELETE/api/pipeline/notes/:id

Delete a note.

Request — cURLcURL
curl --location --request DELETE 'http://outreach.weezly.com/api/pipeline/notes/:id' \
  --header 'X-API-KEY: sk_live_YOUR_API_KEY'
Response — 200 OKJSON
{ "ok": true }