---
title: "Import registrants without invitations"
description: "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.

```text
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.


Example request with fictional IDs. Set BRELLA_API_BASE_URL and BRELLA_API_ACCESS_TOKEN in the execution environment. Optional inputs are documented in the resource input reference.

```shell
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
}'
```



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.


Registrant custom lists: List IDs must belong to the event. This illustrates a valid, authorized update.
Before:

```json
{
  "custom_list_ids": [
    401,
    402
  ]
}
```

**omit** — PATCH body:

```json
{}
```

Conceptual result:

```json
{
  "custom_list_ids": [
    401,
    402
  ]
}
```


**replace** — PATCH body:

```json
{
  "custom_list_ids": [
    402,
    403
  ]
}
```

Conceptual result:

```json
{
  "custom_list_ids": [
    402,
    403
  ]
}
```


**clear** — PATCH body:

```json
{
  "custom_list_ids": []
}
```

Conceptual result:

```json
{
  "custom_list_ids": []
}
```



Read the [complete registrant inputs](https://docs.brella.io/cookbook/registrants#input-reference) 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.
