> ## Documentation Index
> Fetch the complete documentation index at: https://loops.so/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# API Introduction

> Use the Loops REST API to manage contacts, campaigns, email content, themes, and workflows, and to send events and transactional email. Learn authentication, rate limits, and request/response examples.

The Loops API lets you manage [contacts](#contacts), send [events](#events) and [transactional email](#transactional-emails), and create and manage [campaigns](#campaigns), [email content](#email-messages), [themes](#themes), and [workflows](#workflows).

Prefer a no-code or low-code setup? Use our [integrations](https://loops.so/docs/integrations.md) (like [Zapier](https://loops.so/docs/integrations/zapier.md) or [Make](https://loops.so/docs/integrations/make.md)), or trigger workflows using [incoming webhooks](https://loops.so/docs/integrations/incoming-webhooks.md).

> [!TIP]
>
> To manage Loops with an AI agent, [use the MCP server](https://loops.so/docs/mcp-server.md), or install the [Loops CLI and agent skills](https://loops.so/docs/quickstart-agents.md) for coding agents like Claude Code, Codex, Cursor, and OpenCode.

## Authentication

> [!WARNING]
>
> Your Loops API key should never be used client side or exposed to your end
> users.

> [accordion] Authentication Steps
>
> To get started, you'll need an API key. Go to [Settings -> API](https://app.loops.so/settings?page=api) in Loops and click **Generate key**.
>
> ![Generate API key button in Loops settings](https://mintcdn.com/loops/Vqx-auiVy74YQr9S/images/authentication-1.png?fit=max\&auto=format\&n=Vqx-auiVy74YQr9S\&q=85\&s=d1f3115197ec809cb8713e2ea57ef03f)
>
> This creates an API key. You can assign it a human-readable name:
>
> ![API key name field when creating a key](https://mintcdn.com/loops/Vqx-auiVy74YQr9S/images/authentication-2.png?fit=max\&auto=format\&n=Vqx-auiVy74YQr9S\&q=85\&s=7bdd41a72e81e88aecc6c242049e5bd0)
>
> We suggest using a different API key for different purposes. You can revoke an API key at any time with the trash icon.
>
> When making an API call, add an Authorization header and set the API key as a Bearer token:
>
> ![Example API request showing Authorization Bearer header](https://mintcdn.com/loops/Vqx-auiVy74YQr9S/images/authentication-3.png?fit=max\&auto=format\&n=Vqx-auiVy74YQr9S\&q=85\&s=89b339ef97fd1f1d54a11f4be52e4455)
>
> You can test your API key by making a `GET` request to
>
> ```
> https://app.loops.so/api/v1/api-key
> ```
>
> If successful, you will receive the following response:
>
> ```
> {
>   "success": true,
>   "teamName": "Company name"
> }
> ```
>
> Here's an example cURL request (replace `d2d561f5ff80136f69b4b5a31b9fb3c9` with your own API key):
>
> ```bash theme={"dark"}
> curl https://app.loops.so/api/v1/api-key -H "Accept: application/json" -H "Authorization: Bearer d2d561f5ff80136f69b4b5a31b9fb3c9"
> ```

## API Reference

The base URL for the API is `https://app.loops.so/api`

### API key

Test your API key.

> [card] [Test API key](https://loops.so/docs/api-reference/api-key.md)

### Audience segments

View audience segments for campaign targeting.

> [card] [Get audience segment](https://loops.so/docs/api-reference/get-audience-segment.md)

> [card] [List audience segments](https://loops.so/docs/api-reference/list-audience-segments.md)

> [card] [Create audience segment](https://loops.so/docs/api-reference/create-audience-segment.md)

### Campaign groups

Organize campaigns into groups.

> [card] [Create campaign group](https://loops.so/docs/api-reference/create-campaign-group.md)

> [card] [Update campaign group](https://loops.so/docs/api-reference/update-campaign-group.md)

> [card] [Get campaign group](https://loops.so/docs/api-reference/get-campaign-group.md)

> [card] [List campaign groups](https://loops.so/docs/api-reference/list-campaign-groups.md)

### Campaigns

Create and manage campaigns.

> [card] [Create campaign](https://loops.so/docs/api-reference/create-campaign.md)

> [card] [Update campaign](https://loops.so/docs/api-reference/update-campaign.md)

> [card] [Get campaign](https://loops.so/docs/api-reference/get-campaign.md)

> [card] [Get campaign metrics](https://loops.so/docs/api-reference/get-campaign-metrics.md)

> [card] [List campaigns](https://loops.so/docs/api-reference/list-campaigns.md)

### Configuration

View configuration settings.

> [card] [List dedicated sending IP addresses](https://loops.so/docs/api-reference/dedicated-sending-ips.md)

### Contact properties

Manage contact properties.

> [card] [Create contact property](https://loops.so/docs/api-reference/create-contact-property.md)

> [card] [List contact properties](https://loops.so/docs/api-reference/list-contact-properties.md)

### Contacts

Manage contacts.

> [card] [Create contact](https://loops.so/docs/api-reference/create-contact.md)

> [card] [Update contact](https://loops.so/docs/api-reference/update-contact.md)

> [card] [Find contact](https://loops.so/docs/api-reference/find-contact.md)

> [card] [Delete contact](https://loops.so/docs/api-reference/delete-contact.md)

> [card] [Check contact suppression status](https://loops.so/docs/api-reference/check-contact-suppression.md)

> [card] [Remove suppression for a contact](https://loops.so/docs/api-reference/remove-contact-suppression.md)

### Components

Reusable components for your emails.

> [card] [Create component](https://loops.so/docs/api-reference/create-component.md)

> [card] [Update component](https://loops.so/docs/api-reference/update-component.md)

> [card] [Get component](https://loops.so/docs/api-reference/get-component.md)

> [card] [List components](https://loops.so/docs/api-reference/list-components.md)

### Email messages

Manage the content of campaigns and transactional emails.

> [card] [Update email message](https://loops.so/docs/api-reference/update-email-message.md)

> [card] [Get email message](https://loops.so/docs/api-reference/get-email-message.md)

> [card] [Send a preview email message](https://loops.so/docs/api-reference/preview-email-message.md)

> [card] [Run Guardian checks](https://loops.so/docs/api-reference/run-guardian-checks.md)

### Event patterns

View workflow event patterns.

> [card] [List event patterns](https://loops.so/docs/api-reference/list-event-patterns.md)

> [card] [Get event pattern](https://loops.so/docs/api-reference/get-event-pattern.md)

> [card] [Get event pattern by name](https://loops.so/docs/api-reference/get-event-pattern-by-name.md)

### Events

Send events to trigger workflows.

> [card] [Send event](https://loops.so/docs/api-reference/send-event.md)

### Mailing lists

View your mailing lists.

> [card] [List mailing lists](https://loops.so/docs/api-reference/list-mailing-lists.md)

### Themes

Retrieve email themes.

> [card] [Create theme](https://loops.so/docs/api-reference/create-theme.md)

> [card] [Update theme](https://loops.so/docs/api-reference/update-theme.md)

> [card] [Get theme](https://loops.so/docs/api-reference/get-theme.md)

> [card] [List themes](https://loops.so/docs/api-reference/list-themes.md)

### Transactional emails

Create, manage and send transactional emails.

> [card] [Send transactional email](https://loops.so/docs/api-reference/send-transactional-email.md)

> [card] [Create transactional email](https://loops.so/docs/api-reference/create-transactional-email.md)

> [card] [Update transactional email](https://loops.so/docs/api-reference/update-transactional-email.md)

> [card] [Ensure transactional email has draft](https://loops.so/docs/api-reference/ensure-transactional-draft.md)

> [card] [Publish transactional email](https://loops.so/docs/api-reference/publish-transactional-email.md)

> [card] [Get transactional email](https://loops.so/docs/api-reference/get-transactional-email.md)

> [card] [Get transactional email metrics](https://loops.so/docs/api-reference/get-transactional-email-metrics.md)

> [card] [List transactional emails](https://loops.so/docs/api-reference/list-transactional-emails.md)

### Transactional groups

Organize transactional emails into groups.

> [card] [Create transactional group](https://loops.so/docs/api-reference/create-transactional-group.md)

> [card] [Update transactional group](https://loops.so/docs/api-reference/update-transactional-group.md)

> [card] [Get transactional group](https://loops.so/docs/api-reference/get-transactional-group.md)

> [card] [List transactional groups](https://loops.so/docs/api-reference/list-transactional-groups.md)

### Uploads

Upload images for email messages.

> [card] [Create upload](https://loops.so/docs/api-reference/create-upload.md)

> [card] [Complete upload](https://loops.so/docs/api-reference/complete-upload.md)

### Workflow nodes

View and mutate workflow nodes.

> [card] [Create workflow node](https://loops.so/docs/api-reference/create-workflow-node.md)

> [card] [Add a branch](https://loops.so/docs/api-reference/add-workflow-branch.md)

> [card] [Update workflow node](https://loops.so/docs/api-reference/update-workflow-node.md)

> [card] [Get workflow node](https://loops.so/docs/api-reference/get-workflow-node.md)

> [card] [Get workflow node metrics](https://loops.so/docs/api-reference/get-workflow-node-metrics.md)

> [card] [Delete workflow node](https://loops.so/docs/api-reference/delete-workflow-node.md)

> [card] [Delete workflow nodes recursively](https://loops.so/docs/api-reference/delete-workflow-nodes.md)

### Workflows

View and manage workflows.

> [card] [Create workflow](https://loops.so/docs/api-reference/create-workflow.md)

> [card] [Update workflow](https://loops.so/docs/api-reference/update-workflow.md)

> [card] [Get workflow](https://loops.so/docs/api-reference/get-workflow.md)

> [card] [List workflows](https://loops.so/docs/api-reference/list-workflows.md)

> [card] [Change workflow mailing list](https://loops.so/docs/api-reference/change-workflow-mailing-list.md)

## Rate Limiting

To ensure the quality of service for all users, our API is rate limited. This means there's a limit to the number of requests your application can make to our API in a certain time frame.

The baseline rate limit is **10 requests per second per team**.

For the content API, the baseline rate limit is **60 requests per 60 seconds per team**. This applies to `/v1/campaigns/*`, `/v1/campaign-groups/*`, `/v1/components/*`, `/v1/email-messages/*`, `/v1/themes/*`, `/v1/transactional-emails/*`, `/v1/transactional-groups/*`, `/v1/uploads/*`, and `/v1/workflows/*` endpoints.

> [accordion] Rate Limiting Details
>
> To see your current usage, we provide the following response headers in every API response:
>
> * `x-ratelimit-limit`: The maximum number of requests you can make per second.
> * `x-ratelimit-remaining`: The number of requests remaining in the current rate limit window.
>
> Here is an example of a successful response with rate limit headers:
>
> ![Example API response showing rate limit headers](https://mintcdn.com/loops/Vqx-auiVy74YQr9S/images/api-successful-response.png?fit=max\&auto=format\&n=Vqx-auiVy74YQr9S\&q=85\&s=e5a91eaa1ae89d9938439b0ec9fa2c19)
>
> If you exceed this limit, you'll receive a response with HTTP status `429 Too Many Requests`. Here is an example of a failed response with rate limit headers:
>
> ![Example 429 rate limit response with headers](https://mintcdn.com/loops/Vqx-auiVy74YQr9S/images/api-rate-limited.png?fit=max\&auto=format\&n=Vqx-auiVy74YQr9S\&q=85\&s=9008b344cb25eab08a74e1df468b72e4)
>
> It's important to handle these 429 responses in your application. We recommend implementing retries with an exponential backoff strategy.
>
> If your use case requires a higher limit, please [contact support](https://app.loops.so/settings?page=support) and we'll be happy to discuss your needs.

## Debugging

Sometimes things go wrong. Here are some tips to help you debug your API requests.

> [accordion] Debugging Steps
>
> If you are having trouble with the API, we recommend using a tool like [Postman](https://www.postman.com/) to test your requests.
>
> ### Handling CORS errors
>
> The Loops API does not support cross-origin requests made from client-side JavaScript. To avoid CORS errors, make sure to issue your requests from a server-side application.
>
> ### Dealing with `401 Unauthorized` "Invalid API key" errors
>
> Make sure you have generated an API key from [Settings -> API](https://app.loops.so/settings?page=api) and that you are including it in your requests.
>
> Your API key should be included in the "Authorization" header of your request, following the format `Authorization: Bearer YOUR_API_KEY`.
>
> ### Handling rate limiting (`429` Responses)
>
> The Loops API allows a maximum of 10 requests per second per team. If you receive a `429 Too Many Requests` response, this means you have exceeded this limit.
>
> The `x-ratelimit-limit` and `x-ratelimit-remaining` headers in the response can provide information about your current rate limit usage.
>
> ### Handling other `400`-level Responses
>
> `400`-level responses typically indicate that there was a problem with the request. The response body will contain more information about what went wrong, so be sure to check it for details.
>
> Check your request type (GET, POST, PUT, DELETE) and ensure that you are using the correct one for the endpoint you are trying to access.
>
> ### `Some body key or value is longer than allowable`
>
> If you receive this error, it means that a value in the request body is too long. We support a maximum of 500 characters for each value, including the opening and closing quotes. Please reduce the length of the values in your request and try again.
>
> ***
>
> If you have followed these steps and are still experiencing issues, don't hesitate to [reach out to the Loops team](https://app.loops.so/settings?page=support) for further assistance.

## OpenAPI spec

Get started quickly with the Loops API using our OpenAPI documents.

You can import these documents into an API client like Postman or Insomnia to see and use all of our endpoints, with example requests and expected responses.

* **YAML:** [app.loops.so/openapi.yaml](https://app.loops.so/openapi.yaml)
* **JSON:** [app.loops.so/openapi.json](https://app.loops.so/openapi.json)

## SDKs

SDKs are software packages built on top of the API, making it easier to integrate into your project.

> [card] [Go](https://loops.so/docs/sdks/go.md)
>
> The official Go SDK for Loops.

> [card] [JavaScript](https://loops.so/docs/sdks/javascript.md)
>
> The official JavaScript/TypeScript SDK for Loops.

> [card] [Nuxt](https://loops.so/docs/sdks/nuxt.md)
>
> The official Nuxt module for Loops.

> [card] [PHP](https://loops.so/docs/sdks/php.md)
>
> The official PHP SDK for Loops.

> [card] [Ruby](https://loops.so/docs/sdks/ruby.md)
>
> The official Ruby SDK for Loops.

### Unofficial SDKs

The following SDKs are community-submitted and have not been officially reviewed or endorsed by Loops. We recommend thoroughly testing and reviewing the code before integrating it into your project.

* [Laravel](https://github.com/plutolinks/laravel-loops) by PlutoLinks
* [PHP](https://github.com/plutolinks/loops-php) by PlutoLinks
* [Ruby on Rails](https://github.com/danielfriis/loops_rails) by Daniel Friis

[Submit an SDK](mailto:dan@loops.so)


## Related topics

- [API key](https://loops.so/docs/api-reference/api-key.md)
- [API Changelog](https://loops.so/docs/api-reference/changelog.md)
- [API Examples](https://loops.so/docs/api-reference/examples.md)
- [Bubble API Connector](https://loops.so/docs/guides/bubble-api-connector.md)
- [Campaigns API examples](https://loops.so/docs/api-reference/examples/campaigns.md)
