REST API · v1

    API Documentation

    Integrate EventoGate into your stack. Register attendees, manage events, and trigger automations — all via a simple REST API.

    Base URL: https://api.eventogate.com/v1

    Authentication

    All API requests must include your API key in the Authorization header as a Bearer token. You can generate and manage API keys from your workspace settings.

    bash
    curl https://api.eventogate.com/v1/events \
      -H "Authorization: Bearer eg_live_your_api_key_here" \
      -H "Content-Type: application/json"

    Keep your API key secret

    Never expose API keys in client-side code or public repositories. Use server-side requests or environment variables.

    Live key

    eg_live_...

    Use in production

    Test key

    eg_test_...

    Safe for development — no real data is affected

    Events

    Create and manage your events. Events can be in-person, virtual, or hybrid and contain attendees, ticket types, and custom registration fields.

    GET/events

    Returns a paginated list of all events in your workspace.

    Query parameters

    NameType
    pageinteger
    per_pageinteger
    statusstring

    Response

    json
    {
      "data": [
        {
          "id": "evt_01HXYZ",
          "name": "Q1 Product Workshop",
          "type": "in_person",
          "status": "published",
          "start_at": "2025-06-15T09:00:00Z",
          "end_at": "2025-06-15T17:00:00Z",
          "attendee_count": 142,
          "capacity": 250,
          "created_at": "2025-05-01T12:00:00Z"
        }
      ],
      "meta": {
        "page": 1,
        "per_page": 20,
        "total": 1
      }
    }
    POST/events

    Creates a new event.

    Request body

    NameType
    name*string
    type*string
    start_at*string
    end_at*string
    venue_idstring
    capacityinteger
    descriptionstring

    Example request

    json
    {
      "name": "Q1 Product Workshop",
      "type": "in_person",
      "start_at": "2025-06-15T09:00:00Z",
      "end_at": "2025-06-15T17:00:00Z",
      "venue_id": "ven_03AXYZ",
      "capacity": 250
    }

    Response

    json
    {
      "id": "evt_01HXYZ",
      "name": "Q1 Product Workshop",
      "type": "in_person",
      "status": "draft",
      "start_at": "2025-06-15T09:00:00Z",
      "end_at": "2025-06-15T17:00:00Z",
      "venue_id": "ven_03AXYZ",
      "capacity": 250,
      "created_at": "2025-05-01T12:00:00Z"
    }
    GET/events/{event_id}

    Returns a single event by ID.

    Response

    json
    {
      "id": "evt_01HXYZ",
      "name": "Q1 Product Workshop",
      "type": "in_person",
      "status": "published",
      "start_at": "2025-06-15T09:00:00Z",
      "end_at": "2025-06-15T17:00:00Z",
      "venue_id": "ven_03AXYZ",
      "capacity": 250,
      "attendee_count": 142,
      "created_at": "2025-05-01T12:00:00Z"
    }
    PUT/events/{event_id}

    Updates an existing event. Send only the fields you want to change.

    Request body

    NameType
    namestring
    statusstring
    capacityinteger

    Response

    json
    {
      "id": "evt_01HXYZ",
      "name": "Q1 Product Workshop — Updated",
      "status": "published",
      "capacity": 300,
      "updated_at": "2025-05-10T08:30:00Z"
    }
    DELETE/events/{event_id}

    Permanently deletes an event and all associated attendees. This action is irreversible.

    Response

    json
    {
      "deleted": true,
      "id": "evt_01HXYZ"
    }

    Attendees

    Register and manage attendees for an event. Attendees can be created via the API (your registration form), imported, or added as walk-ins at check-in.

    GET/events/{event_id}/attendees

    Returns a paginated list of attendees registered for the event.

    Query parameters

    NameType
    pageinteger
    per_pageinteger
    checked_inboolean
    qstring

    Response

    json
    {
      "data": [
        {
          "id": "att_09BXYZ",
          "event_id": "evt_01HXYZ",
          "first_name": "Sarah",
          "last_name": "Chen",
          "email": "sarah@example.com",
          "ticket_type": "general",
          "checked_in": false,
          "qr_code": "QR_att_09BXYZ",
          "registered_at": "2025-05-12T10:14:00Z"
        }
      ],
      "meta": {
        "page": 1,
        "per_page": 20,
        "total": 142
      }
    }
    POST/events/{event_id}/attendees

    Registers a new attendee for the event. Use this from your website registration form or any upstream system.

    Request body

    NameType
    first_name*string
    last_name*string
    email*string
    ticket_type_slugstring
    custom_fieldsobject
    utm_sourcestring
    utm_mediumstring
    utm_campaignstring

    Example request

    json
    {
      "first_name": "Sarah",
      "last_name": "Chen",
      "email": "sarah@example.com",
      "ticket_type_slug": "general",
      "utm_source": "website",
      "utm_medium": "organic",
      "custom_fields": {
        "company": "Acme Corp",
        "job_title": "Product Manager"
      }
    }

    Response

    json
    {
      "id": "att_09BXYZ",
      "event_id": "evt_01HXYZ",
      "first_name": "Sarah",
      "last_name": "Chen",
      "email": "sarah@example.com",
      "ticket_type": "general",
      "qr_code": "QR_att_09BXYZ",
      "checked_in": false,
      "registered_at": "2025-05-12T10:14:00Z"
    }
    GET/events/{event_id}/attendees/{attendee_id}

    Returns a single attendee record.

    Response

    json
    {
      "id": "att_09BXYZ",
      "event_id": "evt_01HXYZ",
      "first_name": "Sarah",
      "last_name": "Chen",
      "email": "sarah@example.com",
      "ticket_type": "general",
      "qr_code": "QR_att_09BXYZ",
      "checked_in": true,
      "checked_in_at": "2025-06-15T09:12:44Z",
      "registered_at": "2025-05-12T10:14:00Z",
      "custom_fields": {
        "company": "Acme Corp",
        "job_title": "Product Manager"
      }
    }
    DELETE/events/{event_id}/attendees/{attendee_id}

    Removes an attendee from the event.

    Response

    json
    {
      "deleted": true,
      "id": "att_09BXYZ"
    }

    Check-in

    Check attendees in by QR code scan or by searching their name or email. Both methods mark the attendee as checked in and return their full record.

    POST/events/{event_id}/checkin/qr

    Checks in an attendee by scanning their QR code. Returns the attendee record or an error if the code is invalid or already used.

    Request body

    NameType
    qr_code*string

    Example request

    json
    {
      "qr_code": "QR_att_09BXYZ"
    }

    Response

    json
    {
      "id": "att_09BXYZ",
      "first_name": "Sarah",
      "last_name": "Chen",
      "email": "sarah@example.com",
      "ticket_type": "general",
      "checked_in": true,
      "checked_in_at": "2025-06-15T09:12:44Z"
    }
    GET/events/{event_id}/checkin/search

    Searches for attendees by name or email. Useful for manual check-in without a QR scanner.

    Query parameters

    NameType
    q*string

    Response

    json
    {
      "data": [
        {
          "id": "att_09BXYZ",
          "first_name": "Sarah",
          "last_name": "Chen",
          "email": "sarah@example.com",
          "ticket_type": "general",
          "checked_in": false
        }
      ]
    }
    POST/events/{event_id}/checkin/{attendee_id}

    Manually checks in an attendee by their ID. Use this after a search to confirm check-in.

    Response

    json
    {
      "id": "att_09BXYZ",
      "checked_in": true,
      "checked_in_at": "2025-06-15T09:15:00Z"
    }

    Webhooks

    Subscribe to real-time event notifications. EventoGate sends an HTTP POST to your endpoint whenever a trigger fires. Payloads are signed with HMAC-SHA256.

    GET/webhooks

    Lists all webhook subscriptions in your workspace.

    Response

    json
    {
      "data": [
        {
          "id": "wh_77KXYZ",
          "url": "https://your-app.com/hooks/eventogate",
          "events": ["attendee.registered", "attendee.checked_in"],
          "active": true,
          "created_at": "2025-04-01T00:00:00Z"
        }
      ]
    }
    POST/webhooks

    Creates a new webhook subscription.

    Request body

    NameType
    url*string
    events*string[]
    secretstring

    Example request

    json
    {
      "url": "https://your-app.com/hooks/eventogate",
      "events": [
        "attendee.registered",
        "attendee.checked_in",
        "event.published"
      ],
      "secret": "whsec_your_signing_secret"
    }

    Response

    json
    {
      "id": "wh_77KXYZ",
      "url": "https://your-app.com/hooks/eventogate",
      "events": ["attendee.registered", "attendee.checked_in", "event.published"],
      "active": true,
      "created_at": "2025-05-01T12:00:00Z"
    }
    DELETE/webhooks/{webhook_id}

    Deletes a webhook subscription.

    Response

    json
    {
      "deleted": true,
      "id": "wh_77KXYZ"
    }

    Trigger event types

    EventDescription
    event.createdA new event was created
    event.publishedAn event was published
    event.updatedAn event was updated
    event.deletedAn event was deleted
    attendee.registeredA new attendee was registered
    attendee.updatedAn attendee record was updated
    attendee.deletedAn attendee was removed
    attendee.checked_inAn attendee checked in

    Verifying signatures

    When you provide a secret on webhook creation, each payload includes an X-EventoGate-Signature header. Verify it on your server to ensure the request is genuine.

    javascript
    import crypto from "crypto";
    
    function verifySignature(payload, signature, secret) {
      const expected = crypto
        .createHmac("sha256", secret)
        .update(payload)
        .digest("hex");
      return crypto.timingSafeEqual(
        Buffer.from(expected),
        Buffer.from(signature)
      );
    }

    Error Codes

    Errors follow standard HTTP status codes. The response body always includes a machine-readable code and a human-readable message.

    json
    {
      "error": {
        "code": "attendee_already_exists",
        "message": "An attendee with this email is already registered for the event.",
        "status": 409
      }
    }
    StatusLabel
    400Bad Request
    401Unauthorized
    403Forbidden
    404Not Found
    409Conflict
    429Too Many Requests
    500Server Error

    Ready to integrate?

    Create a free account and get your API key in under a minute.