Skip to main content

OfferLab API Reference (Zapier only)

This is documentation for version 1.0 of the REST API.

Updated over a week ago

Overview

The OfferLab API lets you programmatically interact with everything you manage on OfferLab — from offers and products to orders, teams, commissions, and more. It’s built for creators and sellers who want to automate workflows, power third-party tools, or integrate OfferLab into their existing systems.

This article gives you a high-level walkthrough of the core concepts, authentication model, and the main endpoints available. If you’re looking to connect OfferLab to Zapier, see our Zapier-focused guide.

Who is this for?

  • Sellers who want to sync orders or customers to external tools

  • Creators who want to automate workflows

  • Teams integrating OfferLab with CRMs, ERPs, or fulfillment partners

Core concepts

Teams

  • All API interactions occur within a team.

  • Your authenticated API key is scoped to a specific team.

Offers & products

  • An offer is the bundle you sell.

  • A product is what the customer gets inside the offer.

  • Offers can contain multiple products.

Orders

Orders represent customer purchases. Each order contains:

  • Purchased offers

  • Customer details

  • Shipping information

  • Fulfillment state

  • Commissions generated

Commissions

OfferLab automatically calculates and assigns commissions for creators who promote offers.

Authentication

OAuth 2.0

Our OAuth2.0 integration connects your customers via your platform to OfferLab to provide additional services and features.

📝 Note: For now, API authentication for creators is only supported via Zapier.


REST API

Authorization

OfferLab expects the API token to be included in all API requests to the server in a header that looks like the following:

Include your API token in the Authorization header on every request:

Authorization: Bearer token=YOUR_API_TOKEN

Example:

$ curl 'https://app.offerlab.com/api/v1/orders' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'User-Agent: YourAppYourOrg'

Requests & responses

OfferLab uses standard HTTP status codes to communicate the result of each request.

Code

Name

Description

200

OK

Successful requests, usually GET, PUT, and PATCH calls.

201

Created

Successful request that resulted in the creation of a record (e.g., a POST call).

204

No Content

Successful request that does not have an accompanying response body (e.g., a DELETE call).

4xx

Client Error

Client-related errors that should be usually recoverable on the requesting client side.

400

Bad Request

The request is structured incorrectly, e.g. the body or query params are invalid or incorrectly formatted.

401

Unauthorized

The request could not be authenticated because of either missing or invalid Authorization Bearer token value.

403

Forbidden

The client tries to access a resource for which it does not possess the required permissions.

404

Not Found

The resource for this request is missing.

422

Unprocessable Entity

The request is structurally correct but cannot be processed due to incompatible business logic or restrictions on the resource.

429

Too Many Requests

The API rate limits have been reached.

5xx

Server Error

Unexpected server errors, something went wrong on our side. We will be notified and attempt to fix this as soon as possible but please don't hesitate to contact us if you see this happening

API Reference

Products

List Products

GET https://app.offerlab.com/api/v1/products

curl --request GET \
--url GET https://app.offerlab.com/api/v1/products \
--header 'accept: application/json'
--header 'Authorization: Bearer YOUR_API_TOKEN' \

Response

[
{
"id": 1,
"team_id": 35,
"name": "A T-Shirt",
"tax_code_id": "txcd_99999999",
"integrations_installation_type": "Integrations::ClickFunnelsInstallation",
"integrations_installation_id": 46,
"integrations_external_id": "482907",
"description": "Premium cotton t-shirt with a logo",
"variants_locked_by_integration": true,
"requires_shipping_address": true,
"integration_data": {},
"created_at": "2025-08-21T14:29:35.000Z",
"updated_at": "2025-09-16T14:26:11.000Z"
},
{
"id": 2,
"team_id": 35,
"name": "An Example Product",
"tax_code_id": "txcd_99999999",
"integrations_installation_type": "Integrations::SquareInstallation",
"integrations_installation_id": 14,
"integrations_external_id": "7Z22SYKJ4BMB3FLYLKLFTM3M",
"description": "This is a sample product",
"variants_locked_by_integration": true,
"requires_shipping_address": false,
"integration_data": {},
"created_at": "2025-07-30T15:53:44.000Z",
"updated_at": "2025-10-30T13:11:43.000Z"
}
]

Create Product

POST https://app.offerlab.com/api/v1/products

curl -X POST https://app.offerlab.com/api/v1/products \
--header "Accept: application/json" \
--header "Content-Type: application/json" \
--header "Authorization: Bearer YOUR_API_TOKEN" \
--data '{
"product": {
"name": "Premium Cotton T-Shirt",
"description": "High-quality 100% cotton t-shirt with custom design",
"tax_code_id": "txcd_99999999",
"requires_shipping_address": false
}
}'

Fetch Product

GET https://app.offerlab.com/api/v1/products/{id}

curl -X GET https://app.offerlab.com/api/v1/products/1 \
--header "Accept: application/json" \
--header "Content-Type: application/json" \
--header "Authorization: Bearer YOUR_API_TOKEN"

Update Product

PATCH/PUT https://app.offerlab.com/api/v1/products/{id}

curl -X PATCH https://app.offerlab.com/api/v1/products/1 \
--header "Accept: application/json" \
--header "Content-Type: application/json" \
--header "Authorization: Bearer YOUR_API_TOKEN_HERE" \
--data '{
"product": {
"name": "Premium Cotton T-Shirt - Updated",
"description": "High-quality 100% organic cotton t-shirt with custom design"
}
}'


Order invoices

Fetch Order Invoice

GET https://app.offerlab.com/api/v1/orders/invoices/{id}

Fetches an order invoice by ID or invoice number (e.g., #OL-77847065).

curl -X GET <https://app.offerlab.com/api/v1/orders/invoices/1> \\
--header "Accept: application/json" \\
--header "Content-Type: application/json" \\
--header "Authorization: Bearer YOUR_API_TOKEN_HERE"

Response

Status code: 200

{
"id": 1,
"order_id": 123,
"invoice_number": "OL-77847065",
"stripe_invoice_id": "in_1234567890",
"stripe_charge_id": "ch_1234567890",
"status": "paid",
"status_reason_code": "paid_success",
"currency": "usd",
"total_amount": 10000,
"tax_amount": 0,
"shipping_amount": 0,
"discount_amount": 0,
"subtotal_amount": 10000,
"fee_amount": null,
"memo": null,
"period_start_at": null,
"period_end_at": null,
"completed_at": "2025-01-20T10:00:00.000Z",
"created_at": "2025-01-20T10:00:00.000Z",
"updated_at": "2025-01-20T10:00:00.000Z",
"stripe_data": {},
"line_items": [
{
"id": 1,
"invoice_id": 1,
"unit_amount": 10000,
"currency": "usd",
"quantity": 1,
"description": "Product Name",
"fullfilled_at": null,
"product_id": 1,
"products_variant_id": null,
"created_at": "2025-01-20T10:00:00.000Z",
"updated_at": "2025-01-20T10:00:00.000Z"
}
],
"order": {
"id": 123
}
}

Mark invoice as completed

POST https://app.offerlab.com/api/v1/orders/invoices/{id}

curl -X POST https://app.offerlab.com/api/v1/orders/invoices/1/complete \
--header "Accept: application/json" \
--header "Content-Type: application/json" \
--header "Authorization: Bearer YOUR_API_TOKEN_HERE" \


Customers

List Customers

GET https://app.offerlab.com/api/v1/teams/{team_id}/customers

Returns a list of customers for the specified team. Supports filtering by email and ID.

Filtering

You can filter customers using query parameters in the format filter[attribute]=value. Multiple values can be provided as comma-separated lists.

Available filter parameters

  • filter[email] - Filter by customer email address (supports comma-separated multiple values)

  • filter[id] - Filter by customer ID (supports comma-separated multiple values)

Examples

List all customers:

curl -X GET https://app.offerlab.com/api/v1/teams/35/customers \
--header "Accept: application/json" \
--header "Content-Type: application/json" \
--header "Authorization: Bearer YOUR_API_TOKEN_HERE"

Filter by email:

curl -X GET https://app.offerlab.com/api/v1/teams/35/customers?filter[email][email protected] \
--header "Accept: application/json" \
--header "Content-Type: application/json" \
--header "Authorization: Bearer YOUR_API_TOKEN_HERE"

Filter by multiple IDs:

curl -X GET https://app.offerlab.com/api/v1/teams/35/customers?filter[id]=123,456 \
--header "Accept: application/json" \
--header "Content-Type: application/json" \
--header "Authorization: Bearer YOUR_API_TOKEN_HERE"

Response

Status code: 200

[
{
"id": 1,
"team_id": 35,
"email": "[email protected]",
"name": "Jane Smith",
"person_id": 456,
"phone": "+1234567890",
"stripe_customer_id": "cus_1234567890",
"created_at": "2025-01-20T10:00:00.000Z",
"updated_at": "2025-01-20T10:30:00.000Z"
},
{
"id": 2,
"team_id": 35,
"email": "[email protected]",
"name": "John Doe",
"person_id": 789,
"phone": "+1987654321",
"stripe_customer_id": "cus_0987654321",
"created_at": "2025-01-21T14:15:00.000Z",
"updated_at": "2025-01-21T14:15:00.000Z"
}
]

Fetch Customer

curl -X GET https://app.offerlab.com/api/v1/customers/1 \
--header "Accept: application/json" \
--header "Content-Type: application/json" \
--header "Authorization: Bearer YOUR_API_TOKEN_HERE"

Response

Status code: 200

{
"id": 1,
"team_id": 35,
"email": "[email protected]",
"name": "Jane Smith",
"person_id": 456,
"phone": "+1234567890",
"stripe_customer_id": "cus_1234567890",
"created_at": "2025-01-20T10:00:00.000Z",
"updated_at": "2025-01-20T10:30:00.000Z"
}


Webhooks

OfferLab supports a wide range of webhook events so your systems can respond to real-time activity such as orders, invoices, collaborations, or subscription changes.

All webhook events follow the pattern: {resource}.{action}.

Did this answer your question?