Skip to main content

Contacts API

The same person joins your waitlist, subscribes to your changelog, sends feedback and later pays you. Launch already stores each of those; Contacts shows them as one record, so you can ask which signups became customers and what your customers have asked for.

Get an API key → Contacts guide

What exists today

  • A contact is everyone in a project who shares an email address after normalisation: lowercase, +alias removed, and dots ignored on Gmail. So [email protected] on the waitlist matches [email protected] in Stripe.
  • Each contact shows first-touch source, waitlist status and referrals, changelog subscription, feedback count with the latest summaries, Stripe status, plan, MRR and lifetime paid.
  • Feedback and notifications sent with your own user id join the right person when your Stripe customers carry that id in metadata. You name the metadata key once when connecting Stripe.
  • It works without Stripe connected; you just see no payment data. Stripe customers who never used a Launch form still appear, with the source stripe.
  • The only fields you can write are an optional stage and a note. There are no deals, pipelines, tasks or email campaigns.
  • A contact never outlives the person's data: delete the signup, or disconnect Stripe, and the contact and its note are removed.

Endpoints

GET /v1/contacts List, with filters: paying, has_feedback, status, source, stage, q
GET /v1/contacts/{id} One person across every primitive
PATCH /v1/contacts/{id} Set stage and note

Full reference with request and response schemas: docs.nordva.dev. Every response uses the same envelope and stable error codes.

MCP tools

The same operations are available to Claude Code, Claude Desktop and Cursor through the Nordva MCP server at mcp.nordva.dev:

  • list_contacts
  • get_contact
  • update_contact

Arguments, example prompts and client setup →

Questions

Is this a CRM?
No. It has no deals, pipelines, tasks, call logs or outbound email. It is a read view over data Launch already holds, plus a stage and a note if you want them.
What if someone used two different email addresses?
They appear as two contacts. Matching is by email only; Launch does not guess that two addresses belong to one person.
How does feedback without an email get matched?
Through your own user id. If your Stripe customers have it in metadata, Launch links user id to customer to email. Feedback can also carry an optional email directly.