Skip to content

Endpoint Reference

All paths are relative to the Partner API base URL. The scope listed for each endpoint is the minimum effective scope.

Every response body includes correlation_id. Every error uses the shared error envelope described in Errors and Limits.

Scope: partner:read

Returns authenticated service-account details.

Response 200:

{
"org_id": "<ORG_ID>",
"principal_type": "service_account",
"service_account_user_id": "<SERVICE_ACCOUNT_USER_ID>",
"scopes": ["partner:read", "partner:write"],
"correlation_id": "<CORRELATION_ID>"
}

Route-specific errors: auth and scope errors only.

Scope: partner:read

Confirms whether a partner ID is mapped in your org.

Path parameters:

NameDescription
kindPartner ID kind, such as event, session, or attendee.
partner_idPartner-owned ID.

Response 200:

{
"kind": "attendee",
"partner_id": "att-1001",
"mapped": true,
"correlation_id": "<CORRELATION_ID>"
}

Errors: 400 INVALID_PARTNER_KIND, 400 INVALID_PARTNER_ID, 404 PARTNER_ID_NOT_FOUND.

Scope: partner:write

Creates an event. You own event_id.

Request:

{
"event_id": "summit-2026",
"title": "Annual Partner Summit 2026",
"description": "Two-day leadership summit",
"start_date": "2026-09-10",
"end_date": "2026-09-11",
"timezone": "America/New_York",
"visibility": "private",
"url_slug": "summit-2026"
}

Field limits:

FieldLimit
titleRequired, max 200 characters.
descriptionOptional, max 4000 characters.
start_date, end_dateOptional ISO date strings.
timezoneOptional, max 128 characters.
visibilityOptional, max 32 characters.
url_slugOptional, max 128 characters.

Response 201: event object with event_id, details, timestamps, and correlation_id.

Errors: 400 INVALID_JSON, 400 INVALID_PARTNER_ID, 400 INVALID_TITLE, 400 INVALID_DESCRIPTION, 400 INVALID_START_DATE, 400 INVALID_END_DATE, 400 INVALID_TIMEZONE, 400 INVALID_VISIBILITY, 400 INVALID_URL_SLUG, 409 PARTNER_ID_CONFLICT.

Scope: partner:read

Lists events ordered descending by created_at.

Query parameters: limit (1-100, default 50), cursor.

Response 200:

{
"items": [
{
"event_id": "summit-2026",
"title": "Annual Partner Summit 2026",
"description": "Two-day leadership summit",
"event_details": null,
"objectives": null,
"welcome_instructions": null,
"start_date": "2026-09-10",
"end_date": "2026-09-11",
"timezone": "America/New_York",
"visibility": "private",
"url_slug": "summit-2026",
"created_at": "<ISO_DATETIME>",
"updated_at": "<ISO_DATETIME>"
}
],
"next_cursor": null,
"correlation_id": "<CORRELATION_ID>"
}

Errors: org, auth, scope, and rate-limit errors.

Scope: partner:read

Returns one event.

Response 200: event object with context fields, timestamps, and correlation_id.

Errors: 400 INVALID_PARTNER_ID, 404 EVENT_NOT_FOUND.

Scope: partner:write

Updates event context. At least one field is required.

Request:

{
"event_details": "Senior product and engineering leaders.",
"objectives": "Maximize useful introductions.",
"welcome_instructions": "Share your top goal for the event."
}

Each field is optional and capped at 4000 characters.

Response 200:

{
"event_id": "summit-2026",
"context": {
"event_details": "Senior product and engineering leaders.",
"objectives": "Maximize useful introductions.",
"welcome_instructions": "Share your top goal for the event."
},
"correlation_id": "<CORRELATION_ID>"
}

Errors: 400 INVALID_PARTNER_ID, 400 INVALID_JSON, 400 INVALID_CONTEXT, 404 EVENT_NOT_FOUND.

Scope: partner:read

Returns event context.

Response 200: { event_id, context, correlation_id }.

Errors: 400 INVALID_PARTNER_ID, 404 EVENT_NOT_FOUND.

Scope: partner:write

Creates a session within an event. You own session_id.

Request:

{
"session_id": "opening-keynote",
"title": "Opening Keynote",
"description": "Kickoff session",
"start_timestamp": "2026-09-10T13:00:00Z",
"end_timestamp": "2026-09-10T14:00:00Z"
}

Response 201: session object with session_id, event_id, metadata, timestamps, and correlation_id.

Errors: 400 INVALID_PARTNER_ID, 400 INVALID_TITLE, 400 INVALID_DESCRIPTION, 400 INVALID_START_TIMESTAMP, 400 INVALID_END_TIMESTAMP, 404 EVENT_NOT_FOUND, 409 PARTNER_ID_CONFLICT.

Scope: partner:read

Lists event sessions ordered ascending by start_timestamp.

Query parameters: limit, cursor.

Response 200: { items, next_cursor, correlation_id }.

Errors: 400 INVALID_PARTNER_ID, 404 EVENT_NOT_FOUND.

GET /events/:event_id/sessions/:session_id

Section titled “GET /events/:event_id/sessions/:session_id”

Scope: partner:read

Returns one session.

Response 200: session object with correlation_id.

Errors: 400 INVALID_PARTNER_ID, 404 SESSION_NOT_FOUND, 404 EVENT_NOT_FOUND.

Scope: partner:read

Lists event attendees ordered ascending by partner_id.

Query parameters: limit, cursor.

Response 200:

{
"items": [
{
"attendee_id": "att-1001",
"event_id": "summit-2026",
"display_name": "Jordan Lee",
"title": "VP Product",
"company": "Acme",
"event": {
"role_at_event": null,
"visibility": null,
"goal": null,
"needs": null,
"offers": null,
"onboarded_at": null,
"joined_at": null
},
"identity": {
"review_required": false,
"open_review_count": 0
}
}
],
"next_cursor": null,
"correlation_id": "<CORRELATION_ID>"
}

Errors: 400 INVALID_PARTNER_ID, 404 EVENT_NOT_FOUND.

Scope: partner:write

Imports attendees into an event. Async; returns a run.

Request:

{
"idempotency_key": "<IDEMPOTENCY_KEY>",
"webhook_url": "https://example.com/future-webhook",
"attendees": [
{
"attendee_id": "att-1001",
"name": "Jordan Lee",
"email": "jordan@example.com",
"linkedin_url": "https://www.linkedin.com/in/jordanlee",
"title": "VP Product",
"company": "Acme",
"raw_data": { "source": "crm-export" }
}
]
}

Per-attendee limits:

FieldLimit
nameRequired, max 240 characters.
emailOptional, max 320 characters.
linkedin_urlOptional, max 2048 characters.
titleOptional, max 512 characters.
companyOptional, max 512 characters.
raw_dataOptional JSON object.

The attendees array must be non-empty, contain unique attendee_id values, and contain at most 50,000 rows by default.

Response 202 first call or 200 idempotent replay: run object with kind: "import".

Errors: 400 INVALID_PARTNER_ID, 400 INVALID_JSON, 400 INVALID_IDEMPOTENCY_KEY, 400 INVALID_ATTENDEES, 400 INVALID_ATTENDEE, 400 DUPLICATE_ATTENDEE_ID, 400 INVALID_ATTENDEE_NAME, 400 INVALID_ATTENDEE_EMAIL, 400 INVALID_ATTENDEE_LINKEDIN_URL, 400 INVALID_ATTENDEE_TITLE, 400 INVALID_ATTENDEE_COMPANY, 400 INVALID_ATTENDEE_RAW_DATA, 400 INVALID_WEBHOOK_URL, 404 EVENT_NOT_FOUND, 409 IDEMPOTENCY_KEY_CONFLICT, 413 PAYLOAD_TOO_LARGE.

GET /events/:event_id/attendees/:attendee_id/identity

Section titled “GET /events/:event_id/attendees/:attendee_id/identity”

Scope: partner:read

Returns identity decision history for one attendee, ordered descending by created_at.

Query parameters: limit, cursor.

Response 200: { event_id, attendee_id, items, next_cursor, correlation_id }.

Errors: 400 INVALID_PARTNER_ID, 404 EVENT_NOT_FOUND, 404 ATTENDEE_NOT_FOUND.

Scope: partner:write

Triggers attendee enrichment for an event. Async; returns a run.

Request:

{
"idempotency_key": "<IDEMPOTENCY_KEY>",
"webhook_url": "https://example.com/future-webhook"
}

Response 202 first call or 200 idempotent replay: run object with kind: "enrichment" and progress counters.

Errors: 400 INVALID_PARTNER_ID, 400 INVALID_JSON, 400 INVALID_IDEMPOTENCY_KEY, 400 INVALID_WEBHOOK_URL, 404 EVENT_NOT_FOUND, 409 IDEMPOTENCY_KEY_CONFLICT.

Scope: partner:write

Triggers an attendee matching run. Async; returns a run.

Request:

{
"idempotency_key": "<IDEMPOTENCY_KEY>",
"webhook_url": "https://example.com/future-webhook",
"top_n": 10
}

top_n is optional, defaults to 10, and must be 1-50.

Response 202 first call or 200 idempotent replay: run object with kind: "match".

Errors: 400 INVALID_PARTNER_ID, 400 INVALID_JSON, 400 INVALID_IDEMPOTENCY_KEY, 400 INVALID_WEBHOOK_URL, 404 EVENT_NOT_FOUND, 409 IDEMPOTENCY_KEY_CONFLICT.

GET /events/:event_id/attendees/:attendee_id/matches

Section titled “GET /events/:event_id/attendees/:attendee_id/matches”

Scope: partner:read

Lists top matches for one attendee, ordered descending by final_score.

Query parameters: limit, cursor, optional run_id. If run_id is omitted, the latest terminal run is used.

Response 200: { event_id, attendee_id, run_id, items, next_cursor, correlation_id }.

Errors: 400 INVALID_PARTNER_ID, 404 EVENT_NOT_FOUND, 404 ATTENDEE_NOT_FOUND, 404 MATCH_RUN_NOT_FOUND.

Scope: partner:read

Lists matches across all attendee pairs for an event, ordered descending by final_score.

Query parameters: limit, cursor, optional run_id, optional session_id, optional goal.

Response 200: { event_id, run_id, items, next_cursor, correlation_id }.

Errors: 400 INVALID_PARTNER_ID, 404 EVENT_NOT_FOUND, 404 SESSION_NOT_FOUND, 404 MATCH_RUN_NOT_FOUND.

GET /events/:event_id/matches/:principal_partner_id/:target_partner_id

Section titled “GET /events/:event_id/matches/:principal_partner_id/:target_partner_id”

Scope: partner:read

Returns one ordered pair match score.

Query parameters: optional run_id.

Response 200:

{
"event_id": "summit-2026",
"match_id": "<MATCH_ID>",
"run_id": "<RUN_ID>",
"principal_attendee_id": "att-1001",
"target_attendee_id": "att-1002",
"final_score": 0.87,
"sub_scores": {
"goal_complementarity": 0.9,
"goal_needs_to_offers": 0.8,
"goal_offers_to_needs": 0.7,
"value_alignment": 0.6,
"general_similarity": 0.5,
"score_a_to_b": 0.85,
"score_b_to_a": 0.82
},
"best_goal_match": { "score": 0.9, "direction": "needsToOffers" },
"driving_goal_pair": { "score": 0.9, "direction": "needsToOffers" },
"intent_strength": { "aToB": 0.6, "bToA": 0.4 },
"input_hash": "<INPUT_HASH>",
"algorithm_version": "<ALGORITHM_VERSION>",
"policy_version": "<POLICY_VERSION>",
"context_snapshot_id": "<CONTEXT_SNAPSHOT_ID>",
"freshness": { "computed_at": "<ISO_DATETIME>" },
"computed_at": "<ISO_DATETIME>",
"correlation_id": "<CORRELATION_ID>"
}

Errors: 400 INVALID_PARTNER_ID, 404 EVENT_NOT_FOUND, 404 ATTENDEE_NOT_FOUND, 404 MATCH_RUN_NOT_FOUND, 404 MATCH_NOT_FOUND.

Goal IDs are not exposed. best_goal_match and driving_goal_pair surface score and direction only; goal text lives on attendee fields.

Scope: partner:write

Creates a generic run outside event scope.

Request:

{
"kind": "import",
"idempotency_key": "<IDEMPOTENCY_KEY>",
"progress": {},
"snapshot_metadata": {},
"version_metadata": {},
"webhook_url": "https://example.com/future-webhook"
}

kind must be import, enrichment, or match.

Response 201 first call or 200 idempotent replay: run object. event_id is null for non-event runs.

Errors: 400 INVALID_JSON, 400 INVALID_RUN_KIND, 400 INVALID_IDEMPOTENCY_KEY, 400 INVALID_PROGRESS, 400 INVALID_SNAPSHOT_METADATA, 400 INVALID_VERSION_METADATA, 400 INVALID_WEBHOOK_URL.

Scope: partner:read

Lists all runs for the org, ordered descending by created_at.

Query parameters: limit, cursor, optional kind.

Response 200: { items, next_cursor, correlation_id }.

Errors: 400 INVALID_RUN_KIND.

Scope: partner:read

Polls one run. This is the canonical terminal-status poll for import, enrichment, and match runs.

Path parameters: run_id.

Response 200:

{
"run_id": "<RUN_ID>",
"kind": "match",
"status": "queued",
"event_id": "summit-2026",
"idempotency_key": "<IDEMPOTENCY_KEY>",
"progress": {},
"error": null,
"snapshot_metadata": {},
"version_metadata": {},
"webhook_url": null,
"created_at": "<ISO_DATETIME>",
"updated_at": "<ISO_DATETIME>",
"started_at": null,
"terminal_at": null,
"correlation_id": "<CORRELATION_ID>"
}

Errors: 400 INVALID_RUN_ID, 404 RUN_NOT_FOUND.

Scope: partner:read

Lists open identity reviews for one event’s attendees, ordered descending by created_at.

Query parameters: limit, cursor.

Response 200: { items, next_cursor, correlation_id }.

Errors: 400 INVALID_PARTNER_ID, 404 EVENT_NOT_FOUND.

Scope: partner:read

Lists open identity reviews across the org, ordered descending by created_at.

Query parameters: limit, cursor.

Response 200: { items, next_cursor, correlation_id }.

Route-specific errors: auth and scope errors only.

Scope: partner:write

Accepts, rejects, or marks an open review as a distinct person.

Request:

{
"decision": "accept",
"reason": "Confirmed by source system operator."
}

decision must be accept, reject, or distinct.

Response 200: { review_id, kind, partner_id, decision, logged: true, minted, correlation_id }.

Errors: 400 INVALID_REVIEW_ID, 400 INVALID_JSON, 400 INVALID_REVIEW_DECISION, 404 REVIEW_NOT_FOUND.

Scope: partner:write

Resolves a review by merging the source entity into the target entity.

Request:

{
"source_kind": "attendee",
"source_partner_id": "att-dupe",
"target_kind": "attendee",
"target_partner_id": "att-1001",
"reason": "Same person in source system."
}

Response 200: { review_id, source, target, merged: true, superseded_anchors, rewritten_anchors, deleted_computations, correlation_id }.

Errors: 400 INVALID_REVIEW_ID, 400 INVALID_JSON, 400 INVALID_PARTNER_KIND, 400 INVALID_PARTNER_ID, 400 REVIEW_SOURCE_MISMATCH, 400 MERGE_REJECTED, 404 REVIEW_NOT_FOUND, 404 PARTNER_ID_NOT_FOUND.