Developers

The Jeanus public API.

REST. JSON. Per-tenant API keys. Rate-limited at 60 requests / minute. Audit-logged. Free on every Jeanus plan, including Groundwork. Use it for Zapier, your own scripts, or wiring your data warehouse.

Get an API keyJump to endpoints

Quick start

Get an API key in Settings → API keys. Pass it in the Authorization header on every request.

bash
curl https://jeanus.app/api/v1/customers \ -H "Authorization: Bearer jns_live_..."

Security model

Six layers of protection on every request:

  • Per-tenant keys. Each workspace mints its own keys. Keys from tenant A can never see tenant B's data.
  • Hashed at rest. We store the SHA-256 hash, never the plaintext. If our database were ever exposed, your keys still aren't.
  • Scoped. Read keys can list. Write keys can additionally create. Always start read-only.
  • Rate-limited. 60 requests per minute per key. Headers tell you where you stand: X-RateLimit-Remaining, X-RateLimit-Reset.
  • Audit-logged. Every request, success or fail, lands in your audit log. View it in Settings.
  • Revocable. One click to revoke a leaked key. Soft delete - audit log stays intact.

If a key is ever exposed (committed to git, pasted in Slack), revoke it immediately and mint a new one.

Endpoints

v1 ships the four most-used reads and the most-used write. More land in the next ship - if there's one you'd use today, let us know.

GET/api/v1/customersread scope
List customers in this tenant. Paginate with limit + offset; search with q.
  • ?limit=50 (default 50, max 200)
  • ?offset=0
  • ?q=acme (prefix match on name or email)
GET/api/v1/productsread scope
List products. Same pagination + search options as customers.
  • ?limit=
  • ?offset=
  • ?q=
GET/api/v1/leadsread scope
List leads in the pipeline. Filter by stage.
  • ?stage=qualified|new|contacted|meeting_booked|proposal|won|lost
  • ?q=
GET/api/v1/ordersread scope
List orders. Filter by status, customer, or date.
  • ?status=open|delivered|cancelled
  • ?customer_id=UUID
  • ?since=YYYY-MM-DD
POST/api/v1/leadswrite scope
Create a lead. Returns 201 with the new lead. Required field: name. Defaults stage to 'new', source to 'api'. Set assigned_to (a rep code) to pin the lead to a rep, otherwise auto-routing decides.
  • Body: { name (required), company, email, phone, stage, estimated_value, probability, source, notes, assigned_to }
GET/api/v1/leads/:idread scope
Fetch a single lead by id.
PATCH/api/v1/leads/:idwrite scope
Update a lead. Only the fields you send are changed. Moving stage to won or lost fires the matching lead.won / lead.lost webhook.
  • Body: any of { stage, notes, assigned_to, email, phone, company, estimated_value }
POST/api/v1/customerswrite scope
Create a customer. Returns 201. Required field: name. Fires the customer.created webhook.
  • Body: { name (required), email, phone, contact_name, account_type, country, city, postcode, reference }
GET/api/v1/meread scope
Connection test. Returns the account name + your key's scopes. Zapier / Make call this to verify a key on connect.

Triggers (webhooks)

Rather than polling, subscribe to an event and Jeanus POSTs to your URL the moment it happens. This is what powers instant Zapier / Make triggers. Each delivery is signed with X-Jeanus-Signature (HMAC-SHA256 of the body). Events: lead.created, lead.won, lead.lost, quote.sent, quote.accepted, quote.rejected, order.placed, customer.created.

POST/api/v1/hooksread scope
Subscribe to an event. Returns { id } - store it to unsubscribe later.
  • Body: { event (required), target_url (required), label }
GET/api/v1/hooksread scope
List this key's subscriptions.
DELETE/api/v1/hooks/:idread scope
Unsubscribe. Idempotent - deleting a gone subscription still returns ok.

Example: create a lead from Zapier

The most common use case is forwarding form fills, calendar bookings, or chat conversations from another tool into Jeanus as a lead.

bash
curl -X POST https://jeanus.app/api/v1/leads \ -H "Authorization: Bearer jns_live_..." \ -H "Content-Type: application/json" \ -d '{ "name": "Sarah Patel", "company": "Patel Holdings", "email": "sarah@patelholdings.com", "stage": "new", "source": "calendly", "estimated_value": 12000 }'

Example: get an instant trigger on won leads

Subscribe your Zapier / Make catch URL to lead.won and Jeanus posts the lead to it the moment a deal closes.

bash
curl -X POST https://jeanus.app/api/v1/hooks \ -H "Authorization: Bearer jns_live_..." \ -H "Content-Type: application/json" \ -d '{ "event": "lead.won", "target_url": "https://hooks.zapier.com/hooks/catch/123/abc/" }'

Example: pull this week's new customers

javascript
const r = await fetch( 'https://jeanus.app/api/v1/customers?limit=200', { headers: { Authorization: `Bearer ${process.env.JEANUS_API_KEY}` } } ) const { data, pagination } = await r.json() console.log(`Got ${data.length} of ${pagination.total} customers`)

Errors

Every error response has the same shape:

json
{ "error": { "code": "missing_scope", "message": "This key does not have \"write\" scope" }, "request_id": "8f2a..." }

Common codes: missing_auth, invalid_format, invalid_key, revoked, missing_scope, rate_limited, invalid_param, missing_field, db_error, internal_error.

What's coming next

Create-customer, update-lead and instant triggers are live now. Next ship adds more reads (deals, contacts, activities, quotes) and more writes (log activities, create orders). The public Zapier and Make apps are built on the endpoints above.

Get your first API keyTell us what to ship next