Skip to content
Core API
Esc
navigateopen⌘Jpreview
On this page

Import registrants without invitations

Create an invited registrant, preserve external identity, and explicitly suppress the invitation email.

Use this recipe when you have registration data in another system and want to create a Brella registrant without sending an invitation yet.

Before you start

Your registrant scope needs Write access, the create action, access to the event, and mappings for every input you send. Include send_email in those mappings: an unconfigured input is ignored, so merely putting false in the body is insufficient if the scope does not allow it. Read access and the external_id query filter help you check for an existing record first.

Check for an existing registrant

Use an exact external_id filter if it is enabled in your scope. Follow pagination when necessary. Resolve an existing match before choosing POST or PATCH; do not assume POST is an upsert.

GET /api/core/organizations/{organization_id}/events/{event_id}/registrants?external_id=CRM-10042

Create the registrant

Use the external_* fields for the imported identity. Explicitly send the JSON boolean send_email: false; the API defaults to sending an invitation when this input is omitted.

Build a request

Example data only. No request is sent.

POST
Choose the destination IDs
Start with these fields

External identifier.

Invited identity email.

Invited first name.

Invited last name.

Defaults to true. Use a JSON boolean, not the string "false".

Add optional fields (13)

Invited company.

Invited title.

Networking pitch.

Networking preference.

dark, light, or system.

Invalid or omitted POST values fall back to the event's default ticket type.

Full custom-list membership replacement. [] removes all custom-list memberships.

Name, not ID. Brella imports or resolves the event value.

Name, not ID.

Name, not ID.

Entries use interest_id and intent_ids. PATCH replaces unselected interests.

Entries use key plus value or values.

Requested seat count. Default to 1 \- Do NOT use values larger than 1\. Seats are a legacy concept that is to be deprecated.

Use the API address and token from your environment. Set up authentication.

curl --fail-with-body --silent --show-error --globoff --max-time 30 --request POST \
  --url "${BRELLA_API_BASE_URL}"'/api/core/organizations/123/events/456/registrants' \
  --header "Accept: application/vnd.brella.v4+json" \
  --header "Brella-API-Access-Token: ${BRELLA_API_ACCESS_TOKEN}" \
  --header "Content-Type: application/json" \
  --data-raw '{
  "external_id": "CRM-10042",
  "external_email": "alex@example.com",
  "external_first_name": "Alex",
  "external_last_name": "Morgan",
  "send_email": false
}'
201 CreatedIllustrative response
{
  "data": {
    "id": "1201",
    "type": "registrant"
  }
}

The token scope determines returned fields. This selector illustrates that configuration; it does not change your token or the request.

The record is created with the invited status. Save data.id from the 201 Created response. Selected write-response fields are optional; receiving only the ID is valid.

Verify and continue

Read the created ID back with a token that can read the imported fields. Check the external identity and event context. When repeating this for a batch, keep a record of source IDs, Brella IDs and outcomes. After a timeout, reconcile the record before retrying a POST.

To update a record, use its Brella ID and only the intended fields. Registrant PATCH uses the invited-registrant update service and remains subject to registrant validation rules; it is not an unrestricted profile-edit operation.

What does this PATCH change?

Compare omitted, replaced and cleared collections. These are conceptual field values, not a live API response.

Before
{
  "custom_list_ids": [
    401,
    402
  ]
}
PATCH body
{}
After
{
  "custom_list_ids": [
    401,
    402
  ]
}

Omitting the field keeps the existing collection.

List IDs must belong to the event. This illustrates a valid, authorized update.

Read the complete registrant inputs for ticket types, interests and custom fields. custom_list_ids replaces the list membership when provided. Use seats: 1 if needed; larger legacy seat counts are not a way to batch-create unrelated attendees.