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.
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.
| Parameter | Description |
|---|---|
tenantCode | Your Jade tenant code. |
clientCode | Your Jade client code. |
eventCode | The 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:
- Organizer baseline. The organizer sets a per-event list of fields exhibitors may see (
exhibitorConfig.leadVisibleFields). This is the default for every lead. - 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
exhibitorsaudience 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, orbadgeId) is missing or empty. - 401 Unauthorized — the
activationCodeis invalid, or it doesn't match the suppliedclientCode/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.