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.
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
}'{
"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.
{
"custom_list_ids": [
401,
402
]
}{}{
"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.