Introduction

Our API makes it possible for anyone to make awesome things for Big Cartel’s massive community of artists, creators and independent businesses. Integrate Big Cartel into an existing application or service, create an add-on to extend our core features, or code something up you’d like in your own shop. Whatever it is, we hope these tools allow you to build something great.

Versioning

The current version of the Big Cartel API is V1, and that version number is specified in all endpoints (e.g. /v1/accounts/123). Updates made to the V1 API will always be backwards-compatible, and listed with a datestamp in our API Changelog.

Status Codes

Our API returns HTTP status codes for every request. Here are some examples of typical responses you can expect to receive:

Code Status
200 Everything worked as expected.
201 Created - a new resource was created.
400 Bad Request - missing or invalid parameters.
401 Unauthorized - invalid API credentials.
402 Request Failed - valid parameters, but the request failed.
404 Not Found - requested item doesn’t exist.
406 Not Acceptable - something is wrong with your request.
5xx Server Error - something is wrong on our end.

If you’re receiving 400 or 406 errors, double check to make sure you’re including the required headers.

Sorting

Many of our APIs support sorting results with the sort parameter where you pass the field name to sort by.

When sorting is supported, you can use the sort_direction parameter with either asc or desc to sort ascending or descending respectively.

Pagination

Requests that return multiple objects will be limited to 20 items by default. The documentation for each endpoint will tell you which objects support pagination, and you can specify further pages using limit and offset inside the page parameter.

Images

Any image URL attribute returned from an endpoint in our API will be include a default size. However, you’d probably like a version optimized for your application. Fortunately, Big Cartel can resize the image in any way you’d like using the w and h query string parameters for width and height respectively.

Rate Limiting

Our API doesn’t currently limit the number of requests in a given time period, but rate limiting will be added in the future.

However, as described in our app best practices, we strongly recommend to use webhooks to know when an update happens instead of polling regularly.

Making API Calls

All of our endpoints begin with the root URL https://api.bigcartel.com, and require a few headers to be sent along with your request.

Required Headers

All requests require an Accept header of application/vnd.api+json. When making a request that includes a JSON body, we also require that you send a Content-type header of application/vnd.api+json.

Identification

You must include a User-Agent header with the name of your application and a contact URL or email where you can be reached. This allows us to warn you if you’re doing something wrong before you get blacklisted, or feature you if you’re doing something awesome. If you don’t supply this header, you will get a 400 Bad Request response.

Submit an application

Want to create an app for Big Cartel sellers that uses our API or Webhooks? We approve a select number of partners and developers to create apps with us to make available to our community of sellers.

Interested in partnering with us? Submit an application and we’ll be in touch.

Already have an app? Make sure you follow our OAuth guide, explore our APIs and Webhooks to learn how to best extend and improve Big Cartel stores.

App requirements

This is a list of requirements your app must follow. We will review this during your initial app review, but also on an ongoing basis. Apps found to not follow these requirements will be removed from our app store. Also please read out app best practices to ensure you are building the best possible experience for our Big Cartel sellers.

  1. Review the API License Agreement: Before starting development, ensure you understand the terms and conditions outlined in the API license agreement to align your app with our policies.
  2. Build help content and workflows: You must build a unique help article for your app integration with Big Cartel to facilitate the success of our mutual customers. It should cover, at minimum, setup and usage, including ways to contact your support team for help.
  3. Design for non-unique emails: Email is not a unique identifier in Big Cartel, which means more than 1 shop can have the same. Your app must be designed with this case in mind. Additionally, while sub-domains and custom domains are unique across accounts, it’s possible for them to be re-used over time by different accounts that are not the same user. You should rely on the account ID for as a unique property.
  4. Don’t make incorrect assumption about the domain: A store’s domain can change over time so you must handle this. The Account’s ID is unique and long-lived so you should key off that and handle domain name changes. A domain can change due to seller’s changing their subdomain on bigcartel.com (eg. shop starts as foo.bigcartel.com then renames to bar.bigcartel.com). Additionally, many stores will transition to a custom domain (e.g. myindieshop.com) or go back and forth.
  5. Handle the deauthorization: When an account deauthorizes your app you’ll be informed via the account.deauthorized webhook. Take appropriate actions such as disconnecting your app, invalidating the OAuth token, and notifying the seller within your UI that they need to re-authorize your app.
  6. Pay attention to Themes and Theme Versions: Our store themes can vary wildly in layout and design, so it is important that you test across a broad array of our themes. Recognize that many shops can have old theme versions, so many not always be on the latest version. Utilize the <meta> tags in stores that tell you which theme name and theme version they are on.
  7. Respect Store Feature Limits: For features with plan-based limits, use the Account API to identify the account’s plan and strictly adhere to the specified limits. For example, if an account is limited to 5 max images per product, do not try to upload more than that. Similarly, if they are entitled to 25 images per product, create the experience and messaging in your app that indciates this limit has not yet been reached if they are sync’ing images.
  8. Handle Plan Changes: Monitor the account.plan.upgraded and account.plan.downgraded webhooks to detect plan changes and adjust your app’s feature set accordingly (e.g., updating max product images).
  9. Collect Marketing Consent Correctly: If your app enables sellers to do marketing communications to customers, you must both (a) honor the customer_opted_in_to_marketing flag in the order object, and (b) have your app setup to collect marketing consent during checkout. Read our (Marketing Apps](#marketing-apps) guidelines.
  10. Include a user agent: Follow our guidelines for not only including a user agent, but also including within it your contact information. See our section on Making API Calls for more details.

App best practices

To help you create an app that integrates well with the Big Cartel platform, please follow these best practices:

  1. Optimize API Calls: Make efficient use of API calls by fetching only the data you need. Avoid unnecessary calls, and cache data where appropriate to reduce the load on our servers.
  2. Use Thoughtful Rate Limiting: Ensure your app has reasonable rate limiting, considering both your needs and our platform’s capacity. Avoid querying the API for all accounts simultaneously or excessively to prevent unnecessary load on the platform.
  3. Test Extensively: Conduct thorough testing, including unit, integration, and stress tests, to ensure your app handles real-world scenarios gracefully.
  4. Monitor Usage and Performance: Regularly monitor the usage of your app and its impact on the Big Cartel platform. Adjust your app based on observed usage patterns to maintain optimal performance.

Following these best practices will ensure your app is efficient, reliable, and respectful of the Big Cartel platform and our sellers. Please ensure you also review and meet our list of requirements for apps.

OAuth

The Big Cartel API uses OAuth 2.0 to provide your application with access to an account without the need for sharing or storing passwords. To do this, you’ll redirect your user to Big Cartel, they’ll login and see a page explaining exactly who wants access and what they’ll have access to. After allowing or denying your request, they’ll be sent back to your site.

Using an OAuth library

Since OAuth is a common and open protocol, there are already a number of projects that make it easy to use without much work on your part.

  1. Grab an OAuth library.
  2. Configure it with your client_id, client_secret, and redirect_uri.
  3. Tell it to use https://my.bigcartel.com/oauth/authorize to request authorization and https://api.bigcartel.com/oauth/token to get access tokens.

That’s it! You can now use your access_token to make API calls.

OAuth from scratch

If you’re the type that likes to have full control over your code, and don’t mind reinventing a wheel now and then, you can create your own OAuth integration.

1. Redirect the user to Big Cartel to request access

To connect your application to a Big Cartel account, redirect them to our authorization page which will prompt them to give you access to their account.

GET https://my.bigcartel.com/oauth/authorize

Parameters

Name Type Required Description
client_id string true Your unique client identifier from your application settings.
response_type string false The only option right now is code.
state string false An arbitrary value, sent back with each response (useful for identifying users on your end).
redirect_uri string false URL where your users are sent after authorization.

2. Big Cartel redirects back to your site

If the user accepts your request, they’ll be redirected to your redirect_uri with a temporary code in a code parameter as well as the state you may have provided in the previous step in a state parameter. If the states don’t match what you expect, the request has been created by a third party and the process should be aborted.

If the user’s account is already connected to your application, they’ll be immediately redirected back to your redirect_uri in the same way as described above, instead of being prompted to allow or deny access.

If the user denies your request, they’ll be redirected to your redirect_uri with the an error parameter containing the appropriate error code.

3. Exchange the temporary code for an access token

You’ll now need to make a request to trade the code you received for an access_token.

POST https://api.bigcartel.com/oauth/token

Parameters

Name Type Required Description
client_id string true Your unique client identifier from your application settings.
client_secret string true Your unique and private client secret from your application settings.
code string true The code parameter you received in the previous step.
redirect_uri string false URL where your users are sent after authorization.

Response

If successful, we’ll return a JSON response in the following format.

{
  "access_token":"YOUR-ACCESS-TOKEN",
  "token_type":"bearer",
  "account_id":12345
}

Using the access token

Now that you’ve obtained an access_token for an account, you’ll need to use it in the Authorization header to make API calls - and remember to include the required headers!

Authorization: Bearer YOUR-ACCESS-TOKEN

Revoking access

To revoke access to an account, send a POST request to our deauthorization endpoint and include the account ID.

This request requires that you use HTTP Basic authentication instead of OAuth - you’ll need to specify your application’s client_id for the username and client_secret for the password. If successful, you’ll receive a 204 No Content response.

OAuth errors

If at any point there are problems or invalid parameters in your request, we’ll send back an error code. Possible errors include:

Name Description
access_denied The user has denied access to their account.
invalid_client_id The client_id you specified is invalid.
invalid_client_secret The client_secret you specified is invalid.
invalid_redirect_uri The redirect_uri you specified is invalid.
invalid_response_type Your request’s response type is invalid.

Personal Projects

If you’d like to make a private integration just for yourself, you can do that without an invite by using HTTP Basic authentication, specifying your store’s subdomain for the username. Again though, this should only be for your own store, never ask anyone for their password!

Note that most endpoints require that you include an account ID when making a request. To find the account ID for your store, just make a request to the Account API and retrieve the id attribute from the response. Make sure to include the required headers in your requests.

GET /v1/accounts

About scripts

An embeddable script is a snippet of client code that is automatically included in a shop when your app is authorized by an account. This feature allows apps to add functionality to shops seamlessly, without requiring sellers to manually copy and paste JavaScript code. It maximizes app adoption, reduces errors, and enhances the user experience for our mutual customers.

Embeddable scripts require template customization on behalf of the accounts. Therefore, only accounts with a paid Big Cartel plan can use apps with embeddable scripts.

A partner app can include one or more scripts, each defined to be included at the end of the <HEAD> or <BODY> sections. When your app is deauthorized for an account, any defined scripts will be immediately disconnected and no longer render in the shop.

While we refer to these as “scripts”, it’s also possible to add other elements such as <DIV> tags which can be helpful for dynamic targeting.

Have you already built an app for Big Cartel and want access to Embeddable Scripts? Fill out our application, so we can get the most up to date information about your app, including your embeddable script details.

Script variables

Embedded scripts can reference variables in their definition and rely on Liquid syntax for inclusion. Variables are scoped globally across your app and are accessible in any of your scripts using the app_variables namespace.

Variables can be any valid JSON type.

Any theme variables defined in the Themes API can also be used with your scripts. Common examples include Store variables such as store.hostname, referenced as {{ store.hostname }}.

In addition to Theme API variables, we offer the embeddable scripts Update App Config API. This API allows you to personalize script variables, even on a per-account basis. It’s useful for variables with values originating outside of Big Cartel, such as configuration data from your end like user IDs or per-user configuration data.

Get app config

Retrieve the configuration for your app associated with a specific shop’s account. We currently only support app script variables in configuration. Responses include details about which variables are referenced by your app scripts and which are unreferenced. This information aids in managing the lifecycle of your scripts, ensuring you know which variables are actively in use.

If an account has not authorized your app you will get a 4xx status code.

Request

GET /v1/accounts/{account-id}/apps/{client-identifier}/config

Parameters

None

Update app config

Variables can be dynamically assigned for a given shop’s embedded script using our App Config API. This API only allows configuration of variables at this time for embedded scripts that have been associated with your app.

All variables are defined via this API can be referenced in your scripts in the app_variables namespace (e.g. {{ app_variable.my_variable }}).

Config requests must always contain the entire list of variables for your app. Any variables that are omitted will be deleted from your app’s configuration.

Request

POST /v1/accounts/{account-id}/apps/{client-identifier}/config

Parameters

Provide name value pairs for each variable and corresponding value for a given account.

Response

If successful, we’ll return a 200 OK status code. Error will return status of 400. If you receive a response with error code invalid-id, ensure you are correctly passing your client identifier as the value of id in the request.

Script best practices

To enhance the integration of your Big Cartel apps with embeddable JavaScript, we recommend adhering to the following best practices. These guidelines are designed to optimize performance, improve security, and ensure a seamless user experience:

  1. Prefer Embeddable Scripts: Always use embeddable scripts instead of requiring sellers to manually insert JavaScript into their shop. This approach not only streamlines the process, increasing adoption rates, but also minimizes errors associated with manual code insertion.
  2. Use Namespaces for your app’s context: Avoid using the global window object directly for storing variables, as this can lead to conflicts with other scripts or the host environment. Instead, create a specific namespace for your app (e.g., window.myApp) to encapsulate all your variables and functions. This practice helps maintain a clean global scope and reduces the risk of naming collisions.
  3. Don’t assume load order: Since a given account can have multiple apps, and embeddable scripts, you should make no assumptions on the load order of scripts within the <head> or <body>.
  4. Leverage our Pages API and JavaScript Variables to Target Your Scripts: Our Pages API provides all pages for a given store, including their paths. Additionally, our JavaScript variables offer access to key data about a shop and its pages. This enables you to build powerful configurations and target your scripts to specific pages using their paths. For example, you can use the store.id JavaScript variable to retrieve the shop’s account ID without making an API call, allowing you to include your JavaScript file as follows: <script async src="https://app.com/script/{{ store.id }}.js"></script>.
  5. Minimize External Dependencies: Only load the libraries and external dependencies that are essential for your app. This reduces load times and decreases potential conflicts with other scripts.
  6. Handle double inclusion of your scripts: It’s possible for sellers to incorrectly double include your script, which is common if you’ve had a pre-existing integration that has upgraded to now using embedded scripts via our API. You must correctly handle these cases, and we recommend notifying your users if this occurs to favor the embeddable script and removing the manual scripts they’ve added.
  7. Utilize Apps API for Account-Specific Data: Leverage our Apps API to manage script variables and app configuration data, such as user-specific settings. Rather than using static identifiers, utilize dynamic identifiers like the seller’s shop hostname, accessible via Liquid syntax ({{ store.hostname }}). For more details, refer to our Script Variables and Theme API variables for more info.
  8. Ensure Asynchronous Loading: Structure your scripts to load asynchronously to prevent blocking the rendering of the page. This practice helps maintain a smooth user experience by allowing the rest of the shop’s content to load uninterrupted.
  9. Adhere to Security Best Practices: Always encode and sanitize any data fetched from external sources to protect against XSS (Cross-Site Scripting) and other security vulnerabilities. Ensure that all data communications are performed over HTTPS.
  10. Comprehensive testing with clear fallbacks: Thoroughly test your scripts in multiple scenarios with different browsers to ensure compatibility and functionality across different user settings. Include fallback mechanisms for scenarios where your script fails to load or encounters an error. This ensures that the shop remains functional and provides continuity in user experience.

Account

Accounts are the primary resource of our API. These represent the shops on Big Cartel, and contain the core information and settings.

Account object

Attribute Type Description
id integer The unique identifier for the account.
subdomain string The unique subdomain for the account on .bigcartel.com.
store_name string The name of the shop.
description string A brief description of their shop.
contact_email string The email address the shop can be contacted at.
first_name string The shop owner’s first name.
last_name string The shop owner’s last name.
url string The URL of the online store, either using a custom domain or the default .bigcartel.com one.
website string The URL of a external website the account may have, separate from Big Cartel.
created_at timestamp When the account was created.
updated_at timestamp When the account was last updated.
under_maintenance boolean Whether or not the account is in maintenance mode.
inventory_enabled boolean Whether or not inventory tracking is enabled.
artists_enabled boolean Whether or not artist categories is enabled.
currency.id string The unique 3-letter code for the account’s currency.
currency.name string The name of the account’s currency.
currency.sign string The symbol used for the account’s currency.
currency.locale string The locale associated with the account’s currency.
country.id string The unique 2-letter code for the account’s country.
country.name string The name of the account’s country.
account_image.id integer The unique identifier for the account’s image.
account_image.url string The customizable URL of the account’s image.
plan.id string The unique identifier for the account’s plan. Possible values are gold, platinum, diamond, or titanium.
plan.name string The name of the account’s plan.
plan.max_products integer The maximum number of products the account can have on their plan.
plan.max_images_per_product integer The maximum number of images per product the account can have on their plan.
plan.monthly_rate decimal The rate the account is billed each month.
time_zone string The timezone of the account.

Get an account

Get the basic account information.

Request

GET /v1/accounts/{account-id}

Parameters

None.

Artists

Artists represent a list of all artist categories in a store, used for grouping products together (similar to Categories).

Artist object

Attribute Type Description
id string The unique identifier for the artist.
name string The name of the artist.
permalink string The unique permalink for the artist.
position string The position in which the artist is arranged.

Get all artists

Get all artists for an account.

Request

GET /v1/accounts/{account-id}/artists

Parameters

None.

Get an artist

Get a specific artist for an account.

Request

GET /v1/accounts/{account-id}/artists/{artist-id}

Parameters

None.

Create an artist

Creates a new artist.

Request

POST /v1/accounts/{account-id}/artists

Parameters

Name Type Required Description
type string true The only option right now is artists.
name string true The name of the artist.

Response

If successful, we’ll return a 201 Created with the location of the new artist in the Location header and the same body as getting the artist.

Update an artist

Updates a specific artist’s details.

Request

PATCH /v1/accounts/{account-id}/artists/{artist-id}

Parameters

Name Type Required Description
id string true The unique identifier for the artist.
type string true The only option right now is artists.
name string true The name of the artist.

Response

If successful, we’ll return a 200 OK and the same body as getting the artist.

Reposition artists

Repositions the list of artists in the specified order.

Request

PATCH /v1/accounts/{account-id}/relationships/artists

Parameters

Name Type Required Description
type string true The only option right now is artists.
id string true The unique identifier for the artist.

Response

If successful, we’ll return a 204 No Content response.

Delete an artist

Deletes a specific artist.

Request

DELETE /v1/accounts/{account-id}/artists/{artist-id}

Parameters

None.

Response

If successful, we’ll return a 204 No Content response.

Categories

Categories represent a list of all categories in a store, used for grouping products together.

Category object

Attribute Type Description
id string The unique identifier for the category.
name string The name of the category.
permalink string The unique permalink for the category.
position string The position in which the category is arranged.

Get all categories

Get all categories for an account.

Request

GET /v1/accounts/{account-id}/categories

Parameters

None.

Get a category

Get a specific category for an account.

Request

GET /v1/accounts/{account-id}/categories/{category-id}

Parameters

None.

Create a category

Creates a new category.

Request

POST /v1/accounts/{account-id}/categories

Parameters

Name Type Required Description
type string true The only option right now is categories.
name string true The name of the category.

Response

If successful, we’ll return a 201 Created with the location of the new category in the Location header and the same body as getting the category.

Update a category

Updates a specific category’s details.

Request

PATCH /v1/accounts/{account-id}/categories/{category-id}

Parameters

Name Type Required Description
id string true The unique identifier for the category.
type string true The only option right now is categories.
name string true The name of the category.

Response

If successful, we’ll return a 200 OK and the same body as getting the category.

Reposition categories

Repositions the list of categories in the specified order.

Request

PATCH /v1/accounts/{account-id}/relationships/categories

Parameters

Name Type Required Description
type string true The only option right now is categories.
id string true The unique identifier for the category.

Response

If successful, we’ll return a 204 No Content response.

Delete a category

Deletes a specific category.

Request

DELETE /v1/accounts/{account-id}/categories/{category-id}

Parameters

None.

Response

If successful, we’ll return a 204 No Content response.

Countries

Countries represent a list of all available countries used for shipping and billing addresses.

Country object

Attribute Type Description
id string The unique 2-letter code for the country.
name string The full name of the country.

Get all countries

Get a list of all countries sorted alphabetically by name.

Request

GET /v1/countries

Parameters

None.

Discounts

Discounts represent a list of all discounts in a store.

Discount object

Attribute Type Description
id string The unique identifier for the discount.
name string The description of the discount.
code string The code customers enter to use the discount.
active_at timestamp The date the discount is active.
expires_at timestamp The date the discount expires.
requirement_type string Possible values are any_order, minimum_cart_total, or minimum_cart_quantity.
expiration_type string Possible values are never, on_date, or on_limit.
reward_type string Possible values are percent_discount, flat_rate_discount, or free_shipping.
application_type string Possible values are all, category, or product.
percent_discount integer The percentage discount amount.
flat_rate_discount decimal The flat rate discount amount.
use_limit integer The limit for how many times the discount can be used.
use_count integer The number of times the discount has been used.
minimum_cart_total decimal The minimum cart total required to use the discount.
minimum_cart_quantity integer The minimum amount of items in the cart required to use the discount.

Get all discounts

Get all discounts for an account.

Request

GET /v1/accounts/{account-id}/discounts

Parameters

Name Type Required Description
filter string false Filter discounts using status

Status example

Use status to filter discounts with a status of active or expired.

GET /v1/accounts/{account-id}/discounts?filter[status]=active

Get a discount

Get a specific discount for an account.

Request

GET /v1/accounts/{account-id}/discounts/{discount-id}

Parameters

None.

Create a discount

Creates a new discount.

Request

POST /v1/accounts/{account-id}/discounts

Parameters

Name Type Required Description
type string true The only option right now is discounts.
name string true The description of the discount.
code string true The code customers enter to use the discount.
active_at timestamp true The date the discount is active.
expires_at timestamp false The date the discount expires. Must be a date in the future. Required when expiration_type is set to on_date.
requirement_type string true Possible values are any_order, minimum_cart_total, or minimum_cart_quantity.
expiration_type string true Possible values are never, on_date, or on_limit.
reward_type string true Possible values are percent_discount, flat_rate_discount, or free_shipping.
application_type string true Possible values are all, category, or product.
percent_discount integer false The percentage discount amount. Must be less than 100. Required when reward_type is set to percent_discount.
flat_rate_discount decimal false The flat rate discount amount. Required when reward_type is set to flat_rate_discount.
use_limit integer false The limit for how many times the discount can be used. Required when expiration_type is set to on_limit.
minimum_cart_total decimal false The minimum cart total required to use the discount. Required when requirement_type is set to minimum_cart_total.
minimum_cart_quantity integer false The minimum amount of items in the cart required to use the discount. Required when requirement_type is set to minimum_cart_quantity.

The following parameters are only required when creating a discount that applies to specific categories or products - application_type will also need to be set to category or product.

Name Type Required Description
category[].type string true The only option right now is categories.
category[].id integer true The unique identifier of the category.
product[].type string true The only option right now is products.
product[].id integer true The unique identifier of the product.

Response

If successful, we’ll return a 201 Created with the location of the new discount in the Location header and the same body as getting the discount.

Update a discount

Updates a specific discount’s details.

Request

PATCH /v1/accounts/{account-id}/discounts/{discount-id}

Parameters

Name Type Required Description
type string true The only option right now is discounts.
name string true The description of the discount.
code string true The code customers enter to use the discount.
active_at timestamp false The date the discount is active.
expires_at timestamp false The date the discount expires. Must be a date in the future. Required when expiration_type is set to on_date.
requirement_type string true Possible values are any_order, minimum_cart_total, or minimum_cart_quantity.
expiration_type string true Possible values are never, on_date, or on_limit.
reward_type string true Possible values are percent_discount, flat_rate_discount, or free_shipping.
application_type string true Possible values are all, category, or product.
percent_discount integer false The percentage discount amount. Must be less than 100. Required when reward_type is set to percent_discount.
flat_rate_discount decimal false The flat rate discount amount. Required when reward_type is set to flat_rate_discount.
use_limit integer false The limit for how many times the discount can be used. Required when expiration_type is set to on_limit.
minimum_cart_total decimal false The minimum cart total required to use the discount. Required when requirement_type is set to minimum_cart_total.
minimum_cart_quantity integer false The minimum amount of items in the cart required to use the discount. Required when requirement_type is set to minimum_cart_quantity.

The following parameters are only required when updating a discount that applies to specific categories or products - application_type will also need to be set to category or product.

Name Type Required Description
category[].type string true The only option right now is categories.
category[].id integer true The unique identifier of the category.
product[].type string true The only option right now is products.
product[].id integer true The unique identifier of the product.

Response

If successful, we’ll return a 200 OK and the same body as getting the discount.

Delete a discount

Deletes a specific discount.

Request

DELETE /v1/accounts/{account-id}/discounts/{discount-id}

Parameters

None.

Response

If successful, we’ll return a 204 No Content response.

Orders

Orders represent a purchase someone has made from a store, and contains all of the information required to review the order, ship it to the buyer, and track it’s shipping and payment status.

Order object

Attribute Type Description
id string The unique identifier for the order.
item_count integer The number of items in the order.
item_total decimal The total price of all items.
discount_total decimal The total price of all discounts.
shipping_total decimal The total price of all shipping costs.
tax_total decimal The total price of all taxes.
total decimal The total price of everything.
customer_first_name string The first name of the buyer.
customer_last_name string The last name of the buyer.
customer_email string The email address of the buyer.
customer_phone_number string The phone number of the buyer.
customer_opted_in_to_marketing boolean Whether or not the buyer opted-in to marketing at checkout. Marketing apps must honor this.
customer_note string An optional note about the order. Buyer visible.
shipping_address_1 string The street address for shipping.
shipping_address_2 string An optional addition to the street address for shipping.
shipping_city string The city of the shipping address.
shipping_state string The state or province of the shipping address.
shipping_zip string The zip or postal code of the shipping address.
shipping_country_id string The unique 2-letter code for the order’s country.
shipping_country_name string The name of the order’s country.
shipping_latitude integer The latitude of the shipping address.
shipping_longitude integer The longitude of the shipping address.
shipping_status string The status of shipping the order. Possible values are shipped and unshipped.
payment_status string The status of payment for the order. Possible values are unpaid, pending, completed, failed, and invalid.
created_at timestamp When the order was created.
updated_at timestamp When the order was last updated.
completed_at timestamp When the order was placed and paid for.
currency.id string The unique 3-letter code for the order’s currency.
currency.name string The name of the order’s currency.
currency.sign string The symbol used for the order’s currency.
currency.locale string The locale associated with the order’s currency.
events[].id integer The unique identifier of the order event.
events[].message string A message describing the order event.
events[].created_at timestamp When the order event was created.
items[].id integer The unique identifier of the order item.
items[].product_name string The name of the item’s product.
items[].product_option_name string The name of the item’s product option.
items[].quantity integer The quantity of the item.
items[].price decimal The price of the item.
items[].total decimal The total price of the item, quantity multiplied by price.
items[].image_url string The customizable URL of the product image.
items[].product_id string The unique identifier of the product.
items[].product_option_id string The unique identifier of the product option.
transactions[].id integer The unique identifier of the order transaction.
transactions[].label string A message describing the transaction.
transactions[].amount decimal The total price of the transaction.
transactions[].processor string The name of the payment processor. Possible values are cash, paypal_standard, paypal_express, and stripe.
transactions[].processor_id string The payment processor’s transaction ID.
transactions[].processor_url string The URL to view the transaction on the processor’s website.
transactions[].currency.id integer The unique 3-letter code for the transaction’s currency.
transactions[].currency.name string The name of the transaction’s currency.
transactions[].currency.sign string The symbol used for the transaction’s currency.
transactions[].currency.locale string The locale associated with the transaction’s currency.
adjustments[].id integer The unique identifier of the order adjustment.
adjustments[].amount decimal The price of the adjustment.
adjustments[].label string A message describing the adjustment.

Get all orders

Get all orders for an account.

Request

GET /v1/accounts/{account-id}/orders

Parameters

Name Type Required Description
search string false Search orders that match the customer name (customer_first_name + customer_last_name), customer_email, and id attributes.
filter string false Filter orders using the shipping_status, completed_at_from, completed_at_to, updated_at_from and updated_at_to.
sort string false Sort orders using the specified attribute, in ascending order by default. Prefix the value with - to specify descending order. Allowed values are completed_at, created_at, and updated_at.

Search example

Get all orders that match example@example.com.

GET /v1/accounts/{account-id}/orders?search=example@example.com

Filter examples

Use shipping_status to filter orders using shipped or unshipped.

GET /v1/accounts/{account-id}/orders?filter[shipping_status]=shipped

Use completed_at_from to filter orders based on their completion date (placed and paid for). This is the starting range of the filter.

GET /v1/accounts/{account-id}/orders?filter[completed_at_from]=2024-02-1

Use completed_at_to to filter orders based on their completion date (placed and paid for). This is the end range of the filter and if omitted the API always assumes now/today.

GET /v1/accounts/{account-id}/orders?filter[completed_at_to]=2024-02-28

Use completed_at_from and completed_at_to in combination to filter a specific order completed date range.

GET /v1/accounts/{account-id}/orders?filter[completed_at_from]=2024-02-01&filter[completed_at_to]=2024-02-28

Sort example

Get all orders, sorted by the time they were created, in descending order.

GET /v1/accounts/{account-id}/orders?sort=-created_at

Get an order

Get a specific order for an account.

Request

GET /v1/accounts/{account-id}/orders/{order-id}

Parameters

None.

Update an order

Updates a specific order’s details.

Request

PATCH /v1/accounts/{account-id}/orders/{order-id}

Parameters

Name Type Required Description
id string true The unique identifier for the order.
type string true The only option right now is orders.
customer_first_name string false The first name of the buyer.
customer_last_name string false The last name of the buyer.
customer_email string false The email address of the buyer.
customer_phone_number string false The phone number of the buyer.
customer_note string false A note about the order. Visible to the buyer.
shipping_address_1 string false The street address for shipping.
shipping_address_2 string false An optional addition to the street address for shipping.
shipping_city string false The city of the shipping address.
shipping_state string false The state or province of the shipping address.
shipping_zip string false The zip or postal code of the shipping address.
shipping_country_id string false The unique 2-letter code for the order’s country.
shipping_status string false The status of shipping the order. Possible values are shipped or unshipped. An order cannot be set to shipped if it has at least one shipment and any unshipped line items. The shipping_status value will just be ignored.

Response

If successful, we’ll return a 200 OK and the same body as getting the order.

Pages

Pages allows you to interact with pages in a user’s store.

This can be used to create powerful experiences that simplify your app’s integration into a Big Cartel shop. For example, after your oauth app is authorized for a shop, you could automatically create a page that includes the necessary javascript to embed your new feature without the user needing to copy and paste code.

Page object

Attribute Type Description
id string The unique identifier for the page.
path string The unique path for the page.
category string The category type of the page. Pages that are part of a theme are Theme and custom pages are Custom.
content string The content of the custom page, truncated to max of 2048 characters. This is only returned for custom pages.
use_layout boolean Whether the custom page inherits the layout from the theme.

Get all pages

Get all pages for a store. category attribute indicates whether a page is a part of a store’s theme or a custom page created by the seller.

Request

GET /v1/accounts/{account-id}/pages

Parameters

None.

Get a page

Get a pages for a store. category attribute indicates whether a page is a part of a store’s theme or a custom page created by the seller.

Request

GET /v1/accounts/{account-id}/pages/{page_id}

Parameters

None.

Create a page

Creates a new custom page.

New pages are always in draft. To appear in a shop publicly, the seller must publish their shop from their Big Cartel shop designer.

Request

POST /v1/accounts/{account-id}/pages

Parameters

Name Type Required Description
type string true The only option right now is pages.
name string true The name of the page. The path for the page is automatically derived from the name (e.g. My Blog -> /my-blog).
content string false The page content.
use_layout string false Whether the page should inherit from the store’s theme. By default this is true.

Response

If successful, we’ll return 200 status code with a response confirming the page attributes.

Update a page

Updates a specific page. Only custom pages can be updated.

Request

PATCH /v1/accounts/{account-id}/pages/{page-id}

Parameters

Name Type Required Description
type string true The only option right now is pages.
name string true The name of the page. The path for the page is automatically derived from the name (e.g. My Blog -> /my-blog).
content string false The page content. If not provided the existing content remains untouched.
use_layout string false Whether the page should inherit from the store’s theme. By default this is true.

Response

If successful, we’ll return a 200 OK and the same body as get a page.

Pages best practices

Here are the guidelines, best practices, and considerations when using our Pages API:

  1. Design and build for the best user experience: New custom pages created through the API are always initially created in draft, it requires users to do a publish in their Big Cartel shop designer for the pages to be publicly visible in their store. Build the correct user experience and messaging which communicates this information to the user from your app so there is a seamless experience from your app to Big Cartel
  2. Consider using the Pages API: The most common case for your integration is going to be to create a new custom page when you need custom code embeds in a user’s store. However, if you want to build a robust experience that allows a user to amend an existing page, use our Pages API to fetch page information to present the user the option to use an existing page, then use the Page Update API appropriately.
  3. Clearly communicate destructive actions: Updating an existing page can be a destructive action since you can overwrite all the content. Always provide an option to amend your content to the existing page without forcing a complete replacement. If you do want to overwrite a page’s content in entirety, clearly communicate this to the user so they are sufficiently aware of the risks.
  4. Add code comments: When creating pages with custom content, ensure you add comments to clarify ownership and purpose of the code. e.g. <!-- Image Gallery widget added by Foo -->.
  5. Handle Possible Conflicts with Embeddable Scripts: If you are using our Embeddable Scripts, ensure you handle potential conflicts with any scripts you add to a custom page.
  6. Utilize Built-in JavaScript Variables: We provide many useful variables for use within your custom page code, which can save you time. For instance, use {{store.id}} to get a store’s ID as a unique identifier, such as in the example: <script async src="https://app.com/script/{{ store.id }}.js"></script>.
  7. Minimize External Dependencies: Only load libraries and external dependencies that are essential for your app. This reduces load times and decreases potential conflicts with other scripts.
  8. Do Not Assume Ownership of Pages: Custom pages can be edited by the user and other apps outside of your workflow, so you cannot assume a page remains unchanged.
  9. Comprehensive Testing with Clear Fallbacks: Thoroughly test your integrations that involve creating, updating, or retrieving custom pages. Include fallback mechanisms to ensure the shop remains functional and provides a great user experience.

Products

Products represent a list of all products in a store.

Product object

Attribute Type Description
id string The unique identifier for the product.
name string The name of the product.
permalink string The unique permalink for the product.
status string The status of the product. Possible values are active, hidden, sold_out, or coming_soon.
description string The description of the product.
created_at timestamp When the product was created.
updated_at timestamp When the product was last updated.
default_price decimal The default price of the product.
on_sale boolean Whether or not the product is on sale.
position integer The position in which the product is arranged.
url string The full URL to access the product.
primary_image_url string The primary image URL of the product.
options[].id integer The unique identifier for the product option.
options[].name string The name of the product option.
options[].price decimal The price of the product option.
options[].quantity integer The quantity in stock of the product option.
options[].sold integer The number of times the product option has been sold.
artists[].id integer The unique identifier for the artist.
artists[].name string The name of the artist.
artists[].permalink string The unique permalink for the artist.
artists[].position string The position in which the artist is arranged.
categories[].id integer The unique identifier for the category.
categories[].name string The name of the category.
categories[].permalink string The unique permalink for the category.
categories[].position string The position in which the category is arranged.
shipping_options[].id integer The unique identifier for the shipping option.
shipping_options[].price_alone decimal The shipped alone amount for the shipping area.
shipping_options[].price_with_others decimal The shipped with others amount for the shipping area.
shipping_options[].country.id string The unique 2-letter code for the product shipping area’s country.
images[].id integer The unique identifier for product image.
images[].url string The customizable URL of the product image.

Get all products

Get all products for an account.

Request

GET /v1/accounts/{account-id}/products

Parameters

Name Type Required Description
filter string false Filter products using status, category_id, artist_id, quantity_gte, or quantity_lte. Category and Artist IDs attribute allows a comma separated list of values.
search string false Search products by name. Searches are case insensitive and by default are substring searches. Use search_type to search with exact match.
search_type string false Specifies the type of search using either substring or exact. By default searches are always substring searches.

Search examples

Return all products with a name that matches substring case-insensitive search on “foo”.

GET /v1/accounts/{account-id}/products?search=foo

Return all products with a name that matches exact case-insensitive search on “foo”.

GET /v1/accounts/{account-id}/products?search=foo&search_type=exact

Filter examples

Use status to filter products using active, coming_soon, hidden, or sold_out.

GET /v1/accounts/{account-id}/products?filter[status]=sold_out

Use category_id to filter products by category.

GET /v1/accounts/{account-id}/products?filter[category_id]=1,2,3

Use artist_id to filter products by artist.

GET /v1/accounts/{account-id}/products?filter[artist_id]=1,2,3

Use quantity_gte to filter products by inventory quantity >= 0

GET /v1/accounts/{account-id}/products?filter[quantity_gte]=1

Use quantity_gte and quantity_lte to filter products with inventory quantities 5-100 (inclusive).

GET /v1/accounts/{account-id}/products?filter[quantity_gte]=5&filter[quantity_lte]=100

Get a product

Get a specific product for an account.

Request

GET /v1/accounts/{account-id}/products/{product-id}

Parameters

None.

Update a product

Updates a specific product.

Note: To reposition products please see Repositioning Products

Request

PATCH /v1/accounts/{account-id}/products/{product-id}

Parameters

Name Type Required Description
id string true The unique identifier for the product.
type string true The only option right now is products.
name string false The name of the product.
description string false The description of the product.
status string false The status of the product. Possible values are active, sold_out, hidden and coming_soon.
on_sale boolean false Whether or not the product is on sale.
permalink string false The unique permalink for the product.

Response

If successful, we’ll return a 200 OK and the same body as getting the product.

Reposition products

Repositions the list of products in the specified order.

Request

PATCH /v1/accounts/{account-id}/relationships/products

Parameters

Name Type Required Description
type string true The only option right now is products.
id string true The unique identifier for the product.

Response

If successful, we’ll return a 204 No Content response.

Shipments

Shipments represent a shipment a store owner has created for an order, and contains tracking information as well as what items from an order have been shipped.

Shipment object

Attribute Type Description
id integer The unique identifier for the order shipment.
carrier string The name of the shipping carrier.
tracking_number string The tracking number of the shipment.
tracking_url string The URL of the tracking status on the carrier’s website.
last_notified_at timestamp The date the customer was notified about the shipment.
created_at timestamp The date the order shipment was created.
updated_at timestamp The date the order shipment was last updated.
items[].id integer The unique identifier of the order item.
items[].quantity integer The quantity of the item that has been shipped.
items[].order_item.id string The unique identifier of the order item.

Get all shipments

Get all shipments for an order.

Request

GET /v1/accounts/{account-id}/orders/{order-id}/shipments

Parameters

None.

Get a shipment

Get a specific shipment for an order.

Request

GET /v1/accounts/{account-id}/orders/{order-id}/shipments/{shipment-id}

Parameters

None.

Create a shipment

Creates a new shipment.

Request

POST /v1/accounts/{account-id}/orders/{order-id}/shipments

Parameters

Name Type Required Description
type string required The only option right now is shipments.
carrier string false The name of the shipping carrier. (USPS, UPS, Fedex, etc).
tracking_number string false The tracking number of the shipment.
tracking_url string false The URL of the tracking status on the carrier’s website.
notify_customer boolean true Whether the customer should get a notification email about the shipment.
items[].quantity integer true The number of items included in this shipment.
items[].order_line_item_id integer true The unique identifier of the order item.

Response

If successful, we’ll return a 201 Created with the location of the new shipment in the Location header and the same body as getting the shipment.

Update a shipment

Updates a specific shipment’s details.

Request

PATCH /v1/accounts/{account-id}/orders/{order-id}/shipments/{shipment-id}

Parameters

Name Type Required Description
id integer required The id of the shipment.
type string required The only option right now is shipment.
carrier string false The name of the shipping carrier. (USPS, UPS, Fedex, etc).
tracking_number string false The tracking number of the shipment.
tracking_url string false The URL of the tracking status on the carrier’s website.
notify_customer boolean true Whether the customer should get a notification email about the shipment.
items[].quantity integer true The number of items included in this shipment.
items[].order_line_item_id integer true The unique identifier of the order item.

Response

If successful, we’ll return a 200 OK and the same body as getting the shipment.

Delete a shipment

Deletes a specific shipment.

Request

DELETE /v1/accounts/{account-id}/orders/{order-id}/shipments/{shipment-id}

Parameters

None.

Response

If successful, we’ll return a 204 No Content response.

Intro to webhooks

Our API makes use of webhooks to notify your application of important changes that have occurred outside of your application for accounts you’ve connected to. You’ll also receive webhooks for changes you make with the API, but you shouldn’t need those since all API requests you make will receive a synchronous response.

Webhooks are only available when building an application that uses OAuth for authentication. Want to build an app? Apply for now.

Types of webhooks

By default, all apps will have webhooks enabled for all account.* webhooks. The other webhooks for order, product and shipment are approved on a per-app basis. During the application process you’ll be able to request access to the webhooks you need.

Type Payload Description
account.deauthorized id of the account Sent when an account has been closed or the owner has revoked access to your application.
account.updated Sent when an account is updated.
account.plan.downgraded Sent when an account is downgraded.
account.plan.upgraded Sent when an account is upgraded.
order.created order Sent when a new order is placed.
order.updated order Sent when an order changes.
product.created product Sent when a new product is created.
product.updated product Sent when a product is updated, either by the account or when it’s part of a new order.
product.deleted product Sent when a product is deleted. This payload will only include the product id instead of the full product object.
shipment.created shipment Sent when a new shipment is created.
shipment.updated shipment Sent when a shipment is updated
shipment.deleted shipment Sent when a shipment is deleted. This payload will only include the shipment id instead of the full shipment object.

Responding to webhooks

To acknowledge you received the webhook without any problem, your server should return a 2xx HTTP status code. Any response code other than that will tell Big Cartel that you didn’t receive the webhook, and we’ll continue to retry it at degrading intervals for the next 7 days.

Verifying webhooks

In order to ensure the webhook you received is legit, we suggest you verify its signature. To do that, create an HMAC signed using the SHA256 hash algorithm, using your application’s client_secret and the body of the webhook request as keys, and make sure it matches the webhook’s X-Webhook-Signature header.

Receiving webhooks

Webhooks will be sent as an HTTP POST request to the webhook_url for your application in the following JSON format:

Marketing Apps

If you’d like to integrate an email marketing service with Big Cartel, you must allow buyers to opt-in to this marketing, as stated in Section 4e of our API License Agreement.

To help with this, we can configure your app so that any shops using it will present buyers with a “Subscribe to our email list” checkbox in the checkout process. From there, you should use the customer_opted_in_to_marketing order attribute to opt them in or out.

Terms of Service

Before you start making API calls, please make sure to read the full API License Agreement so that you understand the rules and guidelines you are agreeing to by using the API.

Changelog

This changelog represents the evolution of our V1 API. All changes are automatic and fully backwards-compatible, unless stated otherwise.

2024-05-16

  • Added support for Embeddable Scripts that allows apps to automatically add client scripts to seller’s stores eliminating the need for manually copyiang and pasting Javascript to complete setup of your app.
  • Revised documentation for clarity on our requirements and best practices for apps

2024-05-06

  • Added new Pages API to get information about a store’s pages. At this time, only Get All Pages is supported.

2024-04-30

  • Get All Products now supports filtering based on inventory quantity of product (or its variants) using the filter parameter with the quantity_gte and quantity_lte params.
  • Order Line Items now include product_id (and product_option_id when applicable) as attributes

2024-04-29

  • Get All Orders now supports filtering based on date range of updated_at date using the filter parameter.

2024-04-19

  • Get All Orders now supports filtering based on date range of completed_at date using the filter parameter.

2024-04-15

  • Updated order object to contain shipping_country_id and shipping_country_name.

2023-12-06

  • Get Account now includes time_zone, first_name and last_name

2023-08-09

  • Added more examples for Update Discount
  • Corrected description of name property on Discounts—it is the description of the discount
  • Corrected active_at property as not required for Update Discount

2019-07-11

2017-09-18

  • The OAuth flow has been updated to automatically redirect users back to your application’s redirect_uri if their account is already connected to your application, instead of being prompted to allow or deny access.

2017-04-24

2016-03-11

  • The Account object now includes inventory_enabled and artists_enabled.

2016-02-29

  • The Product object now includes the url and primary_image_url attributes.
Heads up! You're using an unsupported older browser. Click to learn how to update it.