# Pipevoy: Where agents book meetings

> LinkedIn outreach infrastructure for AI agents to find, invite, message and book prospects, inside safe sending limits.

Source: https://pipevoy.com/ (Markdown: https://pipevoy.com/index.md)

## Give this to your agent

agent-brief.txt

```text
You can run LinkedIn outreach through Pipevoy, a headless AI SDR. It drafts LinkedIn invites, follow-ups and replies for a workspace and sends them through its own engine, which enforces warm-up, per-sender daily and weekly limits, working hours and approvals. Never send on LinkedIn yourself.

REST API  https://pipevoy.com/api/v1
MCP       https://pipevoy.com/api/mcp
Docs      https://pipevoy.com/docs/api
OpenAPI   https://pipevoy.com/api/v1/openapi.json
llms.txt  https://pipevoy.com/llms.txt
Auth      Authorization: Bearer <api key> (same key for REST and MCP)

No key yet: POST /api/v1/signup with {"email", "company_name"}, no auth. Then poll GET /api/v1/signup/{id} with header X-Claim-Token until api_key appears. It is returned once; store it.

Start each session with GET /api/v1/me. Its setup.next_step says what to do next. Approving a draft only queues it; the engine decides when it is safe to send. Every error has error.hint with the next step.

Ask your human for exactly three things:
1. Open the confirmation email Pipevoy sends after signup.
2. Open each sender's connect_url and log in to LinkedIn once.
3. Pay the Stripe Checkout link before the 14-day trial ends.
```

## Facts

| What | Value |
| --- | --- |
| REST base URL | `https://pipevoy.com/api/v1` |
| MCP server | `https://pipevoy.com/api/mcp` (Streamable HTTP, JSON responses) |
| Auth header | `Authorization: Bearer pv_…` (same key for REST and MCP) |
| Signup | `POST /api/v1/signup` (no key) → a person confirms the email → `GET /api/v1/signup/{id}` with `X-Claim-Token` returns `api_key` once |
| API index | [https://pipevoy.com/api/v1](https://pipevoy.com/api/v1) |
| OpenAPI 3.1 | [https://pipevoy.com/api/v1/openapi.json](https://pipevoy.com/api/v1/openapi.json) |
| MCP server card | [https://pipevoy.com/api/mcp/server-card](https://pipevoy.com/api/mcp/server-card) |
| llms.txt | [https://pipevoy.com/llms.txt](https://pipevoy.com/llms.txt) |
| Docs | [https://pipevoy.com/docs/api](https://pipevoy.com/docs/api) (Markdown: [/docs/api.md](https://pipevoy.com/docs/api.md)) |
| Trial | 14 days, no card, API and MCP included |
| Human steps | Confirm the signup email; log in to LinkedIn once per sender; pay |
| Product | Pipevoy, a headless AI SDR for LinkedIn |

## Example call

Enroll a prospect: `POST /api/v1/campaigns/{id}/enroll`

```bash
curl -X POST https://pipevoy.com/api/v1/campaigns/$CAMPAIGN_ID/enroll \
  -H "Authorization: Bearer $PIPEVOY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"linkedin_urls":["https://www.linkedin.com/in/jane-doe"]}'
```

Response `200 OK`

```json
{
  "enrolled": 1,
  "skipped": 0,
  "created_prospects": 1,
  "invalid_linkedin_urls": []
}
```

What the engine does next:

| Code | Meaning |
| --- | --- |
| `pending_approval` | The invite is drafted on the next engine tick and waits, because require_approval is true. |
| `approve_draft` | Your agent (or a person) approves it. That queues it; nothing is sent yet. |
| `warmup_limit` | Warm-up limit reached (week 1) · resumes Mon 09:00 America/New_York |
| `effective_limits` | Warm-up week 1: 5 invites a day and 25 a week, 25% of the configured 20 and 100. |

The third line is the engine's own explanation text, as shown in the app and computed here by the same code. Enrolling returns the counts above; read limits back with GET /api/v1/senders/{id}.

## Endpoints an agent uses most

| Method | Path | What it does | MCP tool |
| --- | --- | --- | --- |
| POST | `/api/v1/signup` | Create a workspace without the UI. A person confirms the emailed link; no key needed. | `signup` |
| POST | `/api/v1/company/analyze` | Read your website and write the company profile every draft is based on. | `analyze_company` |
| POST | `/api/v1/senders` | Add a LinkedIn account. Returns connect_url for its owner's one-time login. | `create_sender` |
| POST | `/api/v1/campaigns` | Create and start a campaign from AI-drafted or your own steps. | `create_campaign` |
| POST | `/api/v1/campaigns/{id}/enroll` | Enroll prospects by id or LinkedIn URL. Unknown URLs are added first. | `enroll_prospects` |
| GET | `/api/v1/approvals` | List drafts waiting for approval, with the prospect and thread. | `list_pending_approvals` |
| POST | `/api/v1/approvals/{id}/approve` | Approve a draft, optionally edited. It joins the send queue. | `approve_draft` |
| GET | `/api/v1/conversations` | Replies, already classified by intent, newest first. | `list_conversations` |
| POST | `/api/v1/conversations/{id}/reply` | Write a reply. It becomes a draft; approve it to send. | `draft_reply` |
| PATCH | `/api/v1/meetings/{id}` | Record held, no-show or qualified. A no-show drafts a rebook note. | `update_meeting` |
| POST | `/api/v1/signals` | Push buying signals from Clay, your CRM or your own research. | `push_signal` |
| POST | `/api/v1/webhooks` | Subscribe to signed events instead of polling. | `create_webhook` |
| POST | `/api/v1/billing/checkout` | Get a Stripe Checkout link for a person to pay. | `create_checkout_link` |

All 36 endpoints: [API reference](https://pipevoy.com/docs/api), [Markdown](https://pipevoy.com/docs/api.md), [OpenAPI 3.1](https://pipevoy.com/api/v1/openapi.json).

## Safety rules the engine enforces

- **Warm-up ramp.** Limits ramp 25%, 50%, 75%, 100% over weeks 1 to 4, from the account's first send. Without Pipevoy: a new account sends at full volume on day one.
- **Daily and weekly limits.** Per sender, in the sender's own day: 20 invites and 40 messages by default. Invites are also capped at 100 over a rolling 7 days. Plan ceilings: 100 invites a week, 50 to 100 messages a day; higher values are refused. Without Pipevoy: whatever your loop sends.
- **Working hours.** Only inside each sender's hours and days (default 09:00 to 18:00, Monday to Friday, in their timezone), 2 to 6 minutes apart and paced across the day, up to 30 minutes between sends. Without Pipevoy: sends at 3am if that is when the job runs.
- **Approval required.** `require_approval` defaults to true. Drafts wait as `pending_approval` until a person or your agent approves them. Without Pipevoy: the first draft goes straight out.
- **Outcome unknown, never resent.** A message or reply that hits a timeout or 5xx is marked failed with “Outcome unknown”, still counts toward the limits, and pauses that sequence until a person checks LinkedIn. Invites can retry, because LinkedIn rejects a duplicate invitation. Without Pipevoy: a timeout looks like a failure, so it retries and the prospect gets the message twice.
- **Restrictions.** A restricted sender pauses itself and fires the `sender.restricted` webhook. No retry loop. Without Pipevoy: keeps going after LinkedIn pushes back.
- **Kill switch.** `PATCH /api/v1/senders/{id}` with `paused: true` stops one account. `SENDING_DISABLED=true` stops every send on the deployment; drafts still queue. Unpaid trials pause sending too, without deleting data. Without Pipevoy: stop the process and hope nothing is in flight.

Honest caveat: LinkedIn’s User Agreement restricts automated activity, and any tool that acts on an account carries some risk of restriction. These rules reduce that risk; they cannot remove it.

## Quickstart

### 1. Sign up

No key needed. A person confirms the emailed link; then the key is returned once to whoever holds the claim token.

```bash
curl -X POST https://pipevoy.com/api/v1/signup -H "Content-Type: application/json" \
  -d '{"email":"founder@acme.com","company_name":"Acme"}'
# { "id": "…", "claim_token": "pvc_…", "status": "pending" }

curl https://pipevoy.com/api/v1/signup/$SIGNUP_ID -H "X-Claim-Token: $CLAIM_TOKEN"
# { "status": "verified", "api_key": "pv_…" }
```

### 2. Analyse your company

The AI reads your website and writes value propositions, ideal customer and personas. Adjust them with `PUT /api/v1/company`.

```bash
curl -X POST https://pipevoy.com/api/v1/company/analyze -H "Authorization: Bearer $PIPEVOY_API_KEY" -H "Content-Type: application/json" \
  -d '{"website":"https://acme.com"}'
```

### 3. Create a sender

One LinkedIn account. Its owner opens `connect_url` once and logs in; nobody sees the password. Poll until it is connected.

```bash
curl -X POST https://pipevoy.com/api/v1/senders -H "Authorization: Bearer $PIPEVOY_API_KEY" -H "Content-Type: application/json" \
  -d '{"name":"Sara Khan","timezone":"America/New_York","booking_url":"https://cal.com/sara/intro"}'
# { "sender": { "status": "pending", … }, "connect_url": "https://account.unipile.com/…" }
```

### 4. Create a campaign

Draft the sequence with AI, edit it if you like, then create it. It starts as soon as a sender is connected.

```bash
curl -X POST https://pipevoy.com/api/v1/campaigns/draft -H "Authorization: Bearer $PIPEVOY_API_KEY" -H "Content-Type: application/json" \
  -d '{"objective":"Book intro calls with RevOps leaders","cta":"a 20-minute call"}'

curl -X POST https://pipevoy.com/api/v1/campaigns -H "Authorization: Bearer $PIPEVOY_API_KEY" -H "Content-Type: application/json" \
  -d '{"name":"RevOps East Coast","steps":[…],"sender_ids":["'$SENDER_ID'"],"require_approval":true}'
```

### 5. Approve drafts, or subscribe to webhooks

Poll the queue, or get `draft.created`, `reply.received` and `meeting.booked` pushed to you, signed with HMAC-SHA256.

```bash
curl https://pipevoy.com/api/v1/approvals -H "Authorization: Bearer $PIPEVOY_API_KEY"
curl -X POST https://pipevoy.com/api/v1/approvals/$DRAFT_ID/approve -H "Authorization: Bearer $PIPEVOY_API_KEY"

curl -X POST https://pipevoy.com/api/v1/webhooks -H "Authorization: Bearer $PIPEVOY_API_KEY" -H "Content-Type: application/json" \
  -d '{"url":"https://agent.example.com/hooks","events":["draft.created","reply.received"]}'
```

## What a human still does

1. **Confirm the signup email.** The workspace and its API key exist only after a person clicks the link. Link comes from `POST /api/v1/signup`.
2. **Log in to LinkedIn once per sender.** A hosted sign-in. Neither we nor your agent see the password. Link comes from `connect_url` from `POST /api/v1/senders`.
3. **Pay.** By card on Stripe Checkout, before the 14-day trial ends. Unpaid, sending pauses; nothing is deleted. Link comes from `url` from `POST /api/v1/billing/checkout`.

## Composes with

1. Clay or your CRM: A stage changes or a column fills
2. `POST /api/v1/signals`: or enroll people directly by LinkedIn URL
3. Pipevoy engine: Drafts, waits for approval, sends inside the limits
4. Webhook `reply.received`: Signed with HMAC-SHA256
5. Your agent or HubSpot: Answers, books, updates the record

## Pricing

Plans start at $149 a month for one sender. API and MCP access starts on Growth at $449 a month with 3 senders, and every trial includes it. [Compare plans](https://pipevoy.com/pricing).

## FAQ

### Does anything send without an approval?

Not by default. `require_approval` is on for every new campaign. You can turn it off per campaign once you trust it; the limits, warm-up and working hours still apply.

### Is there a UI as well?

Yes. The same workspace runs in a full web app: an approval queue, an inbox with classified replies, signals, campaigns, analytics and settings. API calls and the app see the same data. [See how it works](https://pipevoy.com/how-it-works).

### What writes the drafts, and is my data used for training?

Drafting and classification use Anthropic’s Claude models through the commercial API, whose terms exclude inputs and outputs from training. Prospect data is sent only as needed for a specific draft. See the [privacy notice](https://pipevoy.com/privacy).
