Re:Vault API · for your own dashboard
Your replies, leads and campaign numbers in your own dashboard
Every Re:Vault client can pull their data into their own dashboard, BI tool or CRM: each reply a lead sends on LinkedIn or by email, the people we have written to, and the numbers by campaign, sender and day. A key reads; a key given the reply right also answers a reply from your own screen, and we send it. One key per tool, on every paid plan.
1. Get a key
Open your workspace
Sign in at app.re-vault.io and go to Settings. The card is called API access. If your team has no workspace login, write to 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 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": trueThe 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_queuedand 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
409the 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.403the key reads only.429a 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
401the key is missing, mistyped or revoked.400a parameter has the wrong shape, the text says which.429wait a minute.405use 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.