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.
Developer Newsletter
Stay in the loop! Join our Developer Newsletter and follow our API Changelog to stay current on new features, improvements, and bug fixes!
Are you a developer and have a question? Contact our developer support at [email protected]
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.
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.
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.
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.
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.
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.
Handle the deauthorization: When an account deauthorizes your app you’ll be informed via the account.deauthorizedwebhook. 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.
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.
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.
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).
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.
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:
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.
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.
Test Extensively: Conduct thorough testing, including unit, integration, and stress tests, to ensure your app handles real-world scenarios gracefully.
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.
Configure it with your client_id, client_secret, and redirect_uri.
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.
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 and code 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 inclusion and scope
Embeddable scripts are included on all pages of an account’s shop, except for checkout. Checkout is a protected area that are not open to app partner’s to include scripts.
If you require access to order information, including abandoned carts, you would use APIs like Orders and Carts or more commonly, our webhooks.
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. If an embedded script relies on a script variable and it is not set for an account, the embedded script will not be included in a store.
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 OKstatus 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:
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. For more complex integrations, you can have your base scripts loaded, then dynamically load in additionally scripts at run time depending on account and context.
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.
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>.
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>. Additionally, you can use page.permalink (or regular old javascript) to target behavior only on some pages.
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.
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.
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.
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.
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.
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.
If successful, we’ll return a 204 No Content response.
Carts
Carts represent a list of abandoned carts in a store. For a cart to be abandoned it must not have a successful checkout, have an email address associated and have at least one in stock item.
The API returns abandoned carts from the last 7 days at most.
The Carts API is limited to shops on our Diamond plan.
Cart object
Attribute
Type
Description
id
string
The unique identifier/token for the cart.
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_note
string
An optional note about the order from the customer.
customer_opted_in_to_marketing
boolean
Whether or not the buyer opted-in to marketing at checkout. Marketing apps must honor this for marketing emails.
customer_note
string
An optional note about the order. Buyer visible.
cart_url
string
The URL of the cart to resume checkout. If checkout is completed, it will redirect to the order receipt.
The list of abandoned carts is limited to a maximum lookback window of 7 days.
Request
GET /v1/accounts/{account-id}/carts
Parameters
Name
Type
Required
Description
filter
string
false
Filter orders using created_at_from, created_at_to, updated_at_from and updated_at_to.
Filter examples
Use updated_at_from to filter abandoned carts based on their last updated date. This is the starting range of the filter. The earliest date you can specify is 7 days from the today. If you specify a date earlier than this, it will default to 7 days ago.
GET /v1/accounts/{account-id}/carts?filter[created_at_from]=2024-07-1
Use created_at_to to filter abandoned carts based on their creation date. This is the end range of the filter and if omitted the API always assumes now/today.
GET /v1/accounts/{account-id}/carts?filter[creatad_at_to]=2024-07-05
Use updated_at_from and updated_at_to in combination to filter abandoned carts for that date range.
GET /v1/accounts/{account-id}/carts?filter[created_at_from]=2024-07-01&filter[created_at_to]=2024-07-05
Get an abandoned cart
Get a specific abandoned cart for an account.
Request
GET /v1/accounts/{account-id}/carts/{cart-id}
Parameters
None.
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.
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.
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.
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 from the customer.
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.
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.
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.
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 16,384 characters. This is only returned for custom pages.
is_published
boolean
Whether a custom page is published and publicly visible in a shop. This attribute is only applicable to 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.
To get content for a custom page, or the published state, you need to call the Get a page for the page.
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.
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:
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. Use the is_draft attribute to determine whether pages are in draft. Build the appropriate user experience around this and messaging which communicates this information to the user from your app so there is a seamless experience from your app to Big Cartel.
Use the Pages API to build experiences in your app: 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.
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.
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 -->.
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.
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>.
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.
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.
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.
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}
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.
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.
Some types of webhooks are restricted to sellers with paid plans.
Types of webhooks
By default, all apps will have webhooks enabled for all account.* webhooks. The other webhooks for order, cart, 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.
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-09-05
Pages now supports a new attribute is_published that indicates whether a custom page is published in an account’s store.
2024-08-08
Added new Carts API to get information about abandoned carts.
2024-07-20
Added Get a page to get details about a theme or custom page
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.
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-24
Get All Discounts and Get All Products now supports sorting on most fields, in addition to supporting the existing filtering based on status.
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.