Lead Retrieval SDK

Capture a scanned attendee as a lead and read back their shared contact fields.

An exhibiting company that has purchased the SDK lead-retrieval product can call this endpoint with a scanned badge id. Each call captures the lead — it creates a lead the first time this company scans the attendee, and appends a new capture timestamp on every subsequent scan (capture is deduplicated per company + attendee). The response returns the lead's visible participant fields so your scanning app or kiosk can display and store them.

Authentication is the activation code. This endpoint does not use an API key or bearer token. You authenticate with the exhibiting company's activationCode — the same shared secret used to activate booth devices. Jade resolves the company from the activation code and verifies it belongs to the clientCode and eventCode you supply.

Endpoint

GET /api/public/lead-sdk?tenantCode=&clientCode=&eventCode=&activationCode=&badgeId=

Query parameters

All five parameters are required.

ParameterDescription
tenantCodeYour Jade tenant code.
clientCodeYour Jade client code.
eventCodeThe event code.
activationCode The exhibiting company's activation code. Authenticates the call and must belong to the given client and event.
badgeId The scanned badge id (the raw QR / barcode payload). Identifies which attendee to capture. Pass the value exactly as scanned — Jade parses it (see Delimited badge payloads). Pass 0 to receive a sample lead.

Delimited badge payloads

The scanned value passed as badgeId is often a delimited payload that packs several fields into one QR / barcode. Jade extracts only our badge id segment from it to resolve the lead — the other segments are ignored. Your scanning app should always pass the raw scanned value; do not split it yourself.

  • Jade-generated badges. Our badge id is the first segment. The delimiter is configured in the Badge Designer.
  • External badge providers. The organizer configures the delimiter and which 0-based segment holds our badge id, so the payload can carry the provider's own fields alongside it.

Either way the call is identical — pass the whole scanned string and Jade parses out the right segment before looking up the attendee.

Field visibility

Which participant fields come back is decided by two layers:

  1. Organizer baseline. The organizer sets a per-event list of fields exhibitors may see (exhibitorConfig.leadVisibleFields). This is the default for every lead.
  2. Attendee per-field override. Each attendee controls their own mobile field-visibility settings. These override the baseline on a per-field basis: a field the attendee chose to share with the exhibitors audience is visible even if it isn't in the baseline, and a field they restricted is hidden even if it is in the baseline.

The lead's name (firstName and lastName) is always returned. Empty values are omitted from the response.

Standard field keys are email, jobTitle, company, bio, headshot, website, workPhone, and mobilePhone. Custom fields are keyed cf:<code> and are returned in the customFields array with their human-readable label and value.

Capture & dedup

Capture is deduplicated per company + attendee. The first time a company scans a given attendee, Jade creates a lead with source / captureType of sdk. Every later scan of the same attendee by the same company appends a new capture timestamp instead of creating a duplicate lead. The response's captures count, along with firstCapturedAt and lastCapturedAt, reflect this scan history.

Example request

curl "/api/public/lead-sdk\
?tenantCode=acme-tenant\
&clientCode=acme\
&eventCode=acme-2026\
&activationCode=BTH-7Q2K9X\
&badgeId=A1B2C3D4"

Response

200 OK — the lead was captured. The fields and customFields present depend on field visibility (see above).

{
  "leadId": "665f1c2a9b4e3d0012ab34cd",
  "badgeId": "A1B2C3D4",
  "source": "sdk",
  "captures": 3,
  "firstCapturedAt": "2026-06-01T14:22:05.000Z",
  "lastCapturedAt": "2026-06-02T09:48:31.000Z",
  "fields": {
    "firstName": "Ada",
    "lastName": "Lovelace",
    "email": "ada@example.com",
    "jobTitle": "Principal Engineer",
    "company": "Analytical Engines Ltd."
  },
  "customFields": [
    { "code": "industry", "label": "Industry", "value": "Software" }
  ]
}

Testing the SDK

Two reserved 0 values let you wire up and exercise an integration before the show without touching real attendees or data. Neither persists anything.

Sample lead — badgeId=0

Against a real client and event, pass badgeId=0 to get back a test lead populated with sample data in every allowed field. It resolves no real attendee and persists nothing, and the response includes "isTest": true. Use it to verify your scanning app renders and stores the response shape correctly.

curl "/api/public/lead-sdk\
?tenantCode=acme-tenant\
&clientCode=acme\
&eventCode=acme-2026\
&activationCode=BTH-7Q2K9X\
&badgeId=0"
{
  "leadId": "000000000000000000000000",
  "badgeId": "0",
  "isTest": true,
  "source": "sdk",
  "captures": 1,
  "firstCapturedAt": "2026-06-01T14:22:05.000Z",
  "lastCapturedAt": "2026-06-01T14:22:05.000Z",
  "fields": {
    "firstName": "Jordan",
    "lastName": "Sample",
    "email": "jordan.sample@example.com",
    "jobTitle": "Director of Operations",
    "company": "Sample Industries"
  },
  "customFields": [
    { "code": "industry", "label": "Industry", "value": "Sample answer" }
  ]
}

The sample returns exactly the fields the organizer configured to share with exhibitors (plus the name), populated with sample values — so what you see here matches what a real lead will return for this event.

Test event — activationCode=0

Pass activationCode=0 to connect to a fake test event: all features are enabled, no license is required, and nothing is persisted — no real client or event is needed, so the routing codes (tenantCode, clientCode, eventCode) can be anything. Every call returns the sample lead and includes "testEvent": true. This lets you exercise the full SDK before any purchase.

curl "/api/public/lead-sdk\
?tenantCode=sandbox\
&clientCode=sandbox\
&eventCode=sandbox\
&activationCode=0\
&badgeId=A1B2C3D4"
{
  "leadId": "test-lead",
  "badgeId": "A1B2C3D4",
  "testEvent": true,
  "source": "sdk",
  "captures": 1,
  "firstCapturedAt": "2026-06-01T14:22:05.000Z",
  "lastCapturedAt": "2026-06-01T14:22:05.000Z",
  "fields": {
    "firstName": "Jordan",
    "lastName": "Sample",
    "email": "jordan.sample@example.com",
    "jobTitle": "Director of Operations",
    "company": "Sample Industries"
  },
  "customFields": []
}

Error responses

  • 400 Bad Request — a required query parameter (tenantCode, clientCode, eventCode, activationCode, or badgeId) is missing or empty.
  • 401 Unauthorized — the activationCode is invalid, or it doesn't match the supplied clientCode / eventCode.
  • 403 Forbidden — the company is authenticated but does not hold the SDK lead-retrieval license for the event (no purchased lead product grants sdk).
  • 404 Not Found — no participant matches the supplied badgeId.