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

  1. 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.

  2. 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.

  3. 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"
AddressParametersWhat comes back
GET /repliessince (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 /leadsupdated_since (time), limitPeople we have written to, with their status and the time of the invitation, the accept and the first reply.
GET /statsfrom, 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": 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.