# Re:Vault API: replies, leads and campaign numbers for your dashboard

> Pull every lead reply from LinkedIn and email, the people contacted and the campaign numbers into your own dashboard, BI tool or CRM, and answer a reply from there. A key per tool from the workspace settings, on every paid plan.

Page: https://re-vault.io/api/

## 1. Get a key

### Open your workspace

Sign in at [app.re-vault.io](https://app.re-vault.io/app) and go to Settings. The card is called API access. If your team has no workspace login, write to [dmitry@re-vault.io](mailto:dmitry@re-vault.io) and the key comes to you directly.

### Create a key and copy it

Name it after the tool that will use it, for example Our dashboard. The key starts with `rvk_` and is shown once; we keep only its fingerprint. Up to five live keys per workspace.

### Revoke it the same way

Revoke in the same card. The tool that used it stops getting data at once, the other keys keep working.

## 2. Call it

Base address `https://app.re-vault.io/api/v1`. Send the key in the Authorization header. Every answer is JSON, times are UTC in ISO 8601.

**curl** https://app.re-vault.io/api/v1/replies?since=2026-09-01T00:00:00Z \ -H "Authorization: Bearer rvk_YOUR_KEY"

| Address | Parameters | What comes back |
| --- | --- | --- |

| `GET /replies` | `since` (time, default seven days ago), `limit` (1 to 200, default 100) | Each reply from a lead, LinkedIn and email together, oldest first: the text, a class, the person and the sender profile or mailbox. |
| --- | --- | --- |
| `GET /leads` | `updated_since` (time), `limit` | People we have written to, with their status and the time of the invitation, the accept and the first reply. |
| `GET /stats` | `from`, `to` (dates, default the last 30 days, one year at most) | Invited, accepted and replied by sender and by day, email replies, the live pipeline and every campaign with its totals. |

## 3. Replies

{"replies": [ {"id": "li:8260", "channel": "linkedin", "received_at": "2026-09-22T20:00:17Z", "class": "interested", "text": "Sounds interesting, send me a few examples", "lead": {"id": 15444, "name": "Jane Doe", "company": "Acme", "title": "Head of Sales", "linkedin_url": "https://www.linkedin.com/in/janedoe", "email": null}, "sender": "Alex Profile", "campaign": null, "subject": null}], "count": 1, "since": "2026-09-22T00:00:00Z", "more": false, "next_cursor": null}

**Class** is one of `interested`, `question`, `referral`, `not_interested`, `unsubscribe`, `auto_reply`, `other`, or `null` while the reply is still being read. **id** is stable: `li:` for LinkedIn, `email:` for email.

When `more` is true, ask again with the same `since` and `cursor` set to `next_cursor`, until `more` is false. To keep a dashboard current, run that every 5 to 15 minutes with `since` set to the latest `received_at` you hold minus one hour, and store replies by `id`. Email replies reach us from the mail provider a few minutes late, and the hour of overlap keeps every one of them.

## 4. Leads

{"leads": [ {"id": 15444, "name": "Jane Doe", "company": "Acme", "title": "Head of Sales", "linkedin_url": "https://www.linkedin.com/in/janedoe", "country": "UK", "status": "replied", "sender": "Alex Profile", "invited_at": "2026-09-15T09:12:00Z", "accepted_at": "2026-09-16T14:03:00Z", "first_reply_at": "2026-09-22T20:00:17Z", "updated_at": "2026-09-22T20:01:02Z"}], "count": 1, "more": false, "next_cursor": null}

**Status** is one of `contacted`, `accepted`, `replied`, `interested`, `meeting`, `paused`, `closed`, `excluded`, `in_progress`. Page with `cursor` and poll with `updated_since` the same way as replies.

## 5. Numbers

{"from": "2026-08-24", "to": "2026-09-22", "linkedin": {"invited": 412, "accepted": 118, "replied": 31, "cohort_accepted": 109, "cohort_replied": 24, "accept_rate": 26.5, "reply_rate": 5.8, "by_sender": [{"sender": "Alex Profile", "invited": 210, "accepted": 64, "replied": 17, "cohort_accepted": 58, "cohort_replied": 13}]}, "email": {"replies": 22, "auto_replies": 40, "all_time": {"sent": 5200, "replies": 61, "interested": 9, "auto_replies": 118}}, "daily": [{"day": "2026-09-22", "linkedin_invited": 14, "linkedin_accepted": 5, "linkedin_replied": 2, "email_replies": 1}], "pipeline_now": {"interested": 6, "meetings": 3}, "campaigns_all_time": [{"name": "Series A fintech, UK", "channel": "LinkedIn", "sent": 640, "accepted": 181, "replied": 44, "rate": 6.9}]}

LinkedIn counts are for the dates you ask: `accepted` and `replied` are what happened on those dates, `cohort_` fields follow the people invited on those dates to today, and the two rates are taken from the cohort. The email sending total comes from the mail provider as one running number, so it sits under `all_time`; email replies are counted for your dates.

## 6. Answer a reply

Your dashboard shows who replied; the person on your side writes the answer there and hands it to us. We send it into the same conversation, LinkedIn or email, usually within a few minutes. The key needs the reply right: ask for it when the key is issued, or write to [dmitry@re-vault.io](mailto:dmitry@re-vault.io) to add it to a key you already use.

**curl** -X POST https://app.re-vault.io/api/v1/replies/li:8260/respond \ -H "Authorization: Bearer rvk_..." -H "Content-Type: application/json" \ -d '{"text": "Thanks Jane, happy to show three examples. Does Tuesday afternoon work?"}' {"reply_id": "li:8260", "status": "queued", "text": "Thanks Jane, happy to show three examples. Does Tuesday afternoon work?", "note": "Queued. An answer in a live conversation goes out within minutes."}

### Use the id from /replies

The answer goes to that person's conversation. If they wrote twice, it answers the conversation as it stands now.

### Your words go out as written

Up to 600 characters on LinkedIn and 900 by email. If our agent had an answer ready for the same reply, yours replaces it.

### Test with `"dry_run": true`

The call is checked end to end and nothing is sent. Texts like `test`, an unfilled `{first_name}` or a pasted key are refused, so a real person never receives them.

### Safe to retry

The same text to the same person within a day comes back as `already_queued` and goes out once, even if you call twice at the same moment.

### Limits

10 answers a minute and 100 a day per key, 3 a day in one conversation. Call from your server: a request from a web page is refused, because anyone who opens the page can copy the key.

### Refusals

`409` the previous answer to this person is still on its way, the person asked not to be written to, or the conversation no longer takes an answer. `403` the key reads only. `429` a limit above.

## Limits and errors

### 120 requests a minute per key, 200 rows per page

A dashboard that asks every few minutes uses a small share of it.

### Errors are JSON with one line of text

`401` the key is missing, mistyped or revoked. `400` a parameter has the wrong shape, the text says which. `429` wait a minute. `405` use GET to read and POST only to answer a reply.

### Reply texts are personal data

They carry the words and names of the people who answered. Keep the key on your server, store the texts under your own privacy policy, and revoke a key the day a tool stops using it.

---

Re:Vault runs LinkedIn outreach end to end for B2B companies: finds the buyers, writes in the client's voice, handles replies, books meetings. $2,000/month, month to month.

- Book a 30-minute call: https://cal.com/dmitry.o/re-vault-gtm
- Email: dmitry@re-vault.io
- Index of every page for agents: https://re-vault.io/llms.txt
