API reference
The Reloadify API is a REST API over your shop's marketing data: profiles, products, orders, shopping carts, and more. It accepts and returns JSON, uses standard HTTP verbs and status codes, and authenticates with OAuth2.
Almost every resource is scoped to a language (a store/market). You'll list your languages first, then use a language_id in the path of every other call.
# Language-scoped
/v2/languages
/v2/languages/{language_id}/profiles
/v2/languages/{language_id}/products
/v2/languages/{language_id}/orders
/v2/languages/{language_id}/shopping_carts
/v2/languages/{language_id}/categories · brands · variants · reviews
# Account-level
/v2/custom_attributes
/v2/batch_jobs/{batch_id}
Authentication
The API uses the OAuth2 client-credentials flow. Exchange your client id and secret for an access token at the token endpoint, then send it as a Bearer token on every request.
Create credentials in your Reloadify account. Tokens are short-lived — request a new one when it expires (HTTP 401).
curl -X POST https://app.reloadify.com/oauth/token \
-H "Content-Type: application/json" \
-d '{
"grant_type": "client_credentials",
"client_id": "YOUR_CLIENT_ID",
"client_secret": "YOUR_CLIENT_SECRET"
}'
curl https://app.reloadify.com/api/v2/languages \
-H "Authorization: Bearer {access_token}"
Languages & scoping
A language represents one store or market. All catalogue and audience data lives under a language, so every product, profile, and order path begins with /v2/languages/{language_id}/….
Call GET /v2/languages to discover the ids available to your credentials.
curl https://app.reloadify.com/api/v2/languages \
-H "Authorization: Bearer {access_token}"
Pagination & filtering
List endpoints are page-based. Pass page (default 1) and per_page (default 10, max 250). Most lists also accept time filters — created_after, created_before, updated_after, updated_before (ISO 8601 date-time) — to sync only what changed.
Some lists support id/email filters such as emails[]; see each resource for its supported parameters.
curl "https://app.reloadify.com/api/v2/languages/{language_id}/profiles?per_page=250&updated_after=2026-06-01T00:00:00Z" \
-H "Authorization: Bearer {access_token}"
Async batch jobs
For bulk writes, every major resource exposes a POST …/batch_jobs endpoint. It accepts an array of records and returns immediately with a batch_id — the work runs asynchronously.
Poll GET /v2/batch_jobs/{batch_id} for status, success_count, and error_count; once complete, fetch per-record outcomes from GET /v2/batch_jobs/{batch_id}/results.
{
"batch_id": "123",
"status": "…",
"resource_type": "…",
"language_id": "123",
"total_count": "…",
"success_count": "…",
"error_count": "…",
"submitted_at": "…",
"started_at": "…",
"completed_at": "…",
"status_url": "…",
"error_code": "…",
"error_message": "…",
"results_url": "…",
"poll_after_at": "…"
}
Errors
The API uses conventional HTTP status codes. 2xx means success, 4xx indicates a problem with the request (a missing field, an invalid token, or a resource that doesn't exist), and 5xx means something failed on our side.
| Status | Meaning |
|---|---|
| 200 / 201 / 202 | Success. Batch submissions return 202 with a batch_id. |
| 401 | Missing or expired access token — request a new one. |
| 404 | Resource (or language) not found. |
| 422 | Validation failed — the body names the offending field. |
| 429 | Rate limited. Back off and retry. |
| 5xx | Server error — safe to retry with backoff. |
{
"error": "validation_failed",
"message": "email is invalid"
}
Languages
Every resource is scoped to a language (store/market). List your languages first — their ids are used in every other path.
- idstring
- namestring
- codestring
- activestring
- pageinteger · int32
- Page offset to fetch. Default
1. - per_pageinteger · int32
- Number of items to return per page. Maximum value: 250 Default
10.
{
"id": "123",
"name": "Example",
"code": "en",
"active": "…"
}
curl https://app.reloadify.com/api/v2/languages \
-H "Authorization: Bearer {access_token}"
| Method | Path | Description |
|---|---|---|
| GET | /v2/languages | Return a list of languages |
| PUT | /v2/languages | updated Language |
| GET | /v2/languages/{language_id} | Return a language by ID |
| DELETE | /v2/languages/{language_id} |
Profiles
The people in your audience: contact details, consent state, custom attributes, and address.
- custom_attributesstring
- idstring
- activestring
- unsubscribedstring
- emailstring
- subscribed_to_newsletterstring
- subscribed_to_newsletter_atstring
- double_opt_instring
- first_namestring
- middle_namestring
- last_namestring
- genderstring
- company_namestring
- telephonestring
- streetstring
- housenumberstring
- citystring
- provincestring
- zipcodestring
- country_codestring
- tagsstring
- is_registeredstring
- is_companystring
- birthdatestring
- created_afterstring · date-time
- created_beforestring · date-time
- updated_afterstring · date-time
- updated_beforestring · date-time
- pageinteger · int32
- Page offset to fetch. Default
1. - per_pageinteger · int32
- Number of items to return per page. Maximum value: 250 Default
10. - emails[]array
{
"custom_attributes": "…",
"id": "123",
"active": "…",
"unsubscribed": "…",
"email": "profile@example.com",
"subscribed_to_newsletter": "…",
"subscribed_to_newsletter_at": "…",
"double_opt_in": "…",
"first_name": "…",
"middle_name": "…",
"last_name": "…",
"gender": "…",
"company_name": "…",
"telephone": "…",
"street": "…",
"housenumber": "…",
"city": "…",
"province": "…",
"zipcode": "…",
"country_code": "…",
"tags": "…",
"is_registered": "…",
"is_company": "…",
"birthdate": "…"
}
curl https://app.reloadify.com/api/v2/languages/{language_id}/profiles \
-H "Authorization: Bearer {access_token}"
| Method | Path | Description |
|---|---|---|
| GET | /v2/languages/{language_id}/profiles | Return a list of profiles for a language. |
| PUT | /v2/languages/{language_id}/profiles | Create or update a profile by email for a language |
| POST | /v2/languages/{language_id}/profiles/batch_jobs | Submit an async batch of profiles. Returns 202 with batch_id; poll /v2/batch_jobs/:batch_id for status. |
| GET | /v2/languages/{language_id}/profiles/{profile_id} | Find profiles by ID for a language |
| DELETE | /v2/languages/{language_id}/profiles/{profile_id} | |
| GET | /v2/languages/{language_id}/profile_streams | Return a keyset-paginated stream of profiles ordered by id ascending for a language. No total count is computed; use the X-Next-After-Id header (or the Link rel="next" header) to fetch the next page. |
Products
Your catalogue. Products carry variants, categories, brands, and relevant-product links.
- custom_attributesstring
- idstring
- namestring
- visiblestring
- main_imagestring
- urlstring
- pricenumber · double
- short_descriptionstring
- brand_idstring
- category_idsstring
- relevant_product_idsstring
- created_afterstring · date-time
- created_beforestring · date-time
- updated_afterstring · date-time
- updated_beforestring · date-time
- pageinteger · int32
- Page offset to fetch. Default
1. - per_pageinteger · int32
- Number of items to return per page. Maximum value: 250 Default
10.
{
"custom_attributes": "…",
"id": "123",
"name": "Example",
"visible": "…",
"main_image": "…",
"url": "…",
"price": 0,
"short_description": "…",
"brand_id": "123",
"category_ids": "…",
"relevant_product_ids": "…"
}
curl https://app.reloadify.com/api/v2/languages/{language_id}/products \
-H "Authorization: Bearer {access_token}"
| Method | Path | Description |
|---|---|---|
| GET | /v2/languages/{language_id}/products | Return a list of products for a language |
| PUT | /v2/languages/{language_id}/products | Create or update a product for a language |
| POST | /v2/languages/{language_id}/products/batch_jobs | Submit an async batch of products. Returns 202 with batch_id; poll /v2/batch_jobs/:batch_id for status. A referenced brand is created automatically if it does not exist yet, so products can be uploaded before their brands. Each product may embed its variants inline via variants[]. |
| GET | /v2/languages/{language_id}/products/{product_id} | Find a product by ID for a language |
| DELETE | /v2/languages/{language_id}/products/{product_id} | |
| GET | /v2/languages/{language_id}/products/{product_id}/variants | Get a list of variants for a product |
| GET | /v2/languages/{language_id}/products/{product_id}/categories | Get a list of categories for a product |
| PUT | /v2/languages/{language_id}/products/{product_id}/categories/{category_id} | Add a product to a category |
| DELETE | /v2/languages/{language_id}/products/{product_id}/categories/{category_id} | |
| GET | /v2/languages/{language_id}/products/{product_id}/relevant_products | Get a list of relevant products for a product |
| PUT | /v2/languages/{language_id}/products/{product_id}/relevant_products/{relevant_product_id} | Add a relevant product to a product |
| DELETE | /v2/languages/{language_id}/products/{product_id}/relevant_products/{relevant_product_id} |
Variants
Sellable variations of a product (size, colour) with their own SKU, price, and stock.
- custom_attributesstring
- idstring
- product_idstring
- article_codestring
- defaultstring
- titlestring
- eanstring
- main_imagestring
- skustring
- price_coststring
- price_inclstring
- price_exclstring
- old_price_inclstring
- old_price_exclstring
- stock_levelstring
- created_atstring
- updated_atstring
- created_afterstring · date-time
- created_beforestring · date-time
- updated_afterstring · date-time
- updated_beforestring · date-time
- pageinteger · int32
- Page offset to fetch. Default
1. - per_pageinteger · int32
- Number of items to return per page. Maximum value: 250 Default
10.
{
"custom_attributes": "…",
"id": "123",
"product_id": "123",
"article_code": "…",
"default": "…",
"title": "…",
"ean": "…",
"main_image": "…",
"sku": "…",
"price_cost": "…",
"price_incl": "…",
"price_excl": "…",
"old_price_incl": "…",
"old_price_excl": "…",
"stock_level": "…",
"created_at": "…",
"updated_at": "…"
}
curl https://app.reloadify.com/api/v2/languages/{language_id}/variants \
-H "Authorization: Bearer {access_token}"
| Method | Path | Description |
|---|---|---|
| GET | /v2/languages/{language_id}/variants | Return a list of variants for a language |
| PUT | /v2/languages/{language_id}/variants | Create or update a variant for a language |
| POST | /v2/languages/{language_id}/variants/batch_jobs | Submit an async batch of variants. Returns 202 with batch_id; poll /v2/batch_jobs/:batch_id for status. A referenced product is created automatically if it does not exist yet, so variants can be uploaded before their products. |
| GET | /v2/languages/{language_id}/variants/{variant_id} | Find a variant by ID for a language |
| DELETE | /v2/languages/{language_id}/variants/{variant_id} |
Categories
Category tree for the catalogue; products can belong to many categories.
- custom_attributesstring
- idstring
- parent_category_idstring
- product_idsstring
- namestring
- urlstring
- created_atstring
- updated_atstring
- created_afterstring · date-time
- created_beforestring · date-time
- updated_afterstring · date-time
- updated_beforestring · date-time
- pageinteger · int32
- Page offset to fetch. Default
1. - per_pageinteger · int32
- Number of items to return per page. Maximum value: 250 Default
10.
{
"custom_attributes": "…",
"id": "123",
"parent_category_id": "123",
"product_ids": "…",
"name": "Example",
"url": "…",
"created_at": "…",
"updated_at": "…"
}
curl https://app.reloadify.com/api/v2/languages/{language_id}/categories \
-H "Authorization: Bearer {access_token}"
| Method | Path | Description |
|---|---|---|
| GET | /v2/languages/{language_id}/categories | Return a list of categories for a language |
| PUT | /v2/languages/{language_id}/categories | Create or update a category for a language |
| POST | /v2/languages/{language_id}/categories/batch_jobs | Submit an async batch of categories. Returns 202 with batch_id; poll /v2/batch_jobs/:batch_id for status. A referenced parent category is created automatically if it does not exist yet, so categories can be uploaded in any order. |
| GET | /v2/languages/{language_id}/categories/{category_id} | Find a category by ID for a language |
| DELETE | /v2/languages/{language_id}/categories/{category_id} | |
| GET | /v2/languages/{language_id}/categories/{category_id}/products | Get a list of products for a category |
Brands
Brands attached to products; list a brand’s products via its sub-resource.
- custom_attributesstring
- idstring
- product_idsstring
- namestring
- urlstring
- contentstring
- created_atstring
- updated_atstring
- created_afterstring · date-time
- created_beforestring · date-time
- updated_afterstring · date-time
- updated_beforestring · date-time
- pageinteger · int32
- Page offset to fetch. Default
1. - per_pageinteger · int32
- Number of items to return per page. Maximum value: 250 Default
10.
{
"custom_attributes": "…",
"id": "123",
"product_ids": "…",
"name": "Example",
"url": "…",
"content": "…",
"created_at": "…",
"updated_at": "…"
}
curl https://app.reloadify.com/api/v2/languages/{language_id}/brands \
-H "Authorization: Bearer {access_token}"
| Method | Path | Description |
|---|---|---|
| GET | /v2/languages/{language_id}/brands | Return a list of brands for a language |
| PUT | /v2/languages/{language_id}/brands | Create or update a brand for a language |
| POST | /v2/languages/{language_id}/brands/batch_jobs | Submit an async batch of brands. Returns 202 with batch_id; poll /v2/batch_jobs/:batch_id for status. |
| GET | /v2/languages/{language_id}/brands/{brand_id} | Find a brand by ID for a language |
| DELETE | /v2/languages/{language_id}/brands/{brand_id} | |
| GET | /v2/languages/{language_id}/brands/{brand_id}/products | Get a list of products for a brand |
Orders
Completed orders and their line items, used for segmentation and revenue.
- custom_attributesstring
- idstring
- ordered_atstring
- profile_idstring
- product_idsstring
- currencystring
- created_atstring
- checkout_idstring
- numberstring
- pricenumber · double
- statusstring
- refunded_atstring
- total_refundednumber · double
- discount_codestring
- is_discount_appliedstring
- paidstring
- created_afterstring · date-time
- created_beforestring · date-time
- updated_afterstring · date-time
- updated_beforestring · date-time
- pageinteger · int32
- Page offset to fetch. Default
1. - per_pageinteger · int32
- Number of items to return per page. Maximum value: 250 Default
10.
{
"custom_attributes": "…",
"id": "123",
"ordered_at": "…",
"profile_id": "123",
"product_ids": "…",
"currency": "…",
"created_at": "…",
"checkout_id": "123",
"number": "…",
"price": 0,
"status": "…",
"refunded_at": "…",
"total_refunded": 0,
"discount_code": "…",
"is_discount_applied": "…",
"paid": "…"
}
curl https://app.reloadify.com/api/v2/languages/{language_id}/orders \
-H "Authorization: Bearer {access_token}"
| Method | Path | Description |
|---|---|---|
| GET | /v2/languages/{language_id}/orders | Return a list of orders for a language |
| PUT | /v2/languages/{language_id}/orders | Create or update an order for a language |
| POST | /v2/languages/{language_id}/orders/batch_jobs | Submit an async batch of orders. Returns 202 with batch_id; poll /v2/batch_jobs/:batch_id for status. A referenced profile is auto-created as a stub if it does not exist yet (platform_id only, no email); update the profile separately via /v2/profiles to fill in attributes. Each order may embed its line items inline via order_products[]. |
| GET | /v2/languages/{language_id}/orders/{order_id} | Find an order by ID for a language |
| DELETE | /v2/languages/{language_id}/orders/{order_id} | |
| GET | /v2/languages/{language_id}/orders/{order_id}/products | List all products for an order |
| PUT | /v2/languages/{language_id}/orders/{order_id}/products/{product_id} | Add a product to an order |
| DELETE | /v2/languages/{language_id}/orders/{order_id}/products/{product_id} | Remove a product from an order |
Order Products
Bulk-only association of products to orders (async batch).
- custom_attributesstring
- order_idstring
- product_idstring
- variant_idstring
- quantitystring
- quantity_refundedstring
- total_refundednumber · double
{
"custom_attributes": "…",
"order_id": "123",
"product_id": "123",
"variant_id": "123",
"quantity": "…",
"quantity_refunded": "…",
"total_refunded": 0
}
| Method | Path | Description |
|---|---|---|
| POST | /v2/languages/{language_id}/order_products/batch_jobs | Submit an async batch of order_products. Returns 202 with batch_id; poll /v2/batch_jobs/:batch_id for status. Referenced orders, products and variants are created automatically as stubs if they do not exist yet, so order_products can be uploaded before those resources. A stubbed order carries no profile and is enriched later when the full order is submitted via the orders endpoint (both paths reconcile on the same order id). |
Shopping Carts
Live and abandoned carts with their line items — the trigger for cart flows.
- custom_attributesstring
- idstring
- profile_idstring
- product_idsstring
- currencystring
- pricestring
- recovery_urlstring
- recovery_tokenstring
- deletedstring
- created_atstring
- updated_atstring
- created_afterstring · date-time
- created_beforestring · date-time
- updated_afterstring · date-time
- updated_beforestring · date-time
- pageinteger · int32
- Page offset to fetch. Default
1. - per_pageinteger · int32
- Number of items to return per page. Maximum value: 250 Default
10.
{
"custom_attributes": "…",
"id": "123",
"profile_id": "123",
"product_ids": "…",
"currency": "…",
"price": "…",
"recovery_url": "…",
"recovery_token": "…",
"deleted": "…",
"created_at": "…",
"updated_at": "…"
}
curl https://app.reloadify.com/api/v2/languages/{language_id}/shopping_carts \
-H "Authorization: Bearer {access_token}"
| Method | Path | Description |
|---|---|---|
| GET | /v2/languages/{language_id}/shopping_carts | Return a list of shopping carts for a language |
| PUT | /v2/languages/{language_id}/shopping_carts | Create or update a shopping cart for a language |
| POST | /v2/languages/{language_id}/shopping_carts/batch_jobs | Submit an async batch of shopping carts. Returns 202 with batch_id; poll /v2/batch_jobs/:batch_id for status. A referenced profile is auto-created as a stub if it does not exist yet (platform_id only, no email); update the profile separately via /v2/profiles to fill in attributes. Each cart may embed its products inline via products[]. |
| GET | /v2/languages/{language_id}/shopping_carts/{shopping_cart_id} | Find a shopping cart by ID for a language |
| DELETE | /v2/languages/{language_id}/shopping_carts/{shopping_cart_id} | |
| GET | /v2/languages/{language_id}/shopping_carts/{shopping_cart_id}/products | List all products for a shopping cart |
| PUT | /v2/languages/{language_id}/shopping_carts/{shopping_cart_id}/products/{product_id} | Add a product to a shopping cart |
| DELETE | /v2/languages/{language_id}/shopping_carts/{shopping_cart_id}/products/{product_id} |
Reviews
Customer product reviews.
- custom_attributesstring
- idstring
- product_idstring
- profile_idstring
- descriptionstring
- namestring
- visiblestring
- scorestring
- created_atstring
- updated_atstring
- created_afterstring · date-time
- created_beforestring · date-time
- updated_afterstring · date-time
- updated_beforestring · date-time
- pageinteger · int32
- Page offset to fetch. Default
1. - per_pageinteger · int32
- Number of items to return per page. Maximum value: 250 Default
10.
{
"custom_attributes": "…",
"id": "123",
"product_id": "123",
"profile_id": "123",
"description": "…",
"name": "Example",
"visible": "…",
"score": "…",
"created_at": "…",
"updated_at": "…"
}
curl https://app.reloadify.com/api/v2/languages/{language_id}/reviews \
-H "Authorization: Bearer {access_token}"
| Method | Path | Description |
|---|---|---|
| GET | /v2/languages/{language_id}/reviews | Return a list of reviews for a language |
| PUT | /v2/languages/{language_id}/reviews | Create or update a review for a language |
| POST | /v2/languages/{language_id}/reviews/batch_jobs | Submit an async batch of reviews. Returns 202 with batch_id; poll /v2/batch_jobs/:batch_id for status. Referenced products and profiles are auto-created as stubs if they do not exist yet (platform_id only); update them separately to fill in attributes. |
| GET | /v2/languages/{language_id}/reviews/{review_id} | Find a review by ID for a language |
| DELETE | /v2/languages/{language_id}/reviews/{review_id} |
Purchase Events
Purchase signals used to drive flows and recommendations (write-only / batch).
| Method | Path | Description |
|---|---|---|
| PUT | /v2/languages/{language_id}/purchase_events | Create a server-side purchase event |
| POST | /v2/languages/{language_id}/purchase_events/batch_jobs | Submit an async batch of purchase events. Returns 202 with batch_id; poll /v2/batch_jobs/:batch_id for status. The referenced profile and visitor must already exist: items referencing an unknown profile_id or visitor_token are returned as errors in the results. |
Global Unsubscribes
Email addresses unsubscribed across every list for a language.
- profile_emailstring
- profile_idstring
- created_atstring
- updated_atstring
- created_afterstring · date-time
- created_beforestring · date-time
- updated_afterstring · date-time
- updated_beforestring · date-time
- pageinteger · int32
- Page offset to fetch. Default
1. - per_pageinteger · int32
- Number of items to return per page. Maximum value: 250 Default
10.
{
"profile_email": "…",
"profile_id": "123",
"created_at": "…",
"updated_at": "…"
}
curl https://app.reloadify.com/api/v2/languages/{language_id}/global_unsubscribes \
-H "Authorization: Bearer {access_token}"
| Method | Path | Description |
|---|---|---|
| GET | /v2/languages/{language_id}/global_unsubscribes | Return a list of global unsubscribes |
| PUT | /v2/languages/{language_id}/global_unsubscribes | Create a global unsubscription |
Custom Attributes
Definitions of the custom profile attributes available on your account (not language-scoped).
- namestring
- handlestring
- descriptionstring
- datatypestring
- resourcestring
- pageinteger · int32
- Page offset to fetch. Default
1. - per_pageinteger · int32
- Number of items to return per page. Maximum value: 250 Default
10.
{
"name": "Example",
"handle": "…",
"description": "…",
"datatype": "…",
"resource": "…"
}
curl https://app.reloadify.com/api/v2/custom_attributes \
-H "Authorization: Bearer {access_token}"
| Method | Path | Description |
|---|---|---|
| GET | /v2/custom_attributes | Return a list of custom attributes |
| PUT | /v2/custom_attributes | updated CustomAttribute |
| POST | /v2/custom_attributes/batch_jobs | Submit an async batch of custom attributes. Returns 202 with batch_id; poll /v2/batch_jobs/:batch_id for status. |
Batch Jobs
Status and results of the async batch jobs submitted via any `…/batch_jobs` endpoint.
- batch_idstring
- statusstring
- resource_typestring
- language_idstring
- total_countstring
- success_countstring
- error_countstring
- submitted_atstring
- started_atstring
- completed_atstring
- status_urlstring
- error_codestring
- error_messagestring
- results_urlstring
- poll_after_atstring
- pageinteger · int32
- Page offset to fetch. Default
1. - per_pageinteger · int32
- Number of items to return per page. Maximum value: 250 Default
10.
{
"batch_id": "123",
"status": "…",
"resource_type": "…",
"language_id": "123",
"total_count": "…",
"success_count": "…",
"error_count": "…",
"submitted_at": "…",
"started_at": "…",
"completed_at": "…",
"status_url": "…",
"error_code": "…",
"error_message": "…",
"results_url": "…",
"poll_after_at": "…"
}
curl https://app.reloadify.com/api/v2/batch_jobs/{batch_id}/results \
-H "Authorization: Bearer {access_token}"
| Method | Path | Description |
|---|---|---|
| GET | /v2/batch_jobs/{batch_id} | Show batch job status |
| GET | /v2/batch_jobs/{batch_id}/results | List per-item results for a completed batch job |