MeraEvents
API Integration

Read registration and attendee data

Synchronize successful registrations, handle multiple attendees, and match submitted values by field ID.

Use the registrations endpoint when an approved integration needs successful bookings and attendee details for an event.

GET /v1/events/{eventId}/registrations
Required scope: registrations:read

This endpoint contains personal data. Store, transmit, and retain it only for the approved integration purpose.

Request registrations

curl --request GET \
  'https://api.meraevents.com/v1/events/501/registrations?limit=25' \
  --header 'x-api-key: YOUR_SECRET_TOKEN'

The endpoint returns only successful registrations. Incomplete and deleted registrations are omitted.

Understand the response hierarchy

Each item in data is one registration or booking. Its attendees array contains every attendee included in that registration.

{
  "data": [
    {
      "eventSignupId": 9002,
      "registrationNumber": 7002,
      "barcodeNumber": "MEV-9002",
      "registeredAt": "2026-08-10T09:30:00.000Z",
      "attendees": [
        {
          "attendeeId": 11,
          "ticketType": "Delegate",
          "name": "Alice Client",
          "email": "alice@example.com",
          "phoneNumber": "+91 90000 00000",
          "city": "Hyderabad",
          "companyName": "Client Corp",
          "designation": "Director",
          "address": "Road No. 1",
          "isPrimary": true,
          "customFields": [
            {
              "fieldId": 105,
              "fieldName": "Company Name",
              "value": "Client Corp"
            }
          ]
        },
        {
          "attendeeId": 12,
          "ticketType": "Workshop Add-on",
          "name": "Alice Client",
          "email": "alice@example.com",
          "phoneNumber": "+91 90000 00000",
          "city": "Hyderabad",
          "companyName": "Client Corp",
          "designation": "Director",
          "address": "Road No. 1",
          "isPrimary": false,
          "customFields": []
        }
      ]
    }
  ],
  "nextCursor": "8990",
  "hasMore": true
}

Registration-level fields

FieldMeaning
eventSignupIdInternal booking identifier
registrationNumberCustomer-facing registration number
barcodeNumberBooking-level barcode shared by the registration's attendees
registeredAtISO 8601 date and time at which the registration was created
attendeesPeople and add-ons included in this registration

Do not treat barcodeNumber as a unique attendee identifier. Use attendeeId to distinguish attendees within the same booking.

Attendee-level fields

Each attendee has a stable attendeeId, ticket name, primary-attendee status, normalized contact/company fields, and attendee-scoped customFields.

The normalized fields are provided for common integrations:

  • name
  • email
  • phoneNumber
  • city
  • companyName
  • designation
  • address

They are nullable because an event may not collect them. For add-on tickets, normalized values can fall back to the primary attendee when the add-on has no separate answer.

customFields contains values stored directly for that attendee. It does not copy fallback values from another attendee.

Multiple attendees in one registration

Process every object in attendees; do not read only the first attendee.

  • The primary attendee has isPrimary: true.
  • Secondary attendees have their own attendeeId and may have different tickets and answers.
  • An add-on can inherit normalized display fields from the primary attendee while keeping an empty attendee-specific customFields array.
  • The registration number, barcode, and registration date belong to the booking and should not be duplicated as attendee-unique identifiers.

For relational storage, a useful model is:

Registration (eventSignupId)
└── Attendee (attendeeId)
    └── Custom field answer (fieldId, value)

Match custom-field answers

For every answer, join:

customFields[].fieldId = custom-fields.fields[].id

Use the definition returned by GET /custom-fields for the current field label, type, options, group, and ticket applicability. Treat the fieldName included with an answer as display-only.

Paginate by registration

limit controls the number of registrations per page, not the total number of attendees. A page of 25 registrations can contain more than 25 attendees.

Continue requesting pages until hasMore is false:

  1. Make the first request without cursor.
  2. Process all registrations and all nested attendees.
  3. When hasMore is true, send nextCursor as the next request's cursor.
  4. Stop when hasMore is false and nextCursor is null.

Do not calculate or modify the cursor yourself.

Next step

Review pagination, errors, and reliable syncs before running a complete registration export.

On this page