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
Filter by single email:
?filter[email][email protected]Filter by multiple emails:
?filter[email][email protected],[email protected]Filter by ID:
?filter[id]=123Filter by multiple IDs:
?filter[id]=123,456,789
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}.
Learn more about working with webhooks in OfferLab.
