# Catalyst

![](/files/etKrVOxHqlu2ByawIyIe) Use the Catalyst integration to export Eventication data (memberships, jobs, shifts) to an external system.

## Setup in Eventication

Go to: `Admin → Event → General → Integrations → + (button) → Catalyst`. If you can't find it, ask an Eventication admin to add it for you.

{% hint style="warning" %}
Admin validation required: this integration must be **validated by an Eventication admin** before it becomes active and before you can use the API key.

On the Catalyst integration screen, if it’s not validated you’ll see an “Action required” note with a link to contact Eventication.
{% endhint %}

{% hint style="info" %}
Note that a Catalyst API key is scoped to an event. Each event needs another Catalyst integration.
{% endhint %}

## API key / authentication

Once validated, you’ll see an **API key** in the Catalyst integration screen. Keep this key **secret** (treat it like a password):

* Do not share it
* Do not commit it to git
* Do not paste it in screenshots / tickets
* Store it in your secret manager or encrypted environment variables

Authenticate every request with the Authorization Bearer header:

```http
Authorization: Bearer YOUR_CATALYST_API_KEY
```

## Base URL

All endpoints are hosted on the API domain:

* `https://api.eventication.com`

Example:

* `https://api.eventication.com/catalyst/memberships`

## Access control per endpoint

Eventication admins can enable/disable access per endpoint in the Catalyst integration settings. If your API key is valid but an endpoint is not allowed, you will receive:

* [HTTP 403](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status/403) with `{ "error": "Access denied" }`

## Pagination

List endpoints are paginated to keep responses fast.

* Query param: `page` (1-based)
* Fixed page size: Dependent on request
* The response includes `meta`:
  * `page`, `per_page`, `next_page`, `prev_page`

Example:

* `GET https://api.eventication.com/catalyst/memberships?page=2`

## Rate limiting

Requests are rate-limited:

* **10** requests per minute
* On limit: [HTTP 429](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status/429) with `{ "error": "Rate limit exceeded" }`

***

## Endpoints

* [Members](/event/general/integrations/catalyst/memberships.md) (`memberships`)

### Planning

* [Jobs](/event/general/integrations/catalyst/work-jobs.md) (`work_jobs`)
* [Shifts](/event/general/integrations/catalyst/work-shifts.md) (`work_shifts`)

### Food and beverages

* [Food and beverages](/event/general/integrations/catalyst/custom-meal-drinks.md) (`custom_meal_drinks`)
* [Selected food and beverages](/event/general/integrations/catalyst/selected-custom-meal-drinks.md) (`selected_custom_meal_drinks`)

### Stock

* [Categories](/event/general/integrations/catalyst/stock-categories.md) (`stock_categories`)
* [Types](/event/general/integrations/catalyst/stock-types.md) (`stock_types`)
* [Articles](/event/general/integrations/catalyst/stock-articles.md) (`stock_items`)
* [Leases](/event/general/integrations/catalyst/stock-leases.md) (`stock_leases`)

***

## Errors & status codes

[401 Unauthorized](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status/401)

* Missing/invalid API key
* Example: `{ "error": "Catalyst not found. Request UUID: ..." }`

[403 Forbidden](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status/403)

* Endpoint access not enabled for this integration
* Example: `{ "error": "Access denied" }`

[429 Too Many Requests](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status/429)

* Rate limit exceeded
* Example: `{ "error": "Rate limit exceeded" }`

***

## Example clients

### cURL

```bash
curl -sS "https://api.eventication.com/catalyst/memberships?page=1" \
  -H "Authorization: Bearer YOUR_CATALYST_API_KEY" \
  -H "Accept: application/json"
```

### Ruby (Net::HTTP)

```ruby
require 'json'
require 'net/http'
require 'uri'

API_KEY = 'YOUR_CATALYST_API_KEY'
BASE_URL = 'https://api.eventication.com'

def get_json(path, page:)
  uri = URI("#{BASE_URL}#{path}?page=#{page}")
  req = Net::HTTP::Get.new(uri)
  req['Authorization'] = "Bearer #{API_KEY}"
  req['Accept'] = 'application/json'

  res = Net::HTTP.start(uri.host, uri.port, use_ssl: true) { |http| http.request(req) }
  raise "HTTP #{res.code}: #{res.body}" unless res.is_a?(Net::HTTPSuccess)

  JSON.parse(res.body)
end

# Fetch all memberships (paginated)
page = 1
loop do
  payload = get_json('/catalyst/memberships', page: page)
  payload.fetch('data').each do |m|
    puts "#{m['id']} #{m['firstname']} #{m['lastname']} <#{m['email_address']}>"
  end

  next_page = payload.dig('meta', 'next_page')
  break if next_page.nil?
  page = next_page
end
```

### JavaScript (fetch)

```javascript
const apiKey = 'YOUR_CATALYST_API_KEY';
const baseUrl = 'https://api.eventication.com';

async function fetchPage(path, page) {
  const res = await fetch(`${baseUrl}${path}?page=${page}`, {
    headers: {
      'Authorization': `Bearer ${apiKey}`,
      'Accept': 'application/json',
    },
  });

  if (!res.ok) throw new Error(`HTTP ${res.status}: ${await res.text()}`);
  return await res.json();
}

let page = 1;
while (true) {
  const payload = await fetchPage('/catalyst/work_jobs', page);
  // payload.data ...
  if (!payload.meta.next_page) break;
  page = payload.meta.next_page;
}
```

### Python (requests)

```python
import requests

api_key = "YOUR_CATALYST_API_KEY"
base_url = "https://api.eventication.com"

page = 1
while True:
  r = requests.get(
    f"{base_url}/catalyst/work_shifts",
    params={"page": page},
    headers={"Authorization": f"Bearer {api_key}", "Accept": "application/json"},
    timeout=30,
  )
  r.raise_for_status()
  payload = r.json()

  for row in payload["data"]:
    print(row["id"], row["work_job_id"], row["membership_id"])

  if payload["meta"]["next_page"] is None:
    break
  page = payload["meta"]["next_page"]
```

{% hint style="info" %}
This API is a work in progress BETA and might change over time.
{% endhint %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.eventication.com/event/general/integrations/catalyst.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
